/*
 * Copyright (c) 1999, 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.java2d.loops;

import java.awt.image.ColorModel;
import sun.awt.image.PixelConverter;
import java.util.HashMap;

A SurfaceType object provides a chained description of a type of drawing surface. The object will provide a single String constant descriptor which is one way of viewing or accessing a particular drawing surface as well as a pointer to another SurfaceType which describes the same drawing surface in a different (typically more generalized) way.

A more specific description of a surface is considered a "subtype" and a more general description is considered a "supertype". Thus, the deriveSubType method provides a way to create a new SurfaceType that is related to but more specific than an existing SurfaceType and the getSuperType method provides a way to ask a given SurfaceType for a more general way to describe the same surface.

Note that you cannot construct a brand new root for a chain since the constructor is private. Every chain of types must at some point derive from the Any node provided here using the deriveSubType() method. The presence of this common Any node on every chain ensures that all chains end with the DESC_ANY descriptor so that a suitable General GraphicsPrimitive object can be obtained for the indicated surface if all of the more specific searches fail.

/** * A SurfaceType object provides a chained description of a type of * drawing surface. The object will provide a single String constant * descriptor which is one way of viewing or accessing a particular * drawing surface as well as a pointer to another SurfaceType which * describes the same drawing surface in a different (typically more * generalized) way. * <p> * A more specific description of a surface is considered a "subtype" * and a more general description is considered a "supertype". Thus, * the deriveSubType method provides a way to create a new SurfaceType * that is related to but more specific than an existing SurfaceType and * the getSuperType method provides a way to ask a given SurfaceType * for a more general way to describe the same surface. * <p> * Note that you cannot construct a brand new root for a chain since * the constructor is private. Every chain of types must at some point * derive from the Any node provided here using the deriveSubType() * method. The presence of this common Any node on every chain * ensures that all chains end with the DESC_ANY descriptor so that * a suitable General GraphicsPrimitive object can be obtained for * the indicated surface if all of the more specific searches fail. */
public final class SurfaceType { private static int unusedUID = 1; private static HashMap<String, Integer> surfaceUIDMap = new HashMap<>(100); /* * CONSTANTS USED BY ALL PRIMITIVES TO DESCRIBE THE SURFACES * THEY CAN OPERATE ON */
surface is unknown color model or sample model.
/** * surface is unknown color model or sample model. */
public static final String DESC_ANY = "Any Surface";
common surface formats defined in BufferedImage
/** * common surface formats defined in BufferedImage */
public static final String DESC_INT_RGB = "Integer RGB"; public static final String DESC_INT_ARGB = "Integer ARGB"; public static final String DESC_INT_ARGB_PRE = "Integer ARGB Premultiplied"; public static final String DESC_INT_BGR = "Integer BGR"; public static final String DESC_3BYTE_BGR = "3 Byte BGR"; public static final String DESC_4BYTE_ABGR = "4 Byte ABGR"; public static final String DESC_4BYTE_ABGR_PRE = "4 Byte ABGR Premultiplied"; public static final String DESC_USHORT_565_RGB = "Short 565 RGB"; public static final String DESC_USHORT_555_RGB = "Short 555 RGB"; public static final String DESC_USHORT_555_RGBx= "Short 555 RGBx"; public static final String DESC_USHORT_4444_ARGB= "Short 4444 ARGB"; public static final String DESC_BYTE_GRAY = "8-bit Gray"; public static final String DESC_USHORT_INDEXED = "16-bit Indexed"; public static final String DESC_USHORT_GRAY = "16-bit Gray"; public static final String DESC_BYTE_BINARY = "Packed Binary Bitmap"; public static final String DESC_BYTE_INDEXED = "8-bit Indexed";
wildcard format which indicates that the GraphicsPrimitive is independent of the color model on an IntegerComponent sample model surface
/** * wildcard format which indicates that the GraphicsPrimitive * is independent of the color model on an IntegerComponent * sample model surface */
public static final String DESC_ANY_INT = "Any Discrete Integer";
wildcard format which indicates that the GraphicsPrimitive is independent of the color model on a ShortComponent sample model surface
/** * wildcard format which indicates that the GraphicsPrimitive * is independent of the color model on a ShortComponent * sample model surface */
public static final String DESC_ANY_SHORT = "Any Discrete Short";
wildcard format which indicates that the GraphicsPrimitive is independent of the color model on a ByteComponent sample model surface
/** * wildcard format which indicates that the GraphicsPrimitive * is independent of the color model on a ByteComponent * sample model surface */
public static final String DESC_ANY_BYTE = "Any Discrete Byte";
wildcard format which indicates that the GraphicsPrimitive operates on a surface with 3 component interleaved Raster and sample model and a ComponentColorModel with an arbitrary ordering of the RGB channels
/** * wildcard format which indicates that the GraphicsPrimitive * operates on a surface with 3 component interleaved Raster and * sample model and a ComponentColorModel with an arbitrary ordering * of the RGB channels */
public static final String DESC_ANY_3BYTE = "Any 3 Byte Component";
wildcard format which indicates that the GraphicsPrimitive operates on a surface with 4 component interleaved Raster and sample model and a ComponentColorModel with an arbitrary ordering of the ARGB channels
/** * wildcard format which indicates that the GraphicsPrimitive * operates on a surface with 4 component interleaved Raster and * sample model and a ComponentColorModel with an arbitrary ordering * of the ARGB channels */
public static final String DESC_ANY_4BYTE = "Any 4 Byte Component";
wildcard format which indicates that the GraphicsPrimitive operates on a surface with a single component IntegerComponent sample model and a DirectColorModel with an arbitrary ordering of the RGB channels
/** * wildcard format which indicates that the GraphicsPrimitive * operates on a surface with a single component IntegerComponent * sample model and a DirectColorModel with an arbitrary ordering * of the RGB channels */
public static final String DESC_ANY_INT_DCM = "Any Integer DCM";
additional IntegerComponent types common on Windows
/** * additional IntegerComponent types common on Windows */
public static final String DESC_INT_RGBx = "Integer RGBx"; public static final String DESC_INT_BGRx = "Integer BGRx";
additional 3 byte format common on Windows
/** * additional 3 byte format common on Windows */
public static final String DESC_3BYTE_RGB = "3 Byte RGB";
common formats for BITMASK transparency.
/** * common formats for BITMASK transparency. */
public static final String DESC_INT_ARGB_BM = "Int ARGB (Bitmask)"; public static final String DESC_BYTE_INDEXED_BM = "8-bit Indexed (Bitmask)";
Opaque 8-bit indexed images
/** * Opaque 8-bit indexed images */
public static final String DESC_BYTE_INDEXED_OPAQUE = "8-bit Indexed (Opaque)";
Special Gray Scale types for rendering loops. Really indexed types, but colormap has all gray values.
/** * Special Gray Scale types for rendering loops. Really indexed * types, but colormap has all gray values. */
public static final String DESC_INDEX8_GRAY = "8-bit Palettized Gray"; public static final String DESC_INDEX12_GRAY = "12-bit Palettized Gray"; public static final String DESC_BYTE_BINARY_1BIT = "Packed Binary 1-bit Bitmap"; public static final String DESC_BYTE_BINARY_2BIT = "Packed Binary 2-bit Bitmap"; public static final String DESC_BYTE_BINARY_4BIT = "Packed Binary 4-bit Bitmap";
Special type for describing the sources of loops that render the current foreground color or paint instead of copying colors from a source surface.
/** * Special type for describing the sources of loops that render the * current foreground color or paint instead of copying colors from * a source surface. */
public static final String DESC_ANY_PAINT = "Paint Object"; public static final String DESC_ANY_COLOR = "Single Color"; public static final String DESC_OPAQUE_COLOR = "Opaque Color"; public static final String DESC_GRADIENT_PAINT = "Gradient Paint"; public static final String DESC_OPAQUE_GRADIENT_PAINT = "Opaque Gradient Paint"; public static final String DESC_TEXTURE_PAINT = "Texture Paint"; public static final String DESC_OPAQUE_TEXTURE_PAINT = "Opaque Texture Paint"; public static final String DESC_LINEAR_GRADIENT_PAINT = "Linear Gradient Paint"; public static final String DESC_OPAQUE_LINEAR_GRADIENT_PAINT = "Opaque Linear Gradient Paint"; public static final String DESC_RADIAL_GRADIENT_PAINT = "Radial Gradient Paint"; public static final String DESC_OPAQUE_RADIAL_GRADIENT_PAINT = "Opaque Radial Gradient Paint"; /* * END OF SURFACE TYPE CONSTANTS */
The root SurfaceType object for all chains of surface descriptions. The root uses the default PixelConverter object, which uses a given ColorModel object to calculate its pixelFor() values when asked. Any SurfaceType objects that are not created with a specific PixelConverter object will inherit this behavior from the root.
/** * The root SurfaceType object for all chains of surface descriptions. * The root uses the default PixelConverter object, which uses a given * ColorModel object to calculate its pixelFor() values when asked. * Any SurfaceType objects that are not created with a specific * PixelConverter object will inherit this behavior from the root. */
public static final SurfaceType Any = new SurfaceType(null, DESC_ANY, PixelConverter.instance); /* * START OF SurfaceType OBJECTS FOR THE VARIOUS CONSTANTS */ public static final SurfaceType AnyInt = Any.deriveSubType(DESC_ANY_INT); public static final SurfaceType AnyShort = Any.deriveSubType(DESC_ANY_SHORT); public static final SurfaceType AnyByte = Any.deriveSubType(DESC_ANY_BYTE); public static final SurfaceType AnyByteBinary = Any.deriveSubType(DESC_BYTE_BINARY); public static final SurfaceType Any3Byte = Any.deriveSubType(DESC_ANY_3BYTE); public static final SurfaceType Any4Byte = Any.deriveSubType(DESC_ANY_4BYTE); public static final SurfaceType AnyDcm = AnyInt.deriveSubType(DESC_ANY_INT_DCM); public static final SurfaceType Custom = Any; public static final SurfaceType IntRgb = AnyDcm.deriveSubType(DESC_INT_RGB, PixelConverter.Xrgb.instance); public static final SurfaceType IntArgb = AnyDcm.deriveSubType(DESC_INT_ARGB, PixelConverter.Argb.instance); public static final SurfaceType IntArgbPre = AnyDcm.deriveSubType(DESC_INT_ARGB_PRE, PixelConverter.ArgbPre.instance); public static final SurfaceType IntBgr = AnyDcm.deriveSubType(DESC_INT_BGR, PixelConverter.Xbgr.instance); public static final SurfaceType ThreeByteBgr = Any3Byte.deriveSubType(DESC_3BYTE_BGR, PixelConverter.Xrgb.instance); public static final SurfaceType FourByteAbgr = Any4Byte.deriveSubType(DESC_4BYTE_ABGR, PixelConverter.Rgba.instance); public static final SurfaceType FourByteAbgrPre = Any4Byte.deriveSubType(DESC_4BYTE_ABGR_PRE, PixelConverter.RgbaPre.instance); public static final SurfaceType Ushort565Rgb = AnyShort.deriveSubType(DESC_USHORT_565_RGB, PixelConverter.Ushort565Rgb.instance); public static final SurfaceType Ushort555Rgb = AnyShort.deriveSubType(DESC_USHORT_555_RGB, PixelConverter.Ushort555Rgb.instance); public static final SurfaceType Ushort555Rgbx = AnyShort.deriveSubType(DESC_USHORT_555_RGBx, PixelConverter.Ushort555Rgbx.instance); public static final SurfaceType Ushort4444Argb = AnyShort.deriveSubType(DESC_USHORT_4444_ARGB, PixelConverter.Ushort4444Argb.instance); public static final SurfaceType UshortIndexed = AnyShort.deriveSubType(DESC_USHORT_INDEXED); public static final SurfaceType ByteGray = AnyByte.deriveSubType(DESC_BYTE_GRAY, PixelConverter.ByteGray.instance); public static final SurfaceType UshortGray = AnyShort.deriveSubType(DESC_USHORT_GRAY, PixelConverter.UshortGray.instance); public static final SurfaceType ByteBinary1Bit = AnyByteBinary.deriveSubType(DESC_BYTE_BINARY_1BIT); public static final SurfaceType ByteBinary2Bit = AnyByteBinary.deriveSubType(DESC_BYTE_BINARY_2BIT); public static final SurfaceType ByteBinary4Bit = AnyByteBinary.deriveSubType(DESC_BYTE_BINARY_4BIT); public static final SurfaceType ByteIndexed = AnyByte.deriveSubType(DESC_BYTE_INDEXED); public static final SurfaceType IntRgbx = AnyDcm.deriveSubType(DESC_INT_RGBx, PixelConverter.Rgbx.instance); public static final SurfaceType IntBgrx = AnyDcm.deriveSubType(DESC_INT_BGRx, PixelConverter.Bgrx.instance); public static final SurfaceType ThreeByteRgb = Any3Byte.deriveSubType(DESC_3BYTE_RGB, PixelConverter.Xbgr.instance); public static final SurfaceType IntArgbBm = AnyDcm.deriveSubType(DESC_INT_ARGB_BM, PixelConverter.ArgbBm.instance); public static final SurfaceType ByteIndexedBm = ByteIndexed.deriveSubType(DESC_BYTE_INDEXED_BM); public static final SurfaceType ByteIndexedOpaque = ByteIndexedBm.deriveSubType(DESC_BYTE_INDEXED_OPAQUE); public static final SurfaceType Index8Gray = ByteIndexedOpaque.deriveSubType(DESC_INDEX8_GRAY); public static final SurfaceType Index12Gray = Any.deriveSubType(DESC_INDEX12_GRAY); public static final SurfaceType AnyPaint = Any.deriveSubType(DESC_ANY_PAINT); public static final SurfaceType AnyColor = AnyPaint.deriveSubType(DESC_ANY_COLOR); public static final SurfaceType OpaqueColor = AnyColor.deriveSubType(DESC_OPAQUE_COLOR); public static final SurfaceType GradientPaint = AnyPaint.deriveSubType(DESC_GRADIENT_PAINT); public static final SurfaceType OpaqueGradientPaint = GradientPaint.deriveSubType(DESC_OPAQUE_GRADIENT_PAINT); public static final SurfaceType LinearGradientPaint = AnyPaint.deriveSubType(DESC_LINEAR_GRADIENT_PAINT); public static final SurfaceType OpaqueLinearGradientPaint = LinearGradientPaint.deriveSubType(DESC_OPAQUE_LINEAR_GRADIENT_PAINT); public static final SurfaceType RadialGradientPaint = AnyPaint.deriveSubType(DESC_RADIAL_GRADIENT_PAINT); public static final SurfaceType OpaqueRadialGradientPaint = RadialGradientPaint.deriveSubType(DESC_OPAQUE_RADIAL_GRADIENT_PAINT); public static final SurfaceType TexturePaint = AnyPaint.deriveSubType(DESC_TEXTURE_PAINT); public static final SurfaceType OpaqueTexturePaint = TexturePaint.deriveSubType(DESC_OPAQUE_TEXTURE_PAINT); /* * END OF SurfaceType OBJECTS FOR THE VARIOUS CONSTANTS */
Return a new SurfaceType object which uses this object as its more general "supertype" descriptor. If no operation can be found that manipulates the type of surface described more exactly by desc, then this object will define the more relaxed specification of the surface that can be used to find a more general operator.
/** * Return a new SurfaceType object which uses this object as its * more general "supertype" descriptor. If no operation can be * found that manipulates the type of surface described more exactly * by desc, then this object will define the more relaxed specification * of the surface that can be used to find a more general operator. */
public SurfaceType deriveSubType(String desc) { return new SurfaceType(this, desc); } public SurfaceType deriveSubType(String desc, PixelConverter pixelConverter) { return new SurfaceType(this, desc, pixelConverter); } private int uniqueID; private String desc; private SurfaceType next; protected PixelConverter pixelConverter; private SurfaceType(SurfaceType parent, String desc, PixelConverter pixelConverter) { next = parent; this.desc = desc; this.uniqueID = makeUniqueID(desc); this.pixelConverter = pixelConverter; } private SurfaceType(SurfaceType parent, String desc) { next = parent; this.desc = desc; this.uniqueID = makeUniqueID(desc); this.pixelConverter = parent.pixelConverter; } public static synchronized int makeUniqueID(String desc) { Integer i = surfaceUIDMap.get(desc); if (i == null) { if (unusedUID > 255) { throw new InternalError("surface type id overflow"); } i = Integer.valueOf(unusedUID++); surfaceUIDMap.put(desc, i); } return i.intValue(); } public int getUniqueID() { return uniqueID; } public String getDescriptor() { return desc; } public SurfaceType getSuperType() { return next; } public PixelConverter getPixelConverter() { return pixelConverter; } public int pixelFor(int rgb, ColorModel cm) { return pixelConverter.rgbToPixel(rgb, cm); } public int rgbFor(int pixel, ColorModel cm) { return pixelConverter.pixelToRgb(pixel, cm); } public int getAlphaMask() { return pixelConverter.getAlphaMask(); } public int hashCode() { return desc.hashCode(); } public boolean equals(Object o) { if (o instanceof SurfaceType) { return (((SurfaceType) o).uniqueID == this.uniqueID); } return false; } public String toString() { return desc; } }