From: <ls...@us...> - 2008-03-24 19:00:56
|
Revision: 3871 http://jnode.svn.sourceforge.net/jnode/?rev=3871&view=rev Author: lsantha Date: 2008-03-24 12:00:53 -0700 (Mon, 24 Mar 2008) Log Message: ----------- OpenJDK integration. Added Paths: ----------- trunk/core/src/openjdk/java/java/awt/color/ trunk/core/src/openjdk/java/java/awt/color/CMMException.java trunk/core/src/openjdk/java/java/awt/color/ColorSpace.java trunk/core/src/openjdk/java/java/awt/color/ICC_ColorSpace.java trunk/core/src/openjdk/java/java/awt/color/ICC_Profile.java trunk/core/src/openjdk/java/java/awt/color/ICC_ProfileGray.java trunk/core/src/openjdk/java/java/awt/color/ICC_ProfileRGB.java trunk/core/src/openjdk/java/java/awt/color/ProfileDataException.java trunk/core/src/openjdk/java/java/awt/color/package.html Added: trunk/core/src/openjdk/java/java/awt/color/CMMException.java =================================================================== --- trunk/core/src/openjdk/java/java/awt/color/CMMException.java (rev 0) +++ trunk/core/src/openjdk/java/java/awt/color/CMMException.java 2008-03-24 19:00:53 UTC (rev 3871) @@ -0,0 +1,58 @@ +/* + * 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + + Created by gbp, October 25, 1997 + + * + */ +/********************************************************************** + ********************************************************************** + ********************************************************************** + *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** + *** As an unpublished work pursuant to Title 17 of the United *** + *** States Code. All rights reserved. *** + ********************************************************************** + ********************************************************************** + **********************************************************************/ + + +package java.awt.color; + + +/** + * This exception is thrown if the native CMM returns an error. + */ + +public class CMMException extends java.lang.RuntimeException { + + /** + * Constructs a CMMException with the specified detail message. + * @param s the specified detail message + */ + public CMMException (String s) { + super (s); + } +} Added: trunk/core/src/openjdk/java/java/awt/color/ColorSpace.java =================================================================== --- trunk/core/src/openjdk/java/java/awt/color/ColorSpace.java (rev 0) +++ trunk/core/src/openjdk/java/java/awt/color/ColorSpace.java 2008-03-24 19:00:53 UTC (rev 3871) @@ -0,0 +1,611 @@ +/* + * Portions Copyright 1997-2006 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/********************************************************************** + ********************************************************************** + ********************************************************************** + *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** + *** As an unpublished work pursuant to Title 17 of the United *** + *** States Code. All rights reserved. *** + ********************************************************************** + ********************************************************************** + **********************************************************************/ + +package java.awt.color; + +import sun.java2d.cmm.PCMM; +import sun.java2d.cmm.CMSManager; + + +/** + * This abstract class is used to serve as a color space tag to identify the + * specific color space of a Color object or, via a ColorModel object, + * of an Image, a BufferedImage, or a GraphicsDevice. It contains + * methods that transform colors in a specific color space to/from sRGB + * and to/from a well-defined CIEXYZ color space. + * <p> + * For purposes of the methods in this class, colors are represented as + * arrays of color components represented as floats in a normalized range + * defined by each ColorSpace. For many ColorSpaces (e.g. sRGB), this + * range is 0.0 to 1.0. However, some ColorSpaces have components whose + * values have a different range. Methods are provided to inquire per + * component minimum and maximum normalized values. + * <p> + * Several variables are defined for purposes of referring to color + * space types (e.g. TYPE_RGB, TYPE_XYZ, etc.) and to refer to specific + * color spaces (e.g. CS_sRGB and CS_CIEXYZ). + * sRGB is a proposed standard RGB color space. For more information, + * see <A href="http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html"> + * http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html + * </A>. + * <p> + * The purpose of the methods to transform to/from the well-defined + * CIEXYZ color space is to support conversions between any two color + * spaces at a reasonably high degree of accuracy. It is expected that + * particular implementations of subclasses of ColorSpace (e.g. + * ICC_ColorSpace) will support high performance conversion based on + * underlying platform color management systems. + * <p> + * The CS_CIEXYZ space used by the toCIEXYZ/fromCIEXYZ methods can be + * described as follows: +<pre> + + CIEXYZ + viewing illuminance: 200 lux + viewing white point: CIE D50 + media white point: "that of a perfectly reflecting diffuser" -- D50 + media black point: 0 lux or 0 Reflectance + flare: 1 percent + surround: 20percent of the media white point + media description: reflection print (i.e., RLAB, Hunt viewing media) + note: For developers creating an ICC profile for this conversion + space, the following is applicable. Use a simple Von Kries + white point adaptation folded into the 3X3 matrix parameters + and fold the flare and surround effects into the three + one-dimensional lookup tables (assuming one uses the minimal + model for monitors). + +</pre> + * + * <p> + * @see ICC_ColorSpace + */ + + + +public abstract class ColorSpace implements java.io.Serializable { + + static final long serialVersionUID = -409452704308689724L; + + private int type; + private int numComponents; + private transient String [] compName = null; + + // Cache of singletons for the predefined color spaces. + private static ColorSpace sRGBspace; + private static ColorSpace XYZspace; + private static ColorSpace PYCCspace; + private static ColorSpace GRAYspace; + private static ColorSpace LINEAR_RGBspace; + + /** + * Any of the family of XYZ color spaces. + */ + public static final int TYPE_XYZ = 0; + + /** + * Any of the family of Lab color spaces. + */ + public static final int TYPE_Lab = 1; + + /** + * Any of the family of Luv color spaces. + */ + public static final int TYPE_Luv = 2; + + /** + * Any of the family of YCbCr color spaces. + */ + public static final int TYPE_YCbCr = 3; + + /** + * Any of the family of Yxy color spaces. + */ + public static final int TYPE_Yxy = 4; + + /** + * Any of the family of RGB color spaces. + */ + public static final int TYPE_RGB = 5; + + /** + * Any of the family of GRAY color spaces. + */ + public static final int TYPE_GRAY = 6; + + /** + * Any of the family of HSV color spaces. + */ + public static final int TYPE_HSV = 7; + + /** + * Any of the family of HLS color spaces. + */ + public static final int TYPE_HLS = 8; + + /** + * Any of the family of CMYK color spaces. + */ + public static final int TYPE_CMYK = 9; + + /** + * Any of the family of CMY color spaces. + */ + public static final int TYPE_CMY = 11; + + /** + * Generic 2 component color spaces. + */ + public static final int TYPE_2CLR = 12; + + /** + * Generic 3 component color spaces. + */ + public static final int TYPE_3CLR = 13; + + /** + * Generic 4 component color spaces. + */ + public static final int TYPE_4CLR = 14; + + /** + * Generic 5 component color spaces. + */ + public static final int TYPE_5CLR = 15; + + /** + * Generic 6 component color spaces. + */ + public static final int TYPE_6CLR = 16; + + /** + * Generic 7 component color spaces. + */ + public static final int TYPE_7CLR = 17; + + /** + * Generic 8 component color spaces. + */ + public static final int TYPE_8CLR = 18; + + /** + * Generic 9 component color spaces. + */ + public static final int TYPE_9CLR = 19; + + /** + * Generic 10 component color spaces. + */ + public static final int TYPE_ACLR = 20; + + /** + * Generic 11 component color spaces. + */ + public static final int TYPE_BCLR = 21; + + /** + * Generic 12 component color spaces. + */ + public static final int TYPE_CCLR = 22; + + /** + * Generic 13 component color spaces. + */ + public static final int TYPE_DCLR = 23; + + /** + * Generic 14 component color spaces. + */ + public static final int TYPE_ECLR = 24; + + /** + * Generic 15 component color spaces. + */ + public static final int TYPE_FCLR = 25; + + /** + * The sRGB color space defined at + * <A href="http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html"> + * http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html + * </A>. + */ + public static final int CS_sRGB = 1000; + + /** + * A built-in linear RGB color space. This space is based on the + * same RGB primaries as CS_sRGB, but has a linear tone reproduction curve. + */ + public static final int CS_LINEAR_RGB = 1004; + + /** + * The CIEXYZ conversion color space defined above. + */ + public static final int CS_CIEXYZ = 1001; + + /** + * The Photo YCC conversion color space. + */ + public static final int CS_PYCC = 1002; + + /** + * The built-in linear gray scale color space. + */ + public static final int CS_GRAY = 1003; + + + /** + * Constructs a ColorSpace object given a color space type + * and the number of components. + * @param type one of the <CODE>ColorSpace</CODE> type constants + * @param numcomponents the number of components in the color space + */ + protected ColorSpace (int type, int numcomponents) { + this.type = type; + this.numComponents = numcomponents; + } + + + /** + * Returns a ColorSpace representing one of the specific + * predefined color spaces. + * @param colorspace a specific color space identified by one of + * the predefined class constants (e.g. CS_sRGB, CS_LINEAR_RGB, + * CS_CIEXYZ, CS_GRAY, or CS_PYCC) + * @return the requested <CODE>ColorSpace</CODE> object + */ + // NOTE: This method may be called by privileged threads. + // DO NOT INVOKE CLIENT CODE ON THIS THREAD! + public static ColorSpace getInstance (int colorspace) + { + ColorSpace theColorSpace; + + switch (colorspace) { + case CS_sRGB: + synchronized(ColorSpace.class) { + if (sRGBspace == null) { + ICC_Profile theProfile = ICC_Profile.getInstance (CS_sRGB); + sRGBspace = new ICC_ColorSpace (theProfile); + } + + theColorSpace = sRGBspace; + } + break; + + case CS_CIEXYZ: + synchronized(ColorSpace.class) { + if (XYZspace == null) { + ICC_Profile theProfile = + ICC_Profile.getInstance (CS_CIEXYZ); + XYZspace = new ICC_ColorSpace (theProfile); + } + + theColorSpace = XYZspace; + } + break; + + case CS_PYCC: + synchronized(ColorSpace.class) { + if (PYCCspace == null) { + ICC_Profile theProfile = ICC_Profile.getInstance (CS_PYCC); + PYCCspace = new ICC_ColorSpace (theProfile); + } + + theColorSpace = PYCCspace; + } + break; + + + case CS_GRAY: + synchronized(ColorSpace.class) { + if (GRAYspace == null) { + ICC_Profile theProfile = ICC_Profile.getInstance (CS_GRAY); + GRAYspace = new ICC_ColorSpace (theProfile); + /* to allow access from java.awt.ColorModel */ + CMSManager.GRAYspace = GRAYspace; + } + + theColorSpace = GRAYspace; + } + break; + + + case CS_LINEAR_RGB: + synchronized(ColorSpace.class) { + if (LINEAR_RGBspace == null) { + ICC_Profile theProfile = + ICC_Profile.getInstance(CS_LINEAR_RGB); + LINEAR_RGBspace = new ICC_ColorSpace (theProfile); + /* to allow access from java.awt.ColorModel */ + CMSManager.LINEAR_RGBspace = LINEAR_RGBspace; + } + + theColorSpace = LINEAR_RGBspace; + } + break; + + + default: + throw new IllegalArgumentException ("Unknown color space"); + } + + return theColorSpace; + } + + + /** + * Returns true if the ColorSpace is CS_sRGB. + * @return <CODE>true</CODE> if this is a <CODE>CS_sRGB</CODE> color + * space, <code>false</code> if it is not + */ + public boolean isCS_sRGB () { + /* REMIND - make sure we know sRGBspace exists already */ + return (this == sRGBspace); + } + + /** + * Transforms a color value assumed to be in this ColorSpace + * into a value in the default CS_sRGB color space. + * <p> + * This method transforms color values using algorithms designed + * to produce the best perceptual match between input and output + * colors. In order to do colorimetric conversion of color values, + * you should use the <code>toCIEXYZ</code> + * method of this color space to first convert from the input + * color space to the CS_CIEXYZ color space, and then use the + * <code>fromCIEXYZ</code> method of the CS_sRGB color space to + * convert from CS_CIEXYZ to the output color space. + * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. + * <p> + * @param colorvalue a float array with length of at least the number + * of components in this ColorSpace + * @return a float array of length 3 + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least the number of components in this ColorSpace + */ + public abstract float[] toRGB(float[] colorvalue); + + + /** + * Transforms a color value assumed to be in the default CS_sRGB + * color space into this ColorSpace. + * <p> + * This method transforms color values using algorithms designed + * to produce the best perceptual match between input and output + * colors. In order to do colorimetric conversion of color values, + * you should use the <code>toCIEXYZ</code> + * method of the CS_sRGB color space to first convert from the input + * color space to the CS_CIEXYZ color space, and then use the + * <code>fromCIEXYZ</code> method of this color space to + * convert from CS_CIEXYZ to the output color space. + * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. + * <p> + * @param rgbvalue a float array with length of at least 3 + * @return a float array with length equal to the number of + * components in this ColorSpace + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least 3 + */ + public abstract float[] fromRGB(float[] rgbvalue); + + + /** + * Transforms a color value assumed to be in this ColorSpace + * into the CS_CIEXYZ conversion color space. + * <p> + * This method transforms color values using relative colorimetry, + * as defined by the International Color Consortium standard. This + * means that the XYZ values returned by this method are represented + * relative to the D50 white point of the CS_CIEXYZ color space. + * This representation is useful in a two-step color conversion + * process in which colors are transformed from an input color + * space to CS_CIEXYZ and then to an output color space. This + * representation is not the same as the XYZ values that would + * be measured from the given color value by a colorimeter. + * A further transformation is necessary to compute the XYZ values + * that would be measured using current CIE recommended practices. + * See the {@link ICC_ColorSpace#toCIEXYZ(float[]) toCIEXYZ} method of + * <code>ICC_ColorSpace</code> for further information. + * <p> + * @param colorvalue a float array with length of at least the number + * of components in this ColorSpace + * @return a float array of length 3 + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least the number of components in this ColorSpace. + */ + public abstract float[] toCIEXYZ(float[] colorvalue); + + + /** + * Transforms a color value assumed to be in the CS_CIEXYZ conversion + * color space into this ColorSpace. + * <p> + * This method transforms color values using relative colorimetry, + * as defined by the International Color Consortium standard. This + * means that the XYZ argument values taken by this method are represented + * relative to the D50 white point of the CS_CIEXYZ color space. + * This representation is useful in a two-step color conversion + * process in which colors are transformed from an input color + * space to CS_CIEXYZ and then to an output color space. The color + * values returned by this method are not those that would produce + * the XYZ value passed to the method when measured by a colorimeter. + * If you have XYZ values corresponding to measurements made using + * current CIE recommended practices, they must be converted to D50 + * relative values before being passed to this method. + * See the {@link ICC_ColorSpace#fromCIEXYZ(float[]) fromCIEXYZ} method of + * <code>ICC_ColorSpace</code> for further information. + * <p> + * @param colorvalue a float array with length of at least 3 + * @return a float array with length equal to the number of + * components in this ColorSpace + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least 3 + */ + public abstract float[] fromCIEXYZ(float[] colorvalue); + + /** + * Returns the color space type of this ColorSpace (for example + * TYPE_RGB, TYPE_XYZ, ...). The type defines the + * number of components of the color space and the interpretation, + * e.g. TYPE_RGB identifies a color space with three components - red, + * green, and blue. It does not define the particular color + * characteristics of the space, e.g. the chromaticities of the + * primaries. + * + * @return the type constant that represents the type of this + * <CODE>ColorSpace</CODE> + */ + public int getType() { + return type; + } + + /** + * Returns the number of components of this ColorSpace. + * @return The number of components in this <CODE>ColorSpace</CODE>. + */ + public int getNumComponents() { + return numComponents; + } + + /** + * Returns the name of the component given the component index. + * + * @param idx the component index + * @return the name of the component at the specified index + * @throws IllegalArgumentException if <code>idx</code> is + * less than 0 or greater than numComponents - 1 + */ + public String getName (int idx) { + /* REMIND - handle common cases here */ + if ((idx < 0) || (idx > numComponents - 1)) { + throw new IllegalArgumentException( + "Component index out of range: " + idx); + } + + if (compName == null) { + switch (type) { + case ColorSpace.TYPE_XYZ: + compName = new String[] {"X", "Y", "Z"}; + break; + case ColorSpace.TYPE_Lab: + compName = new String[] {"L", "a", "b"}; + break; + case ColorSpace.TYPE_Luv: + compName = new String[] {"L", "u", "v"}; + break; + case ColorSpace.TYPE_YCbCr: + compName = new String[] {"Y", "Cb", "Cr"}; + break; + case ColorSpace.TYPE_Yxy: + compName = new String[] {"Y", "x", "y"}; + break; + case ColorSpace.TYPE_RGB: + compName = new String[] {"Red", "Green", "Blue"}; + break; + case ColorSpace.TYPE_GRAY: + compName = new String[] {"Gray"}; + break; + case ColorSpace.TYPE_HSV: + compName = new String[] {"Hue", "Saturation", "Value"}; + break; + case ColorSpace.TYPE_HLS: + compName = new String[] {"Hue", "Lightness", + "Saturation"}; + break; + case ColorSpace.TYPE_CMYK: + compName = new String[] {"Cyan", "Magenta", "Yellow", + "Black"}; + break; + case ColorSpace.TYPE_CMY: + compName = new String[] {"Cyan", "Magenta", "Yellow"}; + break; + default: + String [] tmp = new String[numComponents]; + for (int i = 0; i < tmp.length; i++) { + tmp[i] = "Unnamed color component(" + i + ")"; + } + compName = tmp; + } + } + return compName[idx]; + } + + /** + * Returns the minimum normalized color component value for the + * specified component. The default implementation in this abstract + * class returns 0.0 for all components. Subclasses should override + * this method if necessary. + * + * @param component the component index + * @return the minimum normalized component value + * @throws IllegalArgumentException if component is less than 0 or + * greater than numComponents - 1 + * @since 1.4 + */ + public float getMinValue(int component) { + if ((component < 0) || (component > numComponents - 1)) { + throw new IllegalArgumentException( + "Component index out of range: " + component); + } + return 0.0f; + } + + /** + * Returns the maximum normalized color component value for the + * specified component. The default implementation in this abstract + * class returns 1.0 for all components. Subclasses should override + * this method if necessary. + * + * @param component the component index + * @return the maximum normalized component value + * @throws IllegalArgumentException if component is less than 0 or + * greater than numComponents - 1 + * @since 1.4 + */ + public float getMaxValue(int component) { + if ((component < 0) || (component > numComponents - 1)) { + throw new IllegalArgumentException( + "Component index out of range: " + component); + } + return 1.0f; + } + + /* Returns true if cspace is the XYZspace. + */ + static boolean isCS_CIEXYZ(ColorSpace cspace) { + return (cspace == XYZspace); + } +} Added: trunk/core/src/openjdk/java/java/awt/color/ICC_ColorSpace.java =================================================================== --- trunk/core/src/openjdk/java/java/awt/color/ICC_ColorSpace.java (rev 0) +++ trunk/core/src/openjdk/java/java/awt/color/ICC_ColorSpace.java 2008-03-24 19:00:53 UTC (rev 3871) @@ -0,0 +1,616 @@ +/* + * Portions Copyright 1997-2007 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/********************************************************************** + ********************************************************************** + ********************************************************************** + *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** + *** As an unpublished work pursuant to Title 17 of the United *** + *** States Code. All rights reserved. *** + ********************************************************************** + ********************************************************************** + **********************************************************************/ + +package java.awt.color; + +import sun.java2d.cmm.ColorTransform; +import sun.java2d.cmm.CMSManager; +import sun.java2d.cmm.PCMM; + + +/** + * + * The ICC_ColorSpace class is an implementation of the abstract + * ColorSpace class. This representation of + * device independent and device dependent color spaces is based on the + * International Color Consortium Specification ICC.1:2001-12, File Format for + * Color Profiles (see <A href="http://www.color.org">http://www.color.org</A>). + * <p> + * Typically, a Color or ColorModel would be associated with an ICC + * Profile which is either an input, display, or output profile (see + * the ICC specification). There are other types of ICC Profiles, e.g. + * abstract profiles, device link profiles, and named color profiles, + * which do not contain information appropriate for representing the color + * space of a color, image, or device (see ICC_Profile). + * Attempting to create an ICC_ColorSpace object from an inappropriate ICC + * Profile is an error. + * <p> + * ICC Profiles represent transformations from the color space of + * the profile (e.g. a monitor) to a Profile Connection Space (PCS). + * Profiles of interest for tagging images or colors have a + * PCS which is one of the device independent + * spaces (one CIEXYZ space and two CIELab spaces) defined in the + * ICC Profile Format Specification. Most profiles of interest + * either have invertible transformations or explicitly specify + * transformations going both directions. Should an ICC_ColorSpace + * object be used in a way requiring a conversion from PCS to + * the profile's native space and there is inadequate data to + * correctly perform the conversion, the ICC_ColorSpace object will + * produce output in the specified type of color space (e.g. TYPE_RGB, + * TYPE_CMYK, etc.), but the specific color values of the output data + * will be undefined. + * <p> + * The details of this class are not important for simple applets, + * which draw in a default color space or manipulate and display + * imported images with a known color space. At most, such applets + * would need to get one of the default color spaces via + * ColorSpace.getInstance(). + * <p> + * @see ColorSpace + * @see ICC_Profile + */ + + + +public class ICC_ColorSpace extends ColorSpace { + + static final long serialVersionUID = 3455889114070431483L; + + private ICC_Profile thisProfile; + private float[] minVal; + private float[] maxVal; + private float[] diffMinMax; + private float[] invDiffMinMax; + private boolean needScaleInit = true; + + // {to,from}{RGB,CIEXYZ} methods create and cache these when needed + private transient ColorTransform this2srgb; + private transient ColorTransform srgb2this; + private transient ColorTransform this2xyz; + private transient ColorTransform xyz2this; + + + /** + * Constructs a new ICC_ColorSpace from an ICC_Profile object. + * @param profile the specified ICC_Profile object + * @exception IllegalArgumentException if profile is inappropriate for + * representing a ColorSpace. + */ + public ICC_ColorSpace (ICC_Profile profile) { + super (profile.getColorSpaceType(), profile.getNumComponents()); + + int profileClass = profile.getProfileClass(); + + /* REMIND - is NAMEDCOLOR OK? */ + if ((profileClass != ICC_Profile.CLASS_INPUT) && + (profileClass != ICC_Profile.CLASS_DISPLAY) && + (profileClass != ICC_Profile.CLASS_OUTPUT) && + (profileClass != ICC_Profile.CLASS_COLORSPACECONVERSION) && + (profileClass != ICC_Profile.CLASS_NAMEDCOLOR) && + (profileClass != ICC_Profile.CLASS_ABSTRACT)) { + throw new IllegalArgumentException("Invalid profile type"); + } + + thisProfile = profile; + setMinMax(); + } + + /** + * Returns the ICC_Profile for this ICC_ColorSpace. + * @return the ICC_Profile for this ICC_ColorSpace. + */ + public ICC_Profile getProfile() { + return thisProfile; + } + + /** + * Transforms a color value assumed to be in this ColorSpace + * into a value in the default CS_sRGB color space. + * <p> + * This method transforms color values using algorithms designed + * to produce the best perceptual match between input and output + * colors. In order to do colorimetric conversion of color values, + * you should use the <code>toCIEXYZ</code> + * method of this color space to first convert from the input + * color space to the CS_CIEXYZ color space, and then use the + * <code>fromCIEXYZ</code> method of the CS_sRGB color space to + * convert from CS_CIEXYZ to the output color space. + * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. + * <p> + * @param colorvalue a float array with length of at least the number + * of components in this ColorSpace. + * @return a float array of length 3. + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least the number of components in this ColorSpace. + */ + public float[] toRGB (float[] colorvalue) { + + if (this2srgb == null) { + ColorTransform[] transformList = new ColorTransform [2]; + ICC_ColorSpace srgbCS = + (ICC_ColorSpace) ColorSpace.getInstance (CS_sRGB); + PCMM mdl = CMSManager.getModule(); + transformList[0] = mdl.createTransform( + thisProfile, ColorTransform.Any, ColorTransform.In); + transformList[1] = mdl.createTransform( + srgbCS.getProfile(), ColorTransform.Any, ColorTransform.Out); + this2srgb = mdl.createTransform(transformList); + if (needScaleInit) { + setComponentScaling(); + } + } + + int nc = this.getNumComponents(); + short tmp[] = new short[nc]; + for (int i = 0; i < nc; i++) { + tmp[i] = (short) + ((colorvalue[i] - minVal[i]) * invDiffMinMax[i] + 0.5f); + } + tmp = this2srgb.colorConvert(tmp, null); + float[] result = new float [3]; + for (int i = 0; i < 3; i++) { + result[i] = ((float) (tmp[i] & 0xffff)) / 65535.0f; + } + return result; + } + + /** + * Transforms a color value assumed to be in the default CS_sRGB + * color space into this ColorSpace. + * <p> + * This method transforms color values using algorithms designed + * to produce the best perceptual match between input and output + * colors. In order to do colorimetric conversion of color values, + * you should use the <code>toCIEXYZ</code> + * method of the CS_sRGB color space to first convert from the input + * color space to the CS_CIEXYZ color space, and then use the + * <code>fromCIEXYZ</code> method of this color space to + * convert from CS_CIEXYZ to the output color space. + * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. + * <p> + * @param rgbvalue a float array with length of at least 3. + * @return a float array with length equal to the number of + * components in this ColorSpace. + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least 3. + */ + public float[] fromRGB(float[] rgbvalue) { + + if (srgb2this == null) { + ColorTransform[] transformList = new ColorTransform [2]; + ICC_ColorSpace srgbCS = + (ICC_ColorSpace) ColorSpace.getInstance (CS_sRGB); + PCMM mdl = CMSManager.getModule(); + transformList[0] = mdl.createTransform( + srgbCS.getProfile(), ColorTransform.Any, ColorTransform.In); + transformList[1] = mdl.createTransform( + thisProfile, ColorTransform.Any, ColorTransform.Out); + srgb2this = mdl.createTransform(transformList); + if (needScaleInit) { + setComponentScaling(); + } + } + + short tmp[] = new short[3]; + for (int i = 0; i < 3; i++) { + tmp[i] = (short) ((rgbvalue[i] * 65535.0f) + 0.5f); + } + tmp = srgb2this.colorConvert(tmp, null); + int nc = this.getNumComponents(); + float[] result = new float [nc]; + for (int i = 0; i < nc; i++) { + result[i] = (((float) (tmp[i] & 0xffff)) / 65535.0f) * + diffMinMax[i] + minVal[i]; + } + return result; + } + + + /** + * Transforms a color value assumed to be in this ColorSpace + * into the CS_CIEXYZ conversion color space. + * <p> + * This method transforms color values using relative colorimetry, + * as defined by the ICC Specification. This + * means that the XYZ values returned by this method are represented + * relative to the D50 white point of the CS_CIEXYZ color space. + * This representation is useful in a two-step color conversion + * process in which colors are transformed from an input color + * space to CS_CIEXYZ and then to an output color space. This + * representation is not the same as the XYZ values that would + * be measured from the given color value by a colorimeter. + * A further transformation is necessary to compute the XYZ values + * that would be measured using current CIE recommended practices. + * The paragraphs below explain this in more detail. + * <p> + * The ICC standard uses a device independent color space (DICS) as the + * mechanism for converting color from one device to another device. In + * this architecture, colors are converted from the source device's color + * space to the ICC DICS and then from the ICC DICS to the destination + * device's color space. The ICC standard defines device profiles which + * contain transforms which will convert between a device's color space + * and the ICC DICS. The overall conversion of colors from a source + * device to colors of a destination device is done by connecting the + * device-to-DICS transform of the profile for the source device to the + * DICS-to-device transform of the profile for the destination device. + * For this reason, the ICC DICS is commonly referred to as the profile + * connection space (PCS). The color space used in the methods + * toCIEXYZ and fromCIEXYZ is the CIEXYZ PCS defined by the ICC + * Specification. This is also the color space represented by + * ColorSpace.CS_CIEXYZ. + * <p> + * The XYZ values of a color are often represented as relative to some + * white point, so the actual meaning of the XYZ values cannot be known + * without knowing the white point of those values. This is known as + * relative colorimetry. The PCS uses a white point of D50, so the XYZ + * values of the PCS are relative to D50. For example, white in the PCS + * will have the XYZ values of D50, which is defined to be X=.9642, + * Y=1.000, and Z=0.8249. This white point is commonly used for graphic + * arts applications, but others are often used in other applications. + * <p> + * To quantify the color characteristics of a device such as a printer + * or monitor, measurements of XYZ values for particular device colors + * are typically made. For purposes of this discussion, the term + * device XYZ values is used to mean the XYZ values that would be + * measured from device colors using current CIE recommended practices. + * <p> + * Converting between device XYZ values and the PCS XYZ values returned + * by this method corresponds to converting between the device's color + * space, as represented by CIE colorimetric values, and the PCS. There + * are many factors involved in this process, some of which are quite + * subtle. The most important, however, is the adjustment made to account + * for differences between the device's white point and the white point of + * the PCS. There are many techniques for doing this and it is the + * subject of much current research and controversy. Some commonly used + * methods are XYZ scaling, the von Kries transform, and the Bradford + * transform. The proper method to use depends upon each particular + * application. + * <p> + * The simplest method is XYZ scaling. In this method each device XYZ + * value is converted to a PCS XYZ value by multiplying it by the ratio + * of the PCS white point (D50) to the device white point. + * <pre> + * + * Xd, Yd, Zd are the device XYZ values + * Xdw, Ydw, Zdw are the device XYZ white point values + * Xp, Yp, Zp are the PCS XYZ values + * Xd50, Yd50, Zd50 are the PCS XYZ white point values + * + * Xp = Xd * (Xd50 / Xdw) + * Yp = Yd * (Yd50 / Ydw) + * Zp = Zd * (Zd50 / Zdw) + * + * </pre> + * <p> + * Conversion from the PCS to the device would be done by inverting these + * equations: + * <pre> + * + * Xd = Xp * (Xdw / Xd50) + * Yd = Yp * (Ydw / Yd50) + * Zd = Zp * (Zdw / Zd50) + * + * </pre> + * <p> + * Note that the media white point tag in an ICC profile is not the same + * as the device white point. The media white point tag is expressed in + * PCS values and is used to represent the difference between the XYZ of + * device illuminant and the XYZ of the device media when measured under + * that illuminant. The device white point is expressed as the device + * XYZ values corresponding to white displayed on the device. For + * example, displaying the RGB color (1.0, 1.0, 1.0) on an sRGB device + * will result in a measured device XYZ value of D65. This will not + * be the same as the media white point tag XYZ value in the ICC + * profile for an sRGB device. + * <p> + * @param colorvalue a float array with length of at least the number + * of components in this ColorSpace. + * @return a float array of length 3. + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least the number of components in this ColorSpace. + */ + public float[] toCIEXYZ(float[] colorvalue) { + + if (this2xyz == null) { + ColorTransform[] transformList = new ColorTransform [2]; + ICC_ColorSpace xyzCS = + (ICC_ColorSpace) ColorSpace.getInstance (CS_CIEXYZ); + PCMM mdl = CMSManager.getModule(); + try { + transformList[0] = mdl.createTransform( + thisProfile, ICC_Profile.icRelativeColorimetric, + ColorTransform.In); + } catch (CMMException e) { + transformList[0] = mdl.createTransform( + thisProfile, ColorTransform.Any, ColorTransform.In); + } + transformList[1] = mdl.createTransform( + xyzCS.getProfile(), ColorTransform.Any, ColorTransform.Out); + this2xyz = mdl.createTransform (transformList); + if (needScaleInit) { + setComponentScaling(); + } + } + + int nc = this.getNumComponents(); + short tmp[] = new short[nc]; + for (int i = 0; i < nc; i++) { + tmp[i] = (short) + ((colorvalue[i] - minVal[i]) * invDiffMinMax[i] + 0.5f); + } + tmp = this2xyz.colorConvert(tmp, null); + float ALMOST_TWO = 1.0f + (32767.0f / 32768.0f); + // For CIEXYZ, min = 0.0, max = ALMOST_TWO for all components + float[] result = new float [3]; + for (int i = 0; i < 3; i++) { + result[i] = (((float) (tmp[i] & 0xffff)) / 65535.0f) * ALMOST_TWO; + } + return result; + } + + + /** + * Transforms a color value assumed to be in the CS_CIEXYZ conversion + * color space into this ColorSpace. + * <p> + * This method transforms color values using relative colorimetry, + * as defined by the ICC Specification. This + * means that the XYZ argument values taken by this method are represented + * relative to the D50 white point of the CS_CIEXYZ color space. + * This representation is useful in a two-step color conversion + * process in which colors are transformed from an input color + * space to CS_CIEXYZ and then to an output color space. The color + * values returned by this method are not those that would produce + * the XYZ value passed to the method when measured by a colorimeter. + * If you have XYZ values corresponding to measurements made using + * current CIE recommended practices, they must be converted to D50 + * relative values before being passed to this method. + * The paragraphs below explain this in more detail. + * <p> + * The ICC standard uses a device independent color space (DICS) as the + * mechanism for converting color from one device to another device. In + * this architecture, colors are converted from the source device's color + * space to the ICC DICS and then from the ICC DICS to the destination + * device's color space. The ICC standard defines device profiles which + * contain transforms which will convert between a device's color space + * and the ICC DICS. The overall conversion of colors from a source + * device to colors of a destination device is done by connecting the + * device-to-DICS transform of the profile for the source device to the + * DICS-to-device transform of the profile for the destination device. + * For this reason, the ICC DICS is commonly referred to as the profile + * connection space (PCS). The color space used in the methods + * toCIEXYZ and fromCIEXYZ is the CIEXYZ PCS defined by the ICC + * Specification. This is also the color space represented by + * ColorSpace.CS_CIEXYZ. + * <p> + * The XYZ values of a color are often represented as relative to some + * white point, so the actual meaning of the XYZ values cannot be known + * without knowing the white point of those values. This is known as + * relative colorimetry. The PCS uses a white point of D50, so the XYZ + * values of the PCS are relative to D50. For example, white in the PCS + * will have the XYZ values of D50, which is defined to be X=.9642, + * Y=1.000, and Z=0.8249. This white point is commonly used for graphic + * arts applications, but others are often used in other applications. + * <p> + * To quantify the color characteristics of a device such as a printer + * or monitor, measurements of XYZ values for particular device colors + * are typically made. For purposes of this discussion, the term + * device XYZ values is used to mean the XYZ values that would be + * measured from device colors using current CIE recommended practices. + * <p> + * Converting between device XYZ values and the PCS XYZ values taken as + * arguments by this method corresponds to converting between the device's + * color space, as represented by CIE colorimetric values, and the PCS. + * There are many factors involved in this process, some of which are quite + * subtle. The most important, however, is the adjustment made to account + * for differences between the device's white point and the white point of + * the PCS. There are many techniques for doing this and it is the + * subject of much current research and controversy. Some commonly used + * methods are XYZ scaling, the von Kries transform, and the Bradford + * transform. The proper method to use depends upon each particular + * application. + * <p> + * The simplest method is XYZ scaling. In this method each device XYZ + * value is converted to a PCS XYZ value by multiplying it by the ratio + * of the PCS white point (D50) to the device white point. + * <pre> + * + * Xd, Yd, Zd are the device XYZ values + * Xdw, Ydw, Zdw are the device XYZ white point values + * Xp, Yp, Zp are the PCS XYZ values + * Xd50, Yd50, Zd50 are the PCS XYZ white point values + * + * Xp = Xd * (Xd50 / Xdw) + * Yp = Yd * (Yd50 / Ydw) + * Zp = Zd * (Zd50 / Zdw) + * + * </pre> + * <p> + * Conversion from the PCS to the device would be done by inverting these + * equations: + * <pre> + * + * Xd = Xp * (Xdw / Xd50) + * Yd = Yp * (Ydw / Yd50) + * Zd = Zp * (Zdw / Zd50) + * + * </pre> + * <p> + * Note that the media white point tag in an ICC profile is not the same + * as the device white point. The media white point tag is expressed in + * PCS values and is used to represent the difference between the XYZ of + * device illuminant and the XYZ of the device media when measured under + * that illuminant. The device white point is expressed as the device + * XYZ values corresponding to white displayed on the device. For + * example, displaying the RGB color (1.0, 1.0, 1.0) on an sRGB device + * will result in a measured device XYZ value of D65. This will not + * be the same as the media white point tag XYZ value in the ICC + * profile for an sRGB device. + * <p> + * <p> + * @param colorvalue a float array with length of at least 3. + * @return a float array with length equal to the number of + * components in this ColorSpace. + * @throws ArrayIndexOutOfBoundsException if array length is not + * at least 3. + */ + public float[] fromCIEXYZ(float[] colorvalue) { + + if (xyz2this == null) { + ColorTransform[] transformList = new ColorTransform [2]; + ICC_ColorSpace xyzCS = + (ICC_ColorSpace) ColorSpace.getInstance (CS_CIEXYZ); + PCMM mdl = CMSManager.getModule(); + transformList[0] = mdl.createTransform ( + xyzCS.getProfile(), ColorTransform.Any, ColorTransform.In); + try { + transformList[1] = mdl.createTransform( + thisProfile, ICC_Profile.icRelativeColorimetric, + ColorTransform.Out); + } catch (CMMException e) { + transformList[1] = CMSManager.getModule().createTransform( + thisProfile, ColorTransform.Any, ColorTransform.Out); + } + xyz2this = mdl.createTransform(transformList); + if (needScaleInit) { + setComponentScaling(); + } + } + + short tmp[] = new short[3]; + float ALMOST_TWO = 1.0f + (32767.0f / 32768.0f); + float factor = 65535.0f / ALMOST_TWO; + // For CIEXYZ, min = 0.0, max = ALMOST_TWO for all components + for (int i = 0; i < 3; i++) { + tmp[i] = (short) ((colorvalue[i] * factor) + 0.5f); + } + tmp = xyz2this.colorConvert(tmp, null); + int nc = this.getNumComponents(); + float[] result = new float [nc]; + for (int i = 0; i < nc; i++) { + result[i] = (((float) (tmp[i] & 0xffff)) / 65535.0f) * + diffMinMax[i] + minVal[i]; + } + return result; + } + + /** + * Returns the minimum normalized color component value for the + * specified component. For TYPE_XYZ spaces, this method returns + * minimum values of 0.0 for all components. For TYPE_Lab spaces, + * this method returns 0.0 for L and -128.0 for a and b components. + * This is consistent with the encoding of the XYZ and Lab Profile + * Connection Spaces in the ICC specification. For all other types, this + * method returns 0.0 for all components. When using an ICC_ColorSpace + * with a profile that requires different minimum component values, + * it is necessary to subclass this class and override this method. + * @param component The component index. + * @return The minimum normalized component value. + * @throws IllegalArgumentException if component is less than 0 or + * greater than numComponents - 1. + * @since 1.4 + */ + public float getMinValue(int component) { + if ((component < 0) || (component > this.getNumComponents() - 1)) { + throw new IllegalArgumentException( + "Component index out of range: + component"); + } + return minVal[component]; + } + + /** + * Returns the maximum normalized color component value for the + * specified component. For TYPE_XYZ spaces, this method returns + * maximum values of 1.0 + (32767.0 / 32768.0) for all components. + * For TYPE_Lab spaces, + * this method returns 100.0 for L and 127.0 for a and b components. + * This is consistent with the encoding of the XYZ and Lab Profile + * Connection Spaces in the ICC specification. For all other types, this + * method returns 1.0 for all components. When using an ICC_ColorSpace + * with a profile that requires different maximum component values, + * it is necessary to subclass this class and override this method. + * @param component The component index. + * @return The maximum normalized component value. + * @throws IllegalArgumentException if component is less than 0 or + * greater than numComponents - 1. + * @since 1.4 + */ + public float getMaxValue(int component) { + if ((component < 0) || (component > this.getNumComponents() - 1)) { + throw new IllegalArgumentException( + "Component index out of range: + component"); + } + return maxVal[component]; + } + + private void setMinMax() { + int nc = this.getNumComponents(); + int type = this.getType(); + minVal = new float[nc]; + maxVal = new float[nc]; + if (type == ColorSpace.TYPE_Lab) { + minVal[0] = 0.0f; // L + maxVal[0] = 100.0f; + minVal[1] = -128.0f; // a + maxVal[1] = 127.0f; + minVal[2] = -128.0f; // b + maxVal[2] = 127.0f; + } else if (type == ColorSpace.TYPE_XYZ) { + minVal[0] = minVal[1] = minVal[2] = 0.0f; // X, Y, Z + maxVal[0] = maxVal[1] = maxVal[2] = 1.0f + (32767.0f/ 32768.0f); + } else { + for (int i = 0; i < nc; i++) { + minVal[i] = 0.0f; + maxVal[i] = 1.0f; + } + } + } + + private void setComponentScaling() { + int nc = this.getNumComponents(); + diffMinMax = new float[nc]; + invDiffMinMax = new float[nc]; + for (int i = 0; i < nc; i++) { + minVal[i] = this.getMinValue(i); // in case getMinVal is overridden + maxVal[i] = this.getMaxValue(i); // in case getMaxVal is overridden + diffMinMax[i] = maxVal[i] - minVal[i]; + invDiffMinMax[i] = 65535.0f / diffMinMax[i]; + } + needScaleInit = false; + } + +} Added: trunk/core/src/openjdk/java/java/awt/color/ICC_Profile.java =================================================================== --- trunk/core/src/openjdk/java/java/awt/color/ICC_Profile.java (rev 0) +++ trunk/core/src/openjdk/java/java/awt/color/ICC_Profile.java 2008-03-24 19:00:53 UTC (rev 3871) @@ -0,0 +1,2003 @@ +/* + * Portions Copyright 1997-2006 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/********************************************************************** + ********************************************************************** + ********************************************************************** + *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** + *** As an unpublished work pursuant to Title 17 of the United *** + *** States Code. All rights reserved. *** + ********************************************************************** + ********************************************************************** + **********************************************************************/ + +package java.awt.color; + +import sun.java2d.cmm.PCMM; +import sun.java2d.cmm.CMSManager; +import sun.java2d.cmm.ProfileDeferralMgr; +import sun.java2d.cmm.ProfileDeferralInfo; +import sun.java2d.cmm.ProfileActivator; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamException; +import java.io.OutputStream; +import java.io.Serializable; + +import java.util.StringTokenizer; + +import java.security.AccessController; +import java.security.PrivilegedAction; + +/** + * A representation of color profile data for device independent and + * device dependent color spaces based on the International Color + * Consortium Specification ICC.1:2001-12, File Format for Color Profiles, + * (see <A href="http://www.color.org"> http://www.color.org</A>). + * <p> + * An ICC_ColorSpace object can be constructed from an appropriate + * ICC_Profile. + * Typically, an ICC_ColorSpace would be associated with an ICC + * Profile which is either an input, display, or output profile (see + * the ICC specification). There are also device link, abstract, + * color space conversion, and named color profiles. These are less + * useful for tagging a color or image, but are useful for other + * purposes (in particular device link profiles can provide improved + * performance for converting from one device's color space to + * another's). + * <p> + * ICC Profiles represent transformations from the color space of + * the profile (e.g. a monitor) to a Profile Connection Space (PCS). + * Profiles of interest for tagging images or colors have a PCS + * which is one of the two specific device independent + * spaces (one CIEXYZ space and one CIELab space) defined in the + * ICC Profile Format Specification. Most profiles of interest + * either have invertible transformations or explicitly specify + * transformations going both directions. + * <p> + * @see ICC_ColorSpace + */ + + +public class ICC_Profile implements Serializable { + + private static final long serialVersionUID = -3938515861990936766L; + + transient long ID; + + private transient ProfileDeferralInfo deferralInfo; + private transient ProfileActivator profileActivator; + + // Registry of singleton profile objects for specific color spaces + // defined ... [truncated message content] |