/*
 * Copyright (c) 2006, 2016, 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.
/** * 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.
/** * 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.
/** * Icon image. */
private Image image;
Width of icon image. Being set in constructor.
/** * Width of icon image. Being set in constructor. */
private final int width;
Height of icon image. Being set in constructor.
/** * Height of icon image. Being set in constructor. */
private final int height;
Width of scaled icon image. Can be set in setScaledDimension.
/** * Width of scaled icon image. Can be set in setScaledDimension. */
private int scaledWidth;
Height of scaled icon image. Can be set in setScaledDimension.
/** * Height of scaled icon image. Can be set in setScaledDimension. */
private int scaledHeight;
Length of raw data. Being set in constructor / setScaledDimension.
/** * 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; } }