jdk/src/java.desktop/share/classes/sun/awt/IconInfo.java
changeset 25859 3317bb8137f4
parent 22584 eed64ee05369
child 40141 a7297a9dd5fa
equal deleted inserted replaced
25858:836adbf7a2cd 25859:3317bb8137f4
       
     1 /*
       
     2  * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 package sun.awt;
       
    26 import java.awt.*;
       
    27 import java.awt.color.*;
       
    28 import java.awt.image.*;
       
    29 import sun.awt.image.ToolkitImage;
       
    30 import sun.awt.image.ImageRepresentation;
       
    31 import java.util.Arrays;
       
    32 
       
    33 public class IconInfo {
       
    34     /**
       
    35      * Representation of image as an int array.
       
    36      * It's used on platforms where icon data
       
    37      * is expected to be in 32-bit format.
       
    38      */
       
    39     private int[] intIconData;
       
    40     /**
       
    41      * Representation of image as an long array.
       
    42      * It's used on platforms where icon data
       
    43      * is expected to be in 64-bit format.
       
    44      */
       
    45     private long[] longIconData;
       
    46     /**
       
    47      * Icon image.
       
    48      */
       
    49     private Image image;
       
    50     /**
       
    51      * Width of icon image. Being set in constructor.
       
    52      */
       
    53     private final int width;
       
    54     /**
       
    55      * Height of icon image. Being set in constructor.
       
    56      */
       
    57     private final int height;
       
    58     /**
       
    59      * Width of scaled icon image. Can be set in setScaledDimension.
       
    60      */
       
    61     private int scaledWidth;
       
    62     /**
       
    63      * Height of scaled icon image. Can be set in setScaledDimension.
       
    64      */
       
    65     private int scaledHeight;
       
    66     /**
       
    67      * Length of raw data. Being set in constructor / setScaledDimension.
       
    68      */
       
    69     private int rawLength;
       
    70 
       
    71     public IconInfo(int[] intIconData) {
       
    72         this.intIconData =
       
    73             (null == intIconData) ? null : Arrays.copyOf(intIconData, intIconData.length);
       
    74         this.width = intIconData[0];
       
    75         this.height = intIconData[1];
       
    76         this.scaledWidth = width;
       
    77         this.scaledHeight = height;
       
    78         this.rawLength = width * height + 2;
       
    79     }
       
    80 
       
    81     public IconInfo(long[] longIconData) {
       
    82         this.longIconData =
       
    83         (null == longIconData) ? null : Arrays.copyOf(longIconData, longIconData.length);
       
    84         this.width = (int)longIconData[0];
       
    85         this.height = (int)longIconData[1];
       
    86         this.scaledWidth = width;
       
    87         this.scaledHeight = height;
       
    88         this.rawLength = width * height + 2;
       
    89     }
       
    90 
       
    91     public IconInfo(Image image) {
       
    92         this.image = image;
       
    93         if (image instanceof ToolkitImage) {
       
    94             ImageRepresentation ir = ((ToolkitImage)image).getImageRep();
       
    95             ir.reconstruct(ImageObserver.ALLBITS);
       
    96             this.width = ir.getWidth();
       
    97             this.height = ir.getHeight();
       
    98         } else {
       
    99             this.width = image.getWidth(null);
       
   100             this.height = image.getHeight(null);
       
   101         }
       
   102         this.scaledWidth = width;
       
   103         this.scaledHeight = height;
       
   104         this.rawLength = width * height + 2;
       
   105     }
       
   106 
       
   107     /*
       
   108      * It sets size of scaled icon.
       
   109      */
       
   110     public void setScaledSize(int width, int height) {
       
   111         this.scaledWidth = width;
       
   112         this.scaledHeight = height;
       
   113         this.rawLength = width * height + 2;
       
   114     }
       
   115 
       
   116     public boolean isValid() {
       
   117         return (width > 0 && height > 0);
       
   118     }
       
   119 
       
   120     public int getWidth() {
       
   121         return width;
       
   122     }
       
   123 
       
   124     public int getHeight() {
       
   125         return height;
       
   126     }
       
   127 
       
   128     public String toString() {
       
   129         return "IconInfo[w=" + width + ",h=" + height + ",sw=" + scaledWidth + ",sh=" + scaledHeight + "]";
       
   130     }
       
   131 
       
   132     public int getRawLength() {
       
   133         return rawLength;
       
   134     }
       
   135 
       
   136     public int[] getIntData() {
       
   137         if (this.intIconData == null) {
       
   138             if (this.longIconData != null) {
       
   139                 this.intIconData = longArrayToIntArray(longIconData);
       
   140             } else if (this.image != null) {
       
   141                 this.intIconData = imageToIntArray(this.image, scaledWidth, scaledHeight);
       
   142             }
       
   143         }
       
   144         return this.intIconData;
       
   145     }
       
   146 
       
   147     public long[] getLongData() {
       
   148         if (this.longIconData == null) {
       
   149             if (this.intIconData != null) {
       
   150                 this.longIconData = intArrayToLongArray(this.intIconData);
       
   151             } else if (this.image != null) {
       
   152                 int[] intIconData = imageToIntArray(this.image, scaledWidth, scaledHeight);
       
   153                 this.longIconData = intArrayToLongArray(intIconData);
       
   154             }
       
   155         }
       
   156         return this.longIconData;
       
   157     }
       
   158 
       
   159     public Image getImage() {
       
   160         if (this.image == null) {
       
   161             if (this.intIconData != null) {
       
   162                 this.image = intArrayToImage(this.intIconData);
       
   163             } else if (this.longIconData != null) {
       
   164                 int[] intIconData = longArrayToIntArray(this.longIconData);
       
   165                 this.image = intArrayToImage(intIconData);
       
   166             }
       
   167         }
       
   168         return this.image;
       
   169     }
       
   170 
       
   171     private static int[] longArrayToIntArray(long[] longData) {
       
   172         int[] intData = new int[longData.length];
       
   173         for (int i = 0; i < longData.length; i++) {
       
   174             // Such a conversion is valid since the
       
   175             // original data (see
       
   176             // make/sun/xawt/ToBin.java) were ints
       
   177             intData[i] = (int)longData[i];
       
   178         }
       
   179         return intData;
       
   180     }
       
   181 
       
   182     private static long[] intArrayToLongArray(int[] intData) {
       
   183         long[] longData = new long[intData.length];
       
   184         for (int i = 0; i < intData.length; i++) {
       
   185             longData[i] = intData[i];
       
   186         }
       
   187         return longData;
       
   188     }
       
   189 
       
   190     static Image intArrayToImage(int[] raw) {
       
   191         ColorModel cm =
       
   192             new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 32,
       
   193                                  0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000,
       
   194                                  false, DataBuffer.TYPE_INT);
       
   195         DataBuffer buffer = new DataBufferInt(raw, raw.length-2, 2);
       
   196         WritableRaster raster =
       
   197             Raster.createPackedRaster(buffer, raw[0], raw[1],
       
   198                                       raw[0],
       
   199                                       new int[] {0x00ff0000, 0x0000ff00,
       
   200                                                  0x000000ff, 0xff000000},
       
   201                                       null);
       
   202         BufferedImage im = new BufferedImage(cm, raster, false, null);
       
   203         return im;
       
   204     }
       
   205 
       
   206     /*
       
   207      * Returns array of integers which holds data for the image.
       
   208      * It scales the image if necessary.
       
   209      */
       
   210     static int[] imageToIntArray(Image image, int width, int height) {
       
   211         if (width <= 0 || height <= 0) {
       
   212             return null;
       
   213         }
       
   214         ColorModel cm =
       
   215             new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 32,
       
   216                                  0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000,
       
   217                                  false, DataBuffer.TYPE_INT);
       
   218         DataBufferInt buffer = new DataBufferInt(width * height);
       
   219         WritableRaster raster =
       
   220             Raster.createPackedRaster(buffer, width, height,
       
   221                                       width,
       
   222                                       new int[] {0x00ff0000, 0x0000ff00,
       
   223                                                  0x000000ff, 0xff000000},
       
   224                                       null);
       
   225         BufferedImage im = new BufferedImage(cm, raster, false, null);
       
   226         Graphics g = im.getGraphics();
       
   227         g.drawImage(image, 0, 0, width, height, null);
       
   228         g.dispose();
       
   229         int[] data = buffer.getData();
       
   230         int[] raw = new int[width * height + 2];
       
   231         raw[0] = width;
       
   232         raw[1] = height;
       
   233         System.arraycopy(data, 0, raw, 2, width * height);
       
   234         return raw;
       
   235     }
       
   236 
       
   237 }