Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/awt/IconInfo.java
38827 views
1
/*
2
* Copyright (c) 2006, 2013, 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] = (int)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
}
238
239