blob: bcce58eb215f71d6fbb10298ee56a2ce6b32c908 [file] [log] [blame]
/*
* Copyright (c) 1999, 2008, 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.BufferedImage;
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.
* <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 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.
*/
public static final String
DESC_ANY = "Any Surface";
/**
* 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
*/
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
*/
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
*/
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
*/
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
*/
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
*/
public static final String DESC_ANY_INT_DCM = "Any Integer DCM";
/**
* 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
*/
public static final String DESC_3BYTE_RGB = "3 Byte RGB";
/**
* 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
*/
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.
*/
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.
*/
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.
*/
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.
*/
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 synchronized static final int makeUniqueID(String desc) {
Integer i = (Integer) surfaceUIDMap.get((Object) 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;
}
}