blob: c89d95a6a705b1e69e25812bd106038132d582f9 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1999-2007 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.java2d.loops;
27
28import java.awt.image.BufferedImage;
29import java.awt.image.ColorModel;
30import sun.awt.image.PixelConverter;
31import java.util.HashMap;
32
33/**
34 * A SurfaceType object provides a chained description of a type of
35 * drawing surface. The object will provide a single String constant
36 * descriptor which is one way of viewing or accessing a particular
37 * drawing surface as well as a pointer to another SurfaceType which
38 * describes the same drawing surface in a different (typically more
39 * generalized) way.
40 * <p>
41 * A more specific description of a surface is considered a "subtype"
42 * and a more general description is considered a "supertype". Thus,
43 * the deriveSubType method provides a way to create a new SurfaceType
44 * that is related to but more specific than an existing SurfaceType and
45 * the getSuperType method provides a way to ask a given SurfaceType
46 * for a more general way to describe the same surface.
47 * <p>
48 * Note that you cannot construct a brand new root for a chain since
49 * the constructor is private. Every chain of types must at some point
50 * derive from the Any node provided here using the deriveSubType()
51 * method. The presence of this common Any node on every chain
52 * ensures that all chains end with the DESC_ANY descriptor so that
53 * a suitable General GraphicsPrimitive object can be obtained for
54 * the indicated surface if all of the more specific searches fail.
55 */
56public final class SurfaceType {
57
58 private static int unusedUID = 1;
59 private static HashMap surfaceUIDMap = new HashMap(100);
60
61 /*
62 * CONSTANTS USED BY ALL PRIMITIVES TO DESCRIBE THE SURFACES
63 * THEY CAN OPERATE ON
64 */
65
66 /**
67 * surface is unknown color model or sample model.
68 */
69 public static final String
70 DESC_ANY = "Any Surface";
71
72 /**
73 * common surface formats defined in BufferedImage
74 */
75 public static final String
76 DESC_INT_RGB = "Integer RGB";
77 public static final String
78 DESC_INT_ARGB = "Integer ARGB";
79 public static final String
80 DESC_INT_ARGB_PRE = "Integer ARGB Premultiplied";
81 public static final String
82 DESC_INT_BGR = "Integer BGR";
83 public static final String
84 DESC_3BYTE_BGR = "3 Byte BGR";
85 public static final String
86 DESC_4BYTE_ABGR = "4 Byte ABGR";
87 public static final String
88 DESC_4BYTE_ABGR_PRE = "4 Byte ABGR Premultiplied";
89 public static final String
90 DESC_USHORT_565_RGB = "Short 565 RGB";
91 public static final String
92 DESC_USHORT_555_RGB = "Short 555 RGB";
93 public static final String
94 DESC_USHORT_555_RGBx= "Short 555 RGBx";
95 public static final String
96 DESC_USHORT_4444_ARGB= "Short 4444 ARGB";
97 public static final String
98 DESC_BYTE_GRAY = "8-bit Gray";
99 public static final String
100 DESC_USHORT_INDEXED = "16-bit Indexed";
101 public static final String
102 DESC_USHORT_GRAY = "16-bit Gray";
103 public static final String
104 DESC_BYTE_BINARY = "Packed Binary Bitmap";
105 public static final String
106 DESC_BYTE_INDEXED = "8-bit Indexed";
107
108 /**
109 * wildcard format which indicates that the GraphicsPrimitive
110 * is independent of the color model on an IntegerComponent
111 * sample model surface
112 */
113 public static final String DESC_ANY_INT = "Any Discrete Integer";
114
115 /**
116 * wildcard format which indicates that the GraphicsPrimitive
117 * is independent of the color model on a ShortComponent
118 * sample model surface
119 */
120 public static final String DESC_ANY_SHORT = "Any Discrete Short";
121
122 /**
123 * wildcard format which indicates that the GraphicsPrimitive
124 * is independent of the color model on a ByteComponent
125 * sample model surface
126 */
127 public static final String DESC_ANY_BYTE = "Any Discrete Byte";
128
129 /**
130 * wildcard format which indicates that the GraphicsPrimitive
131 * operates on a surface with 3 component interleaved Raster and
132 * sample model and a ComponentColorModel with an arbitrary ordering
133 * of the RGB channels
134 */
135 public static final String DESC_ANY_3BYTE = "Any 3 Byte Component";
136
137 /**
138 * wildcard format which indicates that the GraphicsPrimitive
139 * operates on a surface with 4 component interleaved Raster and
140 * sample model and a ComponentColorModel with an arbitrary ordering
141 * of the ARGB channels
142 */
143 public static final String DESC_ANY_4BYTE = "Any 4 Byte Component";
144
145 /**
146 * wildcard format which indicates that the GraphicsPrimitive
147 * operates on a surface with a single component IntegerComponent
148 * sample model and a DirectColorModel with an arbitrary ordering
149 * of the RGB channels
150 */
151 public static final String DESC_ANY_INT_DCM = "Any Integer DCM";
152
153 /**
154 * additional IntegerComponent types common on Windows
155 */
156 public static final String DESC_INT_RGBx = "Integer RGBx";
157 public static final String DESC_INT_BGRx = "Integer BGRx";
158
159 /**
160 * additional 3 byte format common on Windows
161 */
162 public static final String DESC_3BYTE_RGB = "3 Byte RGB";
163
164 /**
165 * common formats for BITMASK transparency.
166 */
167 public static final String DESC_INT_ARGB_BM = "Int ARGB (Bitmask)";
168 public static final String DESC_BYTE_INDEXED_BM = "8-bit Indexed (Bitmask)";
169
170 /**
171 * Opaque 8-bit indexed images
172 */
173 public static final String
174 DESC_BYTE_INDEXED_OPAQUE = "8-bit Indexed (Opaque)";
175
176 /**
177 * Special Gray Scale types for rendering loops. Really indexed
178 * types, but colormap has all gray values.
179 */
180 public static final String DESC_INDEX8_GRAY = "8-bit Palettized Gray";
181 public static final String DESC_INDEX12_GRAY = "12-bit Palettized Gray";
182
183 public static final String
184 DESC_BYTE_BINARY_1BIT = "Packed Binary 1-bit Bitmap";
185 public static final String
186 DESC_BYTE_BINARY_2BIT = "Packed Binary 2-bit Bitmap";
187 public static final String
188 DESC_BYTE_BINARY_4BIT = "Packed Binary 4-bit Bitmap";
189
190 /**
191 * Special type for describing the sources of loops that render the
192 * current foreground color or paint instead of copying colors from
193 * a source surface.
194 */
195 public static final String DESC_ANY_PAINT = "Paint Object";
196 public static final String DESC_ANY_COLOR = "Single Color";
197 public static final String DESC_OPAQUE_COLOR = "Opaque Color";
198 public static final String
199 DESC_GRADIENT_PAINT = "Gradient Paint";
200 public static final String
201 DESC_OPAQUE_GRADIENT_PAINT = "Opaque Gradient Paint";
202 public static final String
203 DESC_TEXTURE_PAINT = "Texture Paint";
204 public static final String
205 DESC_OPAQUE_TEXTURE_PAINT = "Opaque Texture Paint";
206 public static final String
207 DESC_LINEAR_GRADIENT_PAINT = "Linear Gradient Paint";
208 public static final String
209 DESC_OPAQUE_LINEAR_GRADIENT_PAINT = "Opaque Linear Gradient Paint";
210 public static final String
211 DESC_RADIAL_GRADIENT_PAINT = "Radial Gradient Paint";
212 public static final String
213 DESC_OPAQUE_RADIAL_GRADIENT_PAINT = "Opaque Radial Gradient Paint";
214
215 /*
216 * END OF SURFACE TYPE CONSTANTS
217 */
218
219
220 /**
221 * The root SurfaceType object for all chains of surface descriptions.
222 * The root uses the default PixelConverter object, which uses a given
223 * ColorModel object to calculate its pixelFor() values when asked.
224 * Any SurfaceType objects that are not created with a specific
225 * PixelConverter object will inherit this behavior from the root.
226 */
227 public static final SurfaceType Any =
228 new SurfaceType(null, DESC_ANY, PixelConverter.instance);
229
230 /*
231 * START OF SurfaceType OBJECTS FOR THE VARIOUS CONSTANTS
232 */
233
234 public static final SurfaceType
235 AnyInt = Any.deriveSubType(DESC_ANY_INT);
236 public static final SurfaceType
237 AnyShort = Any.deriveSubType(DESC_ANY_SHORT);
238 public static final SurfaceType
239 AnyByte = Any.deriveSubType(DESC_ANY_BYTE);
240 public static final SurfaceType
241 AnyByteBinary = Any.deriveSubType(DESC_BYTE_BINARY);
242 public static final SurfaceType
243 Any3Byte = Any.deriveSubType(DESC_ANY_3BYTE);
244 public static final SurfaceType
245 Any4Byte = Any.deriveSubType(DESC_ANY_4BYTE);
246 public static final SurfaceType
247 AnyDcm = AnyInt.deriveSubType(DESC_ANY_INT_DCM);
248
249 public static final SurfaceType
250 Custom = Any;
251 public static final SurfaceType IntRgb =
252 AnyDcm.deriveSubType(DESC_INT_RGB, PixelConverter.Xrgb.instance);
253
254 public static final SurfaceType IntArgb =
255 AnyDcm.deriveSubType(DESC_INT_ARGB, PixelConverter.Argb.instance);
256
257 public static final SurfaceType IntArgbPre =
258 AnyDcm.deriveSubType(DESC_INT_ARGB_PRE,
259 PixelConverter.ArgbPre.instance);
260
261 public static final SurfaceType IntBgr =
262 AnyDcm.deriveSubType(DESC_INT_BGR, PixelConverter.Xbgr.instance);
263
264 public static final SurfaceType ThreeByteBgr =
265 Any3Byte.deriveSubType(DESC_3BYTE_BGR, PixelConverter.Xrgb.instance);
266
267 public static final SurfaceType FourByteAbgr =
268 Any4Byte.deriveSubType(DESC_4BYTE_ABGR, PixelConverter.Rgba.instance);
269
270 public static final SurfaceType FourByteAbgrPre =
271 Any4Byte.deriveSubType(DESC_4BYTE_ABGR_PRE,
272 PixelConverter.RgbaPre.instance);
273
274 public static final SurfaceType Ushort565Rgb =
275 AnyShort.deriveSubType(DESC_USHORT_565_RGB,
276 PixelConverter.Ushort565Rgb.instance);
277
278 public static final SurfaceType Ushort555Rgb =
279 AnyShort.deriveSubType(DESC_USHORT_555_RGB,
280 PixelConverter.Ushort555Rgb.instance);
281
282 public static final SurfaceType Ushort555Rgbx =
283 AnyShort.deriveSubType(DESC_USHORT_555_RGBx,
284 PixelConverter.Ushort555Rgbx.instance);
285
286 public static final SurfaceType Ushort4444Argb =
287 AnyShort.deriveSubType(DESC_USHORT_4444_ARGB,
288 PixelConverter.Ushort4444Argb.instance);
289
290 public static final SurfaceType UshortIndexed =
291 AnyShort.deriveSubType(DESC_USHORT_INDEXED);
292
293 public static final SurfaceType ByteGray =
294 AnyByte.deriveSubType(DESC_BYTE_GRAY,
295 PixelConverter.ByteGray.instance);
296
297 public static final SurfaceType UshortGray =
298 AnyShort.deriveSubType(DESC_USHORT_GRAY,
299 PixelConverter.UshortGray.instance);
300
301 public static final SurfaceType ByteBinary1Bit =
302 AnyByteBinary.deriveSubType(DESC_BYTE_BINARY_1BIT);
303 public static final SurfaceType ByteBinary2Bit =
304 AnyByteBinary.deriveSubType(DESC_BYTE_BINARY_2BIT);
305 public static final SurfaceType ByteBinary4Bit =
306 AnyByteBinary.deriveSubType(DESC_BYTE_BINARY_4BIT);
307
308 public static final SurfaceType ByteIndexed =
309 AnyByte.deriveSubType(DESC_BYTE_INDEXED);
310
311 public static final SurfaceType IntRgbx =
312 AnyDcm.deriveSubType(DESC_INT_RGBx, PixelConverter.Rgbx.instance);
313
314 public static final SurfaceType IntBgrx =
315 AnyDcm.deriveSubType(DESC_INT_BGRx, PixelConverter.Bgrx.instance);
316
317 public static final SurfaceType ThreeByteRgb =
318 Any3Byte.deriveSubType(DESC_3BYTE_RGB, PixelConverter.Xbgr.instance);
319
320 public static final SurfaceType IntArgbBm =
321 AnyDcm.deriveSubType(DESC_INT_ARGB_BM, PixelConverter.ArgbBm.instance);
322
323 public static final SurfaceType ByteIndexedBm =
324 ByteIndexed.deriveSubType(DESC_BYTE_INDEXED_BM);
325
326 public static final SurfaceType ByteIndexedOpaque =
327 ByteIndexedBm.deriveSubType(DESC_BYTE_INDEXED_OPAQUE);
328
329 public static final SurfaceType Index8Gray =
330 ByteIndexedOpaque.deriveSubType(DESC_INDEX8_GRAY);
331
332 public static final SurfaceType Index12Gray =
333 Any.deriveSubType(DESC_INDEX12_GRAY);
334
335 public static final SurfaceType AnyPaint =
336 Any.deriveSubType(DESC_ANY_PAINT);
337
338 public static final SurfaceType AnyColor =
339 AnyPaint.deriveSubType(DESC_ANY_COLOR);
340
341 public static final SurfaceType OpaqueColor =
342 AnyColor.deriveSubType(DESC_OPAQUE_COLOR);
343
344 public static final SurfaceType GradientPaint =
345 AnyPaint.deriveSubType(DESC_GRADIENT_PAINT);
346 public static final SurfaceType OpaqueGradientPaint =
347 GradientPaint.deriveSubType(DESC_OPAQUE_GRADIENT_PAINT);
348
349 public static final SurfaceType LinearGradientPaint =
350 AnyPaint.deriveSubType(DESC_LINEAR_GRADIENT_PAINT);
351 public static final SurfaceType OpaqueLinearGradientPaint =
352 LinearGradientPaint.deriveSubType(DESC_OPAQUE_LINEAR_GRADIENT_PAINT);
353
354 public static final SurfaceType RadialGradientPaint =
355 AnyPaint.deriveSubType(DESC_RADIAL_GRADIENT_PAINT);
356 public static final SurfaceType OpaqueRadialGradientPaint =
357 RadialGradientPaint.deriveSubType(DESC_OPAQUE_RADIAL_GRADIENT_PAINT);
358
359 public static final SurfaceType TexturePaint =
360 AnyPaint.deriveSubType(DESC_TEXTURE_PAINT);
361 public static final SurfaceType OpaqueTexturePaint =
362 TexturePaint.deriveSubType(DESC_OPAQUE_TEXTURE_PAINT);
363
364 /*
365 * END OF SurfaceType OBJECTS FOR THE VARIOUS CONSTANTS
366 */
367
368 /**
369 * Return a new SurfaceType object which uses this object as its
370 * more general "supertype" descriptor. If no operation can be
371 * found that manipulates the type of surface described more exactly
372 * by desc, then this object will define the more relaxed specification
373 * of the surface that can be used to find a more general operator.
374 */
375 public SurfaceType deriveSubType(String desc) {
376 return new SurfaceType(this, desc);
377 }
378
379 public SurfaceType deriveSubType(String desc,
380 PixelConverter pixelConverter) {
381 return new SurfaceType(this, desc, pixelConverter);
382 }
383
384 private int uniqueID;
385 private String desc;
386 private SurfaceType next;
387 protected PixelConverter pixelConverter;
388
389 private SurfaceType(SurfaceType parent, String desc,
390 PixelConverter pixelConverter) {
391 next = parent;
392 this.desc = desc;
393 this.uniqueID = makeUniqueID(desc);
394 this.pixelConverter = pixelConverter;
395 }
396
397 private SurfaceType(SurfaceType parent, String desc) {
398 next = parent;
399 this.desc = desc;
400 this.uniqueID = makeUniqueID(desc);
401 this.pixelConverter = parent.pixelConverter;
402 }
403
404 public synchronized static final int makeUniqueID(String desc) {
405 Integer i = (Integer) surfaceUIDMap.get((Object) desc);
406
407 if (i == null) {
408 if (unusedUID > 255) {
409 throw new InternalError("surface type id overflow");
410 }
411 i = new Integer(unusedUID++);
412 surfaceUIDMap.put(desc, i);
413 }
414 return i.intValue();
415 }
416
417 public int getUniqueID() {
418 return uniqueID;
419 }
420
421 public String getDescriptor() {
422 return desc;
423 }
424
425 public SurfaceType getSuperType() {
426 return next;
427 }
428
429 public PixelConverter getPixelConverter() {
430 return pixelConverter;
431 }
432
433 public int pixelFor(int rgb, ColorModel cm) {
434 return pixelConverter.rgbToPixel(rgb, cm);
435 }
436
437 public int rgbFor(int pixel, ColorModel cm) {
438 return pixelConverter.pixelToRgb(pixel, cm);
439 }
440
441 public int getAlphaMask() {
442 return pixelConverter.getAlphaMask();
443 }
444
445 public int hashCode() {
446 return desc.hashCode();
447 }
448
449 public boolean equals(Object o) {
450 if (o instanceof SurfaceType) {
451 return (((SurfaceType) o).uniqueID == this.uniqueID);
452 }
453 return false;
454 }
455
456 public String toString() {
457 return desc;
458 }
459
460}