| /* | |
| * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. Oracle designates this | |
| * particular file as subject to the "Classpath" exception as provided | |
| * by Oracle in the LICENSE file that accompanied this code. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| package sun.awt; | |
| import java.awt.*; | |
| import java.awt.color.*; | |
| import java.awt.geom.AffineTransform; | |
| import java.awt.image.*; | |
| import sun.awt.image.ToolkitImage; | |
| import sun.awt.image.ImageRepresentation; | |
| import java.util.Arrays; | |
| import sun.java2d.pipe.Region; | |
| public class IconInfo { | |
| /** | |
| * Representation of image as an int array. | |
| * It's used on platforms where icon data | |
| * is expected to be in 32-bit format. | |
| */ | |
| private int[] intIconData; | |
| /** | |
| * Representation of image as an long array. | |
| * It's used on platforms where icon data | |
| * is expected to be in 64-bit format. | |
| */ | |
| private long[] longIconData; | |
| /** | |
| * Icon image. | |
| */ | |
| private Image image; | |
| /** | |
| * Width of icon image. Being set in constructor. | |
| */ | |
| private final int width; | |
| /** | |
| * Height of icon image. Being set in constructor. | |
| */ | |
| private final int height; | |
| /** | |
| * Width of scaled icon image. Can be set in setScaledDimension. | |
| */ | |
| private int scaledWidth; | |
| /** | |
| * Height of scaled icon image. Can be set in setScaledDimension. | |
| */ | |
| private int scaledHeight; | |
| /** | |
| * Length of raw data. Being set in constructor / setScaledDimension. | |
| */ | |
| private int rawLength; | |
| public IconInfo(int[] intIconData) { | |
| this.intIconData = | |
| (null == intIconData) ? null : Arrays.copyOf(intIconData, intIconData.length); | |
| this.width = intIconData[0]; | |
| this.height = intIconData[1]; | |
| this.scaledWidth = width; | |
| this.scaledHeight = height; | |
| this.rawLength = width * height + 2; | |
| } | |
| public IconInfo(long[] longIconData) { | |
| this.longIconData = | |
| (null == longIconData) ? null : Arrays.copyOf(longIconData, longIconData.length); | |
| this.width = (int)longIconData[0]; | |
| this.height = (int)longIconData[1]; | |
| this.scaledWidth = width; | |
| this.scaledHeight = height; | |
| this.rawLength = width * height + 2; | |
| } | |
| public IconInfo(Image image) { | |
| this.image = image; | |
| if (image instanceof ToolkitImage) { | |
| ImageRepresentation ir = ((ToolkitImage)image).getImageRep(); | |
| ir.reconstruct(ImageObserver.ALLBITS); | |
| this.width = ir.getWidth(); | |
| this.height = ir.getHeight(); | |
| } else { | |
| this.width = image.getWidth(null); | |
| this.height = image.getHeight(null); | |
| } | |
| this.scaledWidth = width; | |
| this.scaledHeight = height; | |
| this.rawLength = getScaledRawLength(width, height); | |
| } | |
| /* | |
| * It sets size of scaled icon. | |
| */ | |
| public void setScaledSize(int width, int height) { | |
| this.scaledWidth = width; | |
| this.scaledHeight = height; | |
| this.rawLength = getScaledRawLength(width, height); | |
| } | |
| /* | |
| * returns scaled raw length. | |
| */ | |
| private int getScaledRawLength(int w, int h) { | |
| int[] scaledWidthAndHeight = getScaledWidthAndHeight(w, h); | |
| return scaledWidthAndHeight[0] * scaledWidthAndHeight[1] + 2; | |
| } | |
| /* | |
| * returns the scaled width and height. | |
| */ | |
| private static int[] getScaledWidthAndHeight(int width, int height) { | |
| AffineTransform tx = GraphicsEnvironment.getLocalGraphicsEnvironment(). | |
| getDefaultScreenDevice().getDefaultConfiguration(). | |
| getDefaultTransform(); | |
| int w = Region.clipScale(width, tx.getScaleX()); | |
| int h = Region.clipScale(height, tx.getScaleY()); | |
| return new int[]{w, h}; | |
| } | |
| public boolean isValid() { | |
| return (width > 0 && height > 0); | |
| } | |
| public int getWidth() { | |
| return width; | |
| } | |
| public int getHeight() { | |
| return height; | |
| } | |
| public String toString() { | |
| return "IconInfo[w=" + width + ",h=" + height + ",sw=" + scaledWidth + ",sh=" + scaledHeight + "]"; | |
| } | |
| public int getRawLength() { | |
| return rawLength; | |
| } | |
| public int[] getIntData() { | |
| if (this.intIconData == null) { | |
| if (this.longIconData != null) { | |
| this.intIconData = longArrayToIntArray(longIconData); | |
| } else if (this.image != null) { | |
| this.intIconData = imageToIntArray(this.image, scaledWidth, scaledHeight); | |
| } | |
| } | |
| return this.intIconData; | |
| } | |
| public long[] getLongData() { | |
| if (this.longIconData == null) { | |
| if (this.intIconData != null) { | |
| this.longIconData = intArrayToLongArray(this.intIconData); | |
| } else if (this.image != null) { | |
| int[] intIconData = imageToIntArray(this.image, scaledWidth, scaledHeight); | |
| this.longIconData = intArrayToLongArray(intIconData); | |
| } | |
| } | |
| return this.longIconData; | |
| } | |
| public Image getImage() { | |
| if (this.image == null) { | |
| if (this.intIconData != null) { | |
| this.image = intArrayToImage(this.intIconData); | |
| } else if (this.longIconData != null) { | |
| int[] intIconData = longArrayToIntArray(this.longIconData); | |
| this.image = intArrayToImage(intIconData); | |
| } | |
| } | |
| return this.image; | |
| } | |
| private static int[] longArrayToIntArray(long[] longData) { | |
| int[] intData = new int[longData.length]; | |
| for (int i = 0; i < longData.length; i++) { | |
| // Such a conversion is valid since the | |
| // original data (see | |
| // make/sun/xawt/ToBin.java) were ints | |
| intData[i] = (int)longData[i]; | |
| } | |
| return intData; | |
| } | |
| private static long[] intArrayToLongArray(int[] intData) { | |
| long[] longData = new long[intData.length]; | |
| for (int i = 0; i < intData.length; i++) { | |
| longData[i] = intData[i]; | |
| } | |
| return longData; | |
| } | |
| static Image intArrayToImage(int[] raw) { | |
| ColorModel cm = | |
| new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 32, | |
| 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, | |
| false, DataBuffer.TYPE_INT); | |
| DataBuffer buffer = new DataBufferInt(raw, raw.length-2, 2); | |
| WritableRaster raster = | |
| Raster.createPackedRaster(buffer, raw[0], raw[1], | |
| raw[0], | |
| new int[] {0x00ff0000, 0x0000ff00, | |
| 0x000000ff, 0xff000000}, | |
| null); | |
| BufferedImage im = new BufferedImage(cm, raster, false, null); | |
| return im; | |
| } | |
| /* | |
| * Returns array of integers which holds data for the image. | |
| * It scales the image if necessary. | |
| */ | |
| static int[] imageToIntArray(Image image, int width, int height) { | |
| if (width <= 0 || height <= 0) { | |
| return null; | |
| } | |
| ColorModel cm = | |
| new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 32, | |
| 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, | |
| false, DataBuffer.TYPE_INT); | |
| int[] scaledWidthAndHeight = getScaledWidthAndHeight(width, height); | |
| width = scaledWidthAndHeight[0]; | |
| height = scaledWidthAndHeight[1]; | |
| DataBufferInt buffer = new DataBufferInt(width * height); | |
| WritableRaster raster = | |
| Raster.createPackedRaster(buffer, width, height, | |
| width, | |
| new int[] {0x00ff0000, 0x0000ff00, | |
| 0x000000ff, 0xff000000}, | |
| null); | |
| BufferedImage im = new BufferedImage(cm, raster, false, null); | |
| Graphics g = im.getGraphics(); | |
| g.drawImage(image, 0, 0, width, height, null); | |
| g.dispose(); | |
| int[] data = buffer.getData(); | |
| int[] raw = new int[width * height + 2]; | |
| raw[0] = width; | |
| raw[1] = height; | |
| System.arraycopy(data, 0, raw, 2, width * height); | |
| return raw; | |
| } | |
| } |