--- old/src/java.desktop/share/classes/java/awt/color/CMMException.java 2018-10-24 21:12:03.000000000 -0700 +++ new/src/java.desktop/share/classes/java/awt/color/CMMException.java 2018-10-24 21:12:02.000000000 -0700 @@ -1,4 +1,5 @@ /* + * Copyright (c) 1997, 2018, 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 @@ -22,13 +23,7 @@ * questions. */ -/* - Created by gbp, October 25, 1997 - - * - */ -/* - ********************************************************************** +/* ******************************************************************** ********************************************************************** ********************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** @@ -38,22 +33,24 @@ ********************************************************************** **********************************************************************/ - package java.awt.color; - /** * This exception is thrown if the native CMM returns an error. */ - public class CMMException extends java.lang.RuntimeException { + + /** + * Use serialVersionUID from JDK 1.2 for interoperability. + */ private static final long serialVersionUID = 5775558044142994965L; /** - * Constructs a CMMException with the specified detail message. - * @param s the specified detail message + * Constructs a {@code CMMException} with the specified detail message. + * + * @param s the specified detail message */ - public CMMException (String s) { - super (s); + public CMMException(String s) { + super(s); } } --- old/src/java.desktop/share/classes/java/awt/color/ColorSpace.java 2018-10-24 21:12:06.000000000 -0700 +++ new/src/java.desktop/share/classes/java/awt/color/ColorSpace.java 2018-10-24 21:12:06.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -23,8 +23,7 @@ * questions. */ -/* - ********************************************************************** +/* ******************************************************************** ********************************************************************** ********************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** @@ -38,63 +37,60 @@ import java.lang.annotation.Native; -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. + * specific color space of a {@code Color} object or, via a {@code ColorModel} + * object, of an {@code Image}, a {@code BufferedImage}, or a + * {@code GraphicsDevice}. It contains methods that transform colors in a + * specific color space to/from sRGB and to/from a well-defined CIEXYZ color + * space. *

- * 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. + * 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 {@code ColorSpace}. For many {@code ColorSpaces} (e.g. sRGB), this range + * is 0.0 to 1.0. However, some {@code ColorSpaces} have components whose values + * have a different range. Methods are provided to inquire per component minimum + * and maximum normalized values. *

- * 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 - * http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html - * . + * Several variables are defined for purposes of referring to color space types + * (e.g. {@code TYPE_RGB}, {@code TYPE_XYZ}, etc.) and to refer to specific + * color spaces (e.g. {@code CS_sRGB} and {@code CS_CIEXYZ}). sRGB is a proposed + * standard RGB color space. For more information, see + * + * http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html. *

- * 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. + * 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 {@code ColorSpace} (e.g. {@code ICC_ColorSpace}) will support + * high performance conversion based on underlying platform color management + * systems. *

- * The CS_CIEXYZ space used by the toCIEXYZ/fromCIEXYZ methods can be - * described as follows: -

-
-      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).
-
-
+ * The {@code CS_CIEXYZ} space used by the {@code toCIEXYZ/fromCIEXYZ} methods + * can be described as follows: + *
+ *
+ *     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).
+ *
+ * 
* * @see ICC_ColorSpace */ - public abstract class ColorSpace implements java.io.Serializable { static final long serialVersionUID = -409452704308689724L; @@ -237,15 +233,14 @@ /** * The sRGB color space defined at - * - * http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html - * . + * + * http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html. */ @Native 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. + * A built-in linear RGB color space. This space is based on the same RGB + * primaries as {@code CS_sRGB}, but has a linear tone reproduction curve. */ @Native public static final int CS_LINEAR_RGB = 1004; @@ -264,25 +259,26 @@ */ @Native 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} type constants - * @param numcomponents the number of components in the color space + * Constructs a {@code ColorSpace} object given a color space type and the + * number of components. + * + * @param type one of the {@code ColorSpace} type constants + * @param numcomponents the number of components in the color space */ - protected ColorSpace (int type, int numcomponents) { + 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) + * Returns a {@code 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. {@code CS_sRGB}, + * {@code CS_LINEAR_RGB}, {@code CS_CIEXYZ}, {@code CS_GRAY}, or + * {@code CS_PYCC}) * @return the requested {@code ColorSpace} object */ // NOTE: This method may be called by privileged threads. @@ -363,11 +359,11 @@ return theColorSpace; } - /** - * Returns true if the ColorSpace is CS_sRGB. - * @return {@code true} if this is a {@code CS_sRGB} color - * space, {@code false} if it is not + * Returns true if the {@code ColorSpace} is {@code CS_sRGB}. + * + * @return {@code true} if this is a {@code CS_sRGB} color space, + * {@code false} if it is not */ public boolean isCS_sRGB () { /* REMIND - make sure we know sRGBspace exists already */ @@ -375,115 +371,105 @@ } /** - * Transforms a color value assumed to be in this ColorSpace - * into a value in the default CS_sRGB color space. + * Transforms a color value assumed to be in this {@code ColorSpace} into a + * value in the default {@code CS_sRGB} color space. *

- * 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} - * 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} method of the CS_sRGB color space to - * convert from CS_CIEXYZ to the output color space. - * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * 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} 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} method of the {@code CS_sRGB} color space to convert + * from {@code CS_CIEXYZ} to the output color space. See + * {@link #toCIEXYZ(float[]) toCIEXYZ} and * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. * - * @param colorvalue a float array with length of at least the number - * of components in this ColorSpace + * @param colorvalue a float array with length of at least the number of + * components in this {@code ColorSpace} * @return a float array of length 3 - * @throws ArrayIndexOutOfBoundsException if array length is not - * at least the number of components in this ColorSpace + * @throws ArrayIndexOutOfBoundsException if array length is not at least + * the number of components in this {@code ColorSpace} */ public abstract float[] toRGB(float[] colorvalue); - /** - * Transforms a color value assumed to be in the default CS_sRGB - * color space into this ColorSpace. + * Transforms a color value assumed to be in the default {@code CS_sRGB} + * color space into this {@code ColorSpace}. *

- * 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} - * 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} method of this color space to - * convert from CS_CIEXYZ to the output color space. - * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * 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} method of the {@code CS_sRGB} color space to first + * convert from the input color space to the {@code CS_CIEXYZ} color space, + * and then use the {@code fromCIEXYZ} method of this color space to convert + * from {@code CS_CIEXYZ} to the output color space. See + * {@link #toCIEXYZ(float[]) toCIEXYZ} and * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. * - * @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 + * @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 {@code 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. + * Transforms a color value assumed to be in this {@code ColorSpace} into + * the {@code CS_CIEXYZ} conversion color space. *

- * 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 + * 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 {@code 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 {@code 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} for further information. * - * @param colorvalue a float array with length of at least the number - * of components in this ColorSpace + * @param colorvalue a float array with length of at least the number of + * components in this {@code ColorSpace} * @return a float array of length 3 - * @throws ArrayIndexOutOfBoundsException if array length is not - * at least the number of components in this ColorSpace. + * @throws ArrayIndexOutOfBoundsException if array length is not at least + * the number of components in this {@code ColorSpace}. */ public abstract float[] toCIEXYZ(float[] colorvalue); - /** - * Transforms a color value assumed to be in the CS_CIEXYZ conversion - * color space into this ColorSpace. + * Transforms a color value assumed to be in the {@code CS_CIEXYZ} + * conversion color space into this {@code ColorSpace}. *

- * 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 + * 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 {@code 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 {@code 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} for further information. * - * @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 + * @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 {@code 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. + * Returns the color space type of this {@code ColorSpace} (for example + * {@code TYPE_RGB}, {@code TYPE_XYZ}, ...). The type defines the number of + * components of the color space and the interpretation, e.g. + * {@code 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} @@ -494,7 +480,8 @@ /** * Returns the number of components of this ColorSpace. - * @return The number of components in this {@code ColorSpace}. + * + * @return the number of components in this {@code ColorSpace} */ public int getNumComponents() { return numComponents; @@ -503,10 +490,10 @@ /** * Returns the name of the component given the component index. * - * @param idx the component index + * @param idx the component index * @return the name of the component at the specified index - * @throws IllegalArgumentException if {@code idx} is - * less than 0 or greater than numComponents - 1 + * @throws IllegalArgumentException if {@code idx} is less than 0 or greater + * than {@code numComponents - 1} */ public String getName (int idx) { /* REMIND - handle common cases here */ @@ -564,15 +551,14 @@ } /** - * 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. + * 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 + * @param component the component index * @return the minimum normalized component value - * @throws IllegalArgumentException if component is less than 0 or - * greater than numComponents - 1 + * @throws IllegalArgumentException if component is less than 0 or greater + * than {@code numComponents - 1} * @since 1.4 */ public float getMinValue(int component) { @@ -584,15 +570,14 @@ } /** - * 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. + * 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 + * @param component the component index * @return the maximum normalized component value - * @throws IllegalArgumentException if component is less than 0 or - * greater than numComponents - 1 + * @throws IllegalArgumentException if component is less than 0 or greater + * than {@code numComponents - 1} * @since 1.4 */ public float getMaxValue(int component) { @@ -603,7 +588,8 @@ return 1.0f; } - /* Returns true if cspace is the XYZspace. + /* + * Returns {@code true} if {@code cspace} is the XYZspace. */ static boolean isCS_CIEXYZ(ColorSpace cspace) { return (cspace == XYZspace); --- old/src/java.desktop/share/classes/java/awt/color/ICC_ColorSpace.java 2018-10-24 21:12:10.000000000 -0700 +++ new/src/java.desktop/share/classes/java/awt/color/ICC_ColorSpace.java 2018-10-24 21:12:10.000000000 -0700 @@ -23,8 +23,7 @@ * questions. */ -/* - ********************************************************************** +/* ******************************************************************** ********************************************************************** ********************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** @@ -36,54 +35,46 @@ package java.awt.color; -import sun.java2d.cmm.ColorTransform; import sun.java2d.cmm.CMSManager; +import sun.java2d.cmm.ColorTransform; 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 http://www.color.org). + * The {@code ICC_ColorSpace} class is an implementation of the abstract + * {@code 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 + * http://www.color.org). *

- * 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. + * Typically, a {@code Color} or {@code 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 {@code ICC_Profile}). Attempting to create an + * {@code ICC_ColorSpace} object from an inappropriate ICC Profile is an error. *

- * 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. + * 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 {@code 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 + * {@code ICC_ColorSpace} object will produce output in the specified type of + * color space (e.g. {@code TYPE_RGB}, {@code TYPE_CMYK}, etc.), but the + * specific color values of the output data will be undefined. *

- * 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(). + * 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 {@link ColorSpace#getInstance}. + * * @see ColorSpace * @see ICC_Profile */ - - - public class ICC_ColorSpace extends ColorSpace { static final long serialVersionUID = 3455889114070431483L; @@ -101,13 +92,14 @@ 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. - */ + * Constructs a new {@code ICC_ColorSpace} from an {@code ICC_Profile} + * object. + * + * @param profile the specified {@code ICC_Profile} object + * @throws IllegalArgumentException if profile is inappropriate for + * representing a {@code ColorSpace} + */ public ICC_ColorSpace (ICC_Profile profile) { super (profile.getColorSpaceType(), profile.getNumComponents()); @@ -140,33 +132,33 @@ } /** - * Returns the ICC_Profile for this ICC_ColorSpace. - * @return the ICC_Profile for this ICC_ColorSpace. - */ + * Returns the {@code ICC_Profile} for this {@code ICC_ColorSpace}. + * + * @return the {@code ICC_Profile} for this {@code 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. + * Transforms a color value assumed to be in this {@code ColorSpace} into a + * value in the default {@code CS_sRGB} color space. *

- * 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} - * 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} method of the CS_sRGB color space to - * convert from CS_CIEXYZ to the output color space. - * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * 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} method of this color space to first convert from the + * input color space to the {@code CS_CIEXYZ} color space, and then use the + * {@code fromCIEXYZ} method of the {@code CS_sRGB} color space to convert + * from {@code CS_CIEXYZ} to the output color space. See + * {@link #toCIEXYZ(float[]) toCIEXYZ} and * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. * - * @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. + * @param colorvalue a float array with length of at least the number of + * components in this {@code ColorSpace} + * @return a float array of length 3 + * @throws ArrayIndexOutOfBoundsException if array length is not at least + * the number of components in this {@code ColorSpace} */ public float[] toRGB (float[] colorvalue) { @@ -200,25 +192,23 @@ } /** - * Transforms a color value assumed to be in the default CS_sRGB - * color space into this ColorSpace. + * Transforms a color value assumed to be in the default {@code CS_sRGB} + * color space into this {@code ColorSpace}. *

- * 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} - * 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} method of this color space to - * convert from CS_CIEXYZ to the output color space. - * See {@link #toCIEXYZ(float[]) toCIEXYZ} and + * 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} method of the {@code CS_sRGB} color space to first + * convert from the input color space to the {@code CS_CIEXYZ} color space, + * and then use the {@code fromCIEXYZ} method of this color space to convert + * from {@code CS_CIEXYZ} to the output color space. See + * {@link #toCIEXYZ(float[]) toCIEXYZ} and * {@link #fromCIEXYZ(float[]) fromCIEXYZ} for further information. * - * @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. + * @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 {@code ColorSpace} + * @throws ArrayIndexOutOfBoundsException if array length is not at least 3 */ public float[] fromRGB(float[] rgbvalue) { @@ -251,70 +241,66 @@ return result; } - /** - * Transforms a color value assumed to be in this ColorSpace - * into the CS_CIEXYZ conversion color space. + * Transforms a color value assumed to be in this {@code ColorSpace} into + * the {@code CS_CIEXYZ} conversion color space. *

- * 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. + * 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 + * {@code 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 {@code 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. *

* 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. - *

- * 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. - *

- * 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. - *

- * 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. - *

- * 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. + * 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 {@code toCIEXYZ} and {@code fromCIEXYZ} is the + * CIEXYZ PCS defined by the ICC Specification. This is also the color space + * represented by {@code ColorSpace.CS_CIEXYZ}. + *

+ * 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. + *

+ * 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. + *

+ * 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. + *

+ * 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. *

      *
      * Xd, Yd, Zd are the device XYZ values
@@ -338,22 +324,21 @@
      *
      * 
*

- * 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. - * - * @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. + * 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. + * + * @param colorvalue a float array with length of at least the number of + * components in this {@code ColorSpace} + * @return a float array of length 3 + * @throws ArrayIndexOutOfBoundsException if array length is not at least + * the number of components in this {@code ColorSpace} */ public float[] toCIEXYZ(float[] colorvalue) { @@ -394,71 +379,67 @@ return result; } - /** - * Transforms a color value assumed to be in the CS_CIEXYZ conversion - * color space into this ColorSpace. + * Transforms a color value assumed to be in the {@code CS_CIEXYZ} + * conversion color space into this ColorSpace. *

- * 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. + * 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 {@code 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 {@code 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. *

* 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. - *

- * 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. - *

- * 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. + * 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 {@code toCIEXYZ} and {@code fromCIEXYZ} is the + * CIEXYZ PCS defined by the ICC Specification. This is also the color space + * represented by {@code ColorSpace.CS_CIEXYZ}. + *

+ * 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. + *

+ * 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. *

* 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 + * 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. - *

- * 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. + * 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. + *

+ * 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. *

      *
      * Xd, Yd, Zd are the device XYZ values
@@ -482,22 +463,20 @@
      *
      * 
*

- * 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. - * - * @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. + * 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. + * + * @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 {@code ColorSpace} + * @throws ArrayIndexOutOfBoundsException if array length is not at least 3 */ public float[] fromCIEXYZ(float[] colorvalue) { @@ -540,19 +519,20 @@ } /** - * 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. + * Returns the minimum normalized color component value for the specified + * component. For {@code TYPE_XYZ} spaces, this method returns minimum + * values of 0.0 for all components. For {@code 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 {@code 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 {@code numComponents - 1} * @since 1.4 */ public float getMinValue(int component) { @@ -564,20 +544,21 @@ } /** - * 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. + * Returns the maximum normalized color component value for the specified + * component. For {@code TYPE_XYZ} spaces, this method returns maximum + * values of 1.0 + (32767.0 / 32768.0) for all components. For + * {@code 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 + * {@code 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 {@code numComponents - 1} * @since 1.4 */ public float getMaxValue(int component) { --- old/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java 2018-10-24 21:12:14.000000000 -0700 +++ new/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java 2018-10-24 21:12:13.000000000 -0700 @@ -23,8 +23,7 @@ * questions. */ -/* - ********************************************************************** +/* ******************************************************************** ********************************************************************** ********************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** @@ -36,17 +35,8 @@ package java.awt.color; -import sun.java2d.cmm.PCMM; -import sun.java2d.cmm.CMSManager; -import sun.java2d.cmm.Profile; -import sun.java2d.cmm.ProfileDataVerifier; -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.FilePermission; import java.io.IOException; @@ -56,42 +46,43 @@ import java.io.ObjectStreamException; import java.io.OutputStream; import java.io.Serializable; - -import java.util.StringTokenizer; - import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.StringTokenizer; +import sun.java2d.cmm.CMSManager; +import sun.java2d.cmm.PCMM; +import sun.java2d.cmm.Profile; +import sun.java2d.cmm.ProfileActivator; +import sun.java2d.cmm.ProfileDataVerifier; +import sun.java2d.cmm.ProfileDeferralInfo; +import sun.java2d.cmm.ProfileDeferralMgr; /** - * 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 http://www.color.org). + * 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 + * http://www.color.org). *

- * 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). + * An {@code ICC_ColorSpace} object can be constructed from an appropriate + * {@code ICC_Profile}. Typically, an {@code 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). *

- * 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. + * 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. + * * @see ICC_ColorSpace */ - - public class ICC_Profile implements Serializable { private static final long serialVersionUID = -3938515861990936766L; @@ -110,7 +101,6 @@ private static ICC_Profile GRAYprofile; private static ICC_Profile LINEAR_RGBprofile; - /** * Profile class is input. */ @@ -146,7 +136,6 @@ */ public static final int CLASS_NAMEDCOLOR = 6; - /** * ICC Profile Color Space Type Signature: 'XYZ '. */ @@ -321,6 +310,7 @@ /** * ICC Profile Rendering Intent: Media-RelativeColorimetric. + * * @since 1.5 */ public static final int icMediaRelativeColorimetric = 1; @@ -337,6 +327,7 @@ /** * ICC Profile Rendering Intent: ICC-AbsoluteColorimetric. + * * @since 1.5 */ public static final int icICCAbsoluteColorimetric = 3; @@ -369,6 +360,7 @@ /** * ICC Profile Tag Signature: 'bXYZ'. + * * @since 1.5 */ public static final int icSigBlueMatrixColumnTag = 0x6258595A; /* 'bXYZ' */ @@ -446,6 +438,7 @@ /** * ICC Profile Tag Signature: 'gXYZ'. + * * @since 1.5 */ public static final int icSigGreenMatrixColumnTag = 0x6758595A;/* 'gXYZ' */ @@ -550,6 +543,7 @@ /** * ICC Profile Tag Signature: 'rXYZ'. + * * @since 1.5 */ public static final int icSigRedMatrixColumnTag = 0x7258595A; /* 'rXYZ' */ @@ -596,18 +590,21 @@ /** * ICC Profile Tag Signature: 'chad'. + * * @since 1.5 */ public static final int icSigChromaticAdaptationTag = 0x63686164;/* 'chad' */ /** * ICC Profile Tag Signature: 'clro'. + * * @since 1.5 */ public static final int icSigColorantOrderTag = 0x636C726F; /* 'clro' */ /** * ICC Profile Tag Signature: 'clrt'. + * * @since 1.5 */ public static final int icSigColorantTableTag = 0x636C7274; /* 'clrt' */ @@ -695,6 +692,7 @@ /** * ICC Profile Header Location: profile's ID. + * * @since 1.5 */ public static final int icHdrProfileID = 84; /* Profile's ID */ @@ -727,15 +725,14 @@ /** - * Constructs an ICC_Profile object with a given ID. + * Constructs an {@code ICC_Profile} object with a given ID. */ ICC_Profile(Profile p) { this.cmmProfile = p; } - /** - * Constructs an ICC_Profile object whose loading will be deferred. + * Constructs an {@code ICC_Profile} object whose loading will be deferred. * The ID will be 0 until the profile is loaded. */ ICC_Profile(ProfileDeferralInfo pdi) { @@ -748,18 +745,18 @@ ProfileDeferralMgr.registerDeferral(this.profileActivator); } - /** - * Frees the resources associated with an ICC_Profile object. + * Frees the resources associated with an {@code ICC_Profile} object. * - * @deprecated The {@code finalize} method has been deprecated. - * Subclasses that override {@code finalize} in order to perform cleanup - * should be modified to use alternative cleanup mechanisms and - * to remove the overriding {@code finalize} method. - * When overriding the {@code finalize} method, its implementation must explicitly - * ensure that {@code super.finalize()} is invoked as described in {@link Object#finalize}. - * See the specification for {@link Object#finalize()} for further - * information about migration options. + * @deprecated The {@code finalize} method has been deprecated. Subclasses + * that override {@code finalize} in order to perform cleanup should + * be modified to use alternative cleanup mechanisms and to remove + * the overriding {@code finalize} method. When overriding the + * {@code finalize} method, its implementation must explicitly + * ensure that {@code super.finalize()} is invoked as described in + * {@link Object#finalize}. See the specification for {@link + * Object#finalize()} for further information about migration + * options. */ @Deprecated(since="9") protected void finalize () { @@ -770,14 +767,14 @@ } } - /** - * Constructs an ICC_Profile object corresponding to the data in - * a byte array. Throws an IllegalArgumentException if the data - * does not correspond to a valid ICC Profile. - * @param data the specified ICC Profile data - * @return an {@code ICC_Profile} object corresponding to - * the data in the specified {@code data} array. + * Constructs an {@code ICC_Profile} object corresponding to the data in a + * byte array. Throws an {@code IllegalArgumentException} if the data does + * not correspond to a valid ICC Profile. + * + * @param data the specified ICC Profile data + * @return an {@code ICC_Profile} object corresponding to the data in the + * specified {@code data} array */ public static ICC_Profile getInstance(byte[] data) { ICC_Profile thisProfile; @@ -821,22 +818,19 @@ return thisProfile; } - - /** - * Constructs an ICC_Profile corresponding to one of the specific color - * spaces defined by the ColorSpace class (for example CS_sRGB). - * Throws an IllegalArgumentException if cspace is not one of the - * defined color spaces. - * - * @param cspace the type of color space to create a profile for. - * The specified type is one of the color - * space constants defined in the {@code ColorSpace} class. - * - * @return an {@code ICC_Profile} object corresponding to - * the specified {@code ColorSpace} type. - * @exception IllegalArgumentException If {@code cspace} is not - * one of the predefined color space types. + * Constructs an {@code ICC_Profile} corresponding to one of the specific + * color spaces defined by the {@code ColorSpace} class (for example + * {@code CS_sRGB}). Throws an {@code IllegalArgumentException} if cspace is + * not one of the defined color spaces. + * + * @param cspace the type of color space to create a profile for. The + * specified type is one of the color space constants defined in the + * {@code ColorSpace} class. + * @return an {@code ICC_Profile} object corresponding to the specified + * {@code ColorSpace} type + * @throws IllegalArgumentException If {@code cspace} is not one of the + * predefined color space types */ public static ICC_Profile getInstance (int cspace) { ICC_Profile thisProfile = null; @@ -931,51 +925,49 @@ return thisProfile; } - /* This asserts system privileges, so is used only for the - * standard profiles. + /** + * This method asserts system privileges, so is used only for the standard + * profiles. */ private static ICC_Profile getStandardProfile(final String name) { - return AccessController.doPrivileged( - new PrivilegedAction() { - public ICC_Profile run() { - ICC_Profile p = null; - try { - p = getInstance (name); - } catch (IOException ex) { - throw new IllegalArgumentException( - "Can't load standard profile: " + name); - } - return p; - } - }); + new PrivilegedAction() { + public ICC_Profile run() { + ICC_Profile p = null; + try { + p = getInstance(name); + } catch (IOException ex) { + throw new IllegalArgumentException( + "Can't load standard profile: " + name); + } + return p; + } + }); } /** - * Constructs an ICC_Profile corresponding to the data in a file. - * fileName may be an absolute or a relative file specification. - * Relative file names are looked for in several places: first, relative - * to any directories specified by the java.iccprofile.path property; - * second, relative to any directories specified by the java.class.path - * property; finally, in a directory used to store profiles always - * available, such as the profile for sRGB. Built-in profiles use .pf as - * the file name extension for profiles, e.g. sRGB.pf. - * This method throws an IOException if the specified file cannot be - * opened or if an I/O error occurs while reading the file. It throws - * an IllegalArgumentException if the file does not contain valid ICC - * Profile data. - * @param fileName The file that contains the data for the profile. - * - * @return an {@code ICC_Profile} object corresponding to - * the data in the specified file. - * @exception IOException If the specified file cannot be opened or - * an I/O error occurs while reading the file. - * - * @exception IllegalArgumentException If the file does not - * contain valid ICC Profile data. - * - * @exception SecurityException If a security manager is installed - * and it does not permit read access to the given file. + * Constructs an {@code ICC_Profile} corresponding to the data in a file. + * {@code fileName} may be an absolute or a relative file specification. + * Relative file names are looked for in several places: first, relative to + * any directories specified by the {@code java.iccprofile.path} property; + * second, relative to any directories specified by the + * {@code java.class.path} property; finally, in a directory used to store + * profiles always available, such as the profile for sRGB. Built-in + * profiles use {@code .pf} as the file name extension for profiles, e.g. + * {@code sRGB.pf}. This method throws an {@code IOException} if the + * specified file cannot be opened or if an I/O error occurs while reading + * the file. It throws an {@code IllegalArgumentException} if the file does + * not contain valid ICC Profile data. + * + * @param fileName the file that contains the data for the profile + * @return an {@code ICC_Profile} object corresponding to the data in the + * specified file + * @throws IOException If the specified file cannot be opened or an I/O + * error occurs while reading the file + * @throws IllegalArgumentException If the file does not contain valid ICC + * Profile data + * @throws SecurityException If a security manager is installed and it does + * not permit read access to the given file */ public static ICC_Profile getInstance(String fileName) throws IOException { ICC_Profile thisProfile; @@ -999,21 +991,19 @@ return thisProfile; } - /** - * Constructs an ICC_Profile corresponding to the data in an InputStream. - * This method throws an IllegalArgumentException if the stream does not - * contain valid ICC Profile data. It throws an IOException if an I/O - * error occurs while reading the stream. - * @param s The input stream from which to read the profile data. - * - * @return an {@code ICC_Profile} object corresponding to the - * data in the specified {@code InputStream}. - * - * @exception IOException If an I/O error occurs while reading the stream. - * - * @exception IllegalArgumentException If the stream does not - * contain valid ICC Profile data. + * Constructs an {@code ICC_Profile} corresponding to the data in an + * {@code InputStream}. This method throws an + * {@code IllegalArgumentException} if the stream does not contain valid ICC + * Profile data. It throws an {@code IOException} if an I/O error occurs + * while reading the stream. + * + * @param s the input stream from which to read the profile data + * @return an {@code ICC_Profile} object corresponding to the data in the + * specified {@code InputStream} + * @throws IOException If an I/O error occurs while reading the stream + * @throws IllegalArgumentException If the stream does not contain valid ICC + * Profile data */ public static ICC_Profile getInstance(InputStream s) throws IOException { byte[] profileData; @@ -1070,17 +1060,15 @@ return profileData; } - /** - * Constructs an ICC_Profile for which the actual loading of the - * profile data from a file and the initialization of the CMM should - * be deferred as long as possible. - * Deferral is only used for standard profiles. - * If deferring is disabled, then getStandardProfile() ensures - * that all of the appropriate access privileges are granted - * when loading this profile. - * If deferring is enabled, then the deferred activation - * code will take care of access privileges. + * Constructs an {@code ICC_Profile} for which the actual loading of the + * profile data from a file and the initialization of the CMM should be + * deferred as long as possible. Deferral is only used for standard + * profiles. If deferring is disabled, then getStandardProfile() ensures + * that all of the appropriate access privileges are granted when loading + * this profile. If deferring is enabled, then the deferred activation code + * will take care of access privileges. + * * @see #activateDeferredProfile() */ static ICC_Profile getDeferredInstance(ProfileDeferralInfo pdi) { @@ -1131,10 +1119,10 @@ } } - /** * Returns profile major version. - * @return The major version of the profile. + * + * @return the major version of the profile */ public int getMajorVersion() { byte[] theHeader; @@ -1147,7 +1135,8 @@ /** * Returns profile minor version. - * @return The minor version of the profile. + * + * @return the minor version of the profile */ public int getMinorVersion() { byte[] theHeader; @@ -1160,7 +1149,8 @@ /** * Returns the profile class. - * @return One of the predefined profile class constants. + * + * @return one of the predefined profile class constants */ public int getProfileClass() { byte[] theHeader; @@ -1214,16 +1204,16 @@ } /** - * Returns the color space type. Returns one of the color space type - * constants defined by the ColorSpace class. This is the - * "input" color space of the profile. 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 One of the color space type constants defined in the - * {@code ColorSpace} class. + * Returns the color space type. Returns one of the color space type + * constants defined by the {@code ColorSpace} class. This is the "input" + * color space of the profile. The type defines the number of components of + * the color space and the interpretation, e.g. {@code 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 one of the color space type constants defined in the + * {@code ColorSpace} class */ public int getColorSpaceType() { if (deferralInfo != null) { @@ -1247,15 +1237,16 @@ /** * Returns the color space type of the Profile Connection Space (PCS). - * Returns one of the color space type constants defined by the - * ColorSpace class. This is the "output" color space of the - * profile. For an input, display, or output profile useful - * for tagging colors or images, this will be either TYPE_XYZ or - * TYPE_Lab and should be interpreted as the corresponding specific - * color space defined in the ICC specification. For a device - * link profile, this could be any of the color space type constants. - * @return One of the color space type constants defined in the - * {@code ColorSpace} class. + * Returns one of the color space type constants defined by the ColorSpace + * class. This is the "output" color space of the profile. For an input, + * display, or output profile useful for tagging colors or images, this will + * be either {@code TYPE_XYZ} or {@code TYPE_Lab} and should be interpreted + * as the corresponding specific color space defined in the ICC + * specification. For a device link profile, this could be any of the color + * space type constants. + * + * @return one of the color space type constants defined in the + * {@code ColorSpace} class */ public int getPCSType() { if (ProfileDeferralMgr.deferring) { @@ -1275,14 +1266,12 @@ return thePCS; } - /** - * Write this ICC_Profile to a file. - * - * @param fileName The file to write the profile data to. + * Write this {@code ICC_Profile} to a file. * - * @exception IOException If the file cannot be opened for writing - * or an I/O error occurs while writing to the file. + * @param fileName the file to write the profile data to + * @throws IOException If the file cannot be opened for writing or an I/O + * error occurs while writing to the file */ public void write(String fileName) throws IOException { FileOutputStream outputFile; @@ -1295,14 +1284,11 @@ outputFile.close (); } - /** - * Write this ICC_Profile to an OutputStream. - * - * @param s The stream to write the profile data to. + * Write this {@code ICC_Profile} to an {@code OutputStream}. * - * @exception IOException If an I/O error occurs while writing to the - * stream. + * @param s the stream to write the profile data to + * @throws IOException If an I/O error occurs while writing to the stream */ public void write(OutputStream s) throws IOException { byte[] profileData; @@ -1312,10 +1298,11 @@ s.write(profileData); } - /** - * Returns a byte array corresponding to the data of this ICC_Profile. - * @return A byte array that contains the profile data. + * Returns a byte array corresponding to the data of this + * {@code ICC_Profile}. + * + * @return a byte array that contains the profile data * @see #setData(int, byte[]) */ public byte[] getData() { @@ -1339,20 +1326,17 @@ return profileData; } - /** - * Returns a particular tagged data element from the profile as - * a byte array. Elements are identified by signatures - * as defined in the ICC specification. The signature - * icSigHead can be used to get the header. This method is useful - * for advanced applets or applications which need to access - * profile data directly. - * - * @param tagSignature The ICC tag signature for the data element you - * want to get. + * Returns a particular tagged data element from the profile as a byte + * array. Elements are identified by signatures as defined in the ICC + * specification. The signature icSigHead can be used to get the header. + * This method is useful for advanced applets or applications which need to + * access profile data directly. * - * @return A byte array that contains the tagged data element. Returns - * {@code null} if the specified tag doesn't exist. + * @param tagSignature the ICC tag signature for the data element you want + * to get + * @return a byte array that contains the tagged data element. Returns + * {@code null} if the specified tag doesn't exist. * @see #setData(int, byte[]) */ public byte[] getData(int tagSignature) { @@ -1387,20 +1371,20 @@ } /** - * Sets a particular tagged data element in the profile from - * a byte array. The array should contain data in a format, corresponded - * to the {@code tagSignature} as defined in the ICC specification, section 10. + * Sets a particular tagged data element in the profile from a byte array. + * The array should contain data in a format, corresponded to the + * {@code tagSignature} as defined in the ICC specification, section 10. * This method is useful for advanced applets or applications which need to * access profile data directly. * - * @param tagSignature The ICC tag signature for the data element - * you want to set. - * @param tagData the data to set for the specified tag signature - * @throws IllegalArgumentException if {@code tagSignature} is not a signature - * as defined in the ICC specification. + * @param tagSignature the ICC tag signature for the data element you want + * to set + * @param tagData the data to set for the specified tag signature + * @throws IllegalArgumentException if {@code tagSignature} is not a + * signature as defined in the ICC specification. * @throws IllegalArgumentException if a content of the {@code tagData} - * array can not be interpreted as valid tag data, corresponding - * to the {@code tagSignature}. + * array can not be interpreted as valid tag data, corresponding to + * the {@code tagSignature} * @see #getData */ public void setData(int tagSignature, byte[] tagData) { @@ -1413,9 +1397,8 @@ } /** - * Sets the rendering intent of the profile. - * This is used to select the proper transform from a profile that - * has multiple transforms. + * Sets the rendering intent of the profile. This is used to select the + * proper transform from a profile that has multiple transforms. */ void setRenderingIntent(int renderingIntent) { byte[] theHeader = getData(icSigHead);/* getData will activate deferred @@ -1425,12 +1408,11 @@ setData (icSigHead, theHeader); } - /** - * Returns the rendering intent of the profile. - * This is used to select the proper transform from a profile that - * has multiple transforms. It is typically set in a source profile - * to select a transform from an output profile. + * Returns the rendering intent of the profile. This is used to select the + * proper transform from a profile that has multiple transforms. It is + * typically set in a source profile to select a transform from an output + * profile. */ int getRenderingIntent() { byte[] theHeader = getData(icSigHead);/* getData will activate deferred @@ -1449,17 +1431,13 @@ return (0xffff & renderingIntent); } - /** - * Returns the number of color components in the "input" color - * space of this profile. For example if the color space type - * of this profile is TYPE_RGB, then this method will return 3. - * - * @return The number of color components in the profile's input - * color space. + * Returns the number of color components in the "input" color space of this + * profile. For example if the color space type of this profile is + * {@code TYPE_RGB}, then this method will return 3. * - * @throws ProfileDataException if color space is in the profile - * is invalid + * @return the number of color components in the profile's input color space + * @throws ProfileDataException if color space is in the profile is invalid */ public int getNumComponents() { byte[] theHeader; @@ -1553,20 +1531,18 @@ return theNumComponents; } - /** - * Returns a float array of length 3 containing the X, Y, and Z - * components of the mediaWhitePointTag in the ICC profile. + * Returns a float array of length 3 containing the X, Y, and Z components + * of the mediaWhitePointTag in the ICC profile. */ float[] getMediaWhitePoint() { return getXYZTag(icSigMediaWhitePointTag); /* get the media white point tag */ } - /** - * Returns a float array of length 3 containing the X, Y, and Z - * components encoded in an XYZType tag. + * Returns a float array of length 3 containing the X, Y, and Z components + * encoded in an XYZType tag. */ float[] getXYZTag(int theTagSignature) { byte[] theData; @@ -1587,17 +1563,17 @@ return theXYZNumber; } - /** - * Returns a gamma value representing a tone reproduction - * curve (TRC). If the profile represents the TRC as a table rather - * than a single gamma value, then an exception is thrown. In this - * case the actual table can be obtained via getTRC(). - * theTagSignature should be one of icSigGrayTRCTag, icSigRedTRCTag, - * icSigGreenTRCTag, or icSigBlueTRCTag. - * @return the gamma value as a float. - * @exception ProfileDataException if the profile does not specify - * the TRC as a single gamma value. + * Returns a gamma value representing a tone reproduction curve (TRC). If + * the profile represents the TRC as a table rather than a single gamma + * value, then an exception is thrown. In this case the actual table can be + * obtained via {@link #getTRC}. {@code theTagSignature} should be one of + * {@code icSigGrayTRCTag}, {@code icSigRedTRCTag}, + * {@code icSigGreenTRCTag}, or {@code icSigBlueTRCTag}. + * + * @return the gamma value as a float + * @throws ProfileDataException if the profile does not specify the TRC as a + * single gamma value */ float getGamma(int theTagSignature) { byte[] theTRCData; @@ -1620,26 +1596,25 @@ return theGamma; } - /** - * Returns the TRC as an array of shorts. If the profile has - * specified the TRC as linear (gamma = 1.0) or as a simple gamma - * value, this method throws an exception, and the getGamma() method - * should be used to get the gamma value. Otherwise the short array - * returned here represents a lookup table where the input Gray value - * is conceptually in the range [0.0, 1.0]. Value 0.0 maps - * to array index 0 and value 1.0 maps to array index length-1. - * Interpolation may be used to generate output values for - * input values which do not map exactly to an index in the - * array. Output values also map linearly to the range [0.0, 1.0]. - * Value 0.0 is represented by an array value of 0x0000 and - * value 1.0 by 0xFFFF, i.e. the values are really unsigned - * short values, although they are returned in a short array. - * theTagSignature should be one of icSigGrayTRCTag, icSigRedTRCTag, - * icSigGreenTRCTag, or icSigBlueTRCTag. - * @return a short array representing the TRC. - * @exception ProfileDataException if the profile does not specify - * the TRC as a table. + * Returns the TRC as an array of shorts. If the profile has specified the + * TRC as linear (gamma = 1.0) or as a simple gamma value, this method + * throws an exception, and the {@link #getGamma} method should be used to + * get the gamma value. Otherwise the short array returned here represents a + * lookup table where the input Gray value is conceptually in the range + * [0.0, 1.0]. Value 0.0 maps to array index 0 and value 1.0 maps to array + * index length-1. Interpolation may be used to generate output values for + * input values which do not map exactly to an index in the array. Output + * values also map linearly to the range [0.0, 1.0]. Value 0.0 is + * represented by an array value of 0x0000 and value 1.0 by 0xFFFF, i.e. the + * values are really unsigned short values, although they are returned in a + * short array. {@code theTagSignature} should be one of + * {@code icSigGrayTRCTag}, {@code icSigRedTRCTag}, + * {@code icSigGreenTRCTag}, or {@code icSigBlueTRCTag}. + * + * @return a short array representing the TRC + * @throws ProfileDataException if the profile does not specify the TRC as a + * table */ short[] getTRC(int theTagSignature) { byte[] theTRCData; @@ -1666,8 +1641,9 @@ return theTRC; } - - /* convert an ICC color space signature into a Java color space type */ + /** + * Convert an ICC color space signature into a Java color space type. + */ static int iccCStoJCS(int theColorSpaceSig) { int theColorSpace; @@ -1775,7 +1751,6 @@ default: throw new IllegalArgumentException ("Unknown color space"); } - return theColorSpace; } @@ -1807,17 +1782,16 @@ array[index+1] = (byte) (value); } - - /* - * fileName may be an absolute or a relative file specification. - * Relative file names are looked for in several places: first, relative - * to any directories specified by the java.iccprofile.path property; - * second, relative to any directories specified by the java.class.path. - * The built-in profile files are now loaded as resources, since they - * may not be individual disk files, and so this method will not find - * these and on a null return, the caller needs to try as resources. - * Built-in profiles use .pf as the file name extension for profiles, - * e.g. sRGB.pf. + /** + * {@code fileName} may be an absolute or a relative file specification. + * Relative file names are looked for in several places: first, relative to + * any directories specified by the {@code java.iccprofile.path} property; + * second, relative to any directories specified by the + * {@code java.class.path}. The built-in profile files are now loaded as + * resources, since they may not be individual disk files, and so this + * method will not find these and on a {@code null} return, the caller needs + * to try as resources. Built-in profiles use {@code .pf} as the file name + * extension for profiles, e.g. {@code sRGB.pf}. */ private static File getProfileFile(String fileName) { String path, dir, fullPath; @@ -1862,10 +1836,9 @@ } /** - * Returns a stream corresponding to a built-in profile - * specified by fileName. - * If there is no built-in profile with such name, then the method - * returns null. + * Returns a stream corresponding to a built-in profile specified by + * fileName. If there is no built-in profile with such name, then the method + * returns {@code null}. */ private static InputStream getStandardProfileInputStream(String fileName) { return AccessController.doPrivileged( @@ -1909,68 +1882,58 @@ }); } - /* * Serialization support. * - * Directly deserialized profiles are useless since they are not - * registered with CMM. We don't allow constructor to be called - * directly and instead have clients to call one of getInstance - * factory methods that will register the profile with CMM. For - * deserialization we implement readResolve method that will - * resolve the bogus deserialized profile object with one obtained - * with getInstance as well. - * - * There are two primary factory methods for construction of ICC - * profiles: getInstance(int cspace) and getInstance(byte[] data). - * This implementation of ICC_Profile uses the former to return a - * cached singleton profile object, other implementations will - * likely use this technique too. To preserve the singleton - * pattern across serialization we serialize cached singleton - * profiles in such a way that deserializing VM could call - * getInstance(int cspace) method that will resolve deserialized - * object into the corresponding singleton as well. - * - * Since the singletons are private to ICC_Profile the readResolve - * method have to be `protected' instead of `private' so that - * singletons that are instances of subclasses of ICC_Profile - * could be correctly deserialized. + * Directly deserialized profiles are useless since they are not registered + * with CMM. We don't allow constructor to be called directly and instead + * have clients to call one of getInstance factory methods that will + * register the profile with CMM. For deserialization we implement + * readResolve method that will resolve the bogus deserialized profile + * object with one obtained with getInstance as well. + * + * There are two primary factory methods for construction of ICC profiles: + * getInstance(int cspace) and getInstance(byte[] data). This implementation + * of ICC_Profile uses the former to return a cached singleton profile + * object, other implementations will likely use this technique too. To + * preserve the singleton pattern across serialization we serialize cached + * singleton profiles in such a way that deserializing VM could call + * getInstance(int cspace) method that will resolve deserialized object into + * the corresponding singleton as well. + * + * Since the singletons are private to ICC_Profile the readResolve method + * have to be `protected' instead of `private' so that singletons that are + * instances of subclasses of ICC_Profile could be correctly deserialized. */ - /** - * Version of the format of additional serialized data in the - * stream. Version {@code 1} corresponds to Java 2 - * Platform, v1.3. - * @since 1.3 + * Version of the format of additional serialized data in the stream. + * Version {@code 1} corresponds to Java 2 Platform, v1.3. + * * @serial + * @since 1.3 */ private int iccProfileSerializedDataVersion = 1; - /** - * Writes default serializable fields to the stream. Writes a - * string and an array of bytes to the stream as additional data. + * Writes default serializable fields to the stream. Writes a string and an + * array of bytes to the stream as additional data. * - * @param s stream used for serialization. - * @throws IOException - * thrown by {@code ObjectInputStream}. - * @serialData - * The {@code String} is the name of one of - * CS_* constants defined in the - * {@link ColorSpace} class if the profile object is a profile - * for a predefined color space (for example - * {@code "CS_sRGB"}). The string is {@code null} - * otherwise. - *

- * The {@code byte[]} array is the profile data for the - * profile. For predefined color spaces {@code null} is - * written instead of the profile data. If in the future - * versions of Java API new predefined color spaces will be - * added, future versions of this class may choose to write - * for new predefined color spaces not only the color space - * name, but the profile data as well so that older versions - * could still deserialize the object. + * @param s stream used for serialization + * @throws IOException thrown by {@code ObjectInputStream} + * @serialData the {@code String} is the name of one of + * CS_* constants defined in the + * {@link ColorSpace} class if the profile object is a profile for a + * predefined color space (for example {@code "CS_sRGB"}). The + * string is {@code null} otherwise. + *

+ * The {@code byte[]} array is the profile data for the profile. For + * predefined color spaces {@code null} is written instead of the + * profile data. If in the future versions of Java API new + * predefined color spaces will be added, future versions of this + * class may choose to write for new predefined color spaces not + * only the color space name, but the profile data as well so that + * older versions could still deserialize the object. */ private void writeObject(ObjectOutputStream s) throws IOException @@ -2009,33 +1972,30 @@ private transient ICC_Profile resolvedDeserializedProfile; /** - * Reads default serializable fields from the stream. Reads from - * the stream a string and an array of bytes as additional data. + * Reads default serializable fields from the stream. Reads from the stream + * a string and an array of bytes as additional data. * - * @param s stream used for deserialization. - * @throws IOException - * thrown by {@code ObjectInputStream}. - * @throws ClassNotFoundException - * thrown by {@code ObjectInputStream}. - * @serialData - * The {@code String} is the name of one of - * CS_* constants defined in the - * {@link ColorSpace} class if the profile object is a profile - * for a predefined color space (for example - * {@code "CS_sRGB"}). The string is {@code null} - * otherwise. - *

- * The {@code byte[]} array is the profile data for the - * profile. It will usually be {@code null} for the - * predefined profiles. - *

- * If the string is recognized as a constant name for - * predefined color space the object will be resolved into - * profile obtained with - * getInstance(int cspace) and the profile - * data are ignored. Otherwise the object will be resolved - * into profile obtained with - * getInstance(byte[] data). + * @param s stream used for deserialization + * @throws IOException thrown by {@code ObjectInputStream} + * @throws ClassNotFoundException thrown by {@code + * ObjectInputStream} + * @serialData the {@code String} is the name of one of + * CS_* constants defined in the + * {@link ColorSpace} class if the profile object is a profile for a + * predefined color space (for example {@code "CS_sRGB"}). The + * string is {@code null} otherwise. + *

+ * The {@code byte[]} array is the profile data for the profile. It + * will usually be {@code null} for the predefined profiles. + *

+ * If the string is recognized as a constant name for predefined + * color space the object will be resolved into profile obtained + * with + * getInstance(int cspace) and the profile data + * are + * ignored. Otherwise the object will be resolved into profile + * obtained with + * getInstance(byte[] data). * @see #readResolve() * @see #getInstance(int) * @see #getInstance(byte[]) @@ -2075,11 +2035,11 @@ } /** - * Resolves instances being deserialized into instances registered - * with CMM. - * @return ICC_Profile object for profile registered with CMM. - * @throws ObjectStreamException - * never thrown, but mandated by the serialization spec. + * Resolves instances being deserialized into instances registered with CMM. + * + * @return ICC_Profile object for profile registered with CMM + * @throws ObjectStreamException never thrown, but mandated by the + * serialization spec * @since 1.3 */ protected Object readResolve() throws ObjectStreamException { --- old/src/java.desktop/share/classes/java/awt/color/ICC_ProfileGray.java 2018-10-24 21:12:16.000000000 -0700 +++ new/src/java.desktop/share/classes/java/awt/color/ICC_ProfileGray.java 2018-10-24 21:12:16.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -23,8 +23,7 @@ * questions. */ -/* - ********************************************************************** +/* ******************************************************************** ********************************************************************** ********************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** @@ -40,80 +39,81 @@ import sun.java2d.cmm.ProfileDeferralInfo; /** - * - * A subclass of the ICC_Profile class which represents profiles - * which meet the following criteria: the color space type of the - * profile is TYPE_GRAY and the profile includes the grayTRCTag and - * mediaWhitePointTag tags. Examples of this kind of profile are - * monochrome input profiles, monochrome display profiles, and - * monochrome output profiles. The getInstance methods in the - * ICC_Profile class will - * return an ICC_ProfileGray object when the above conditions are - * met. The advantage of this class is that it provides a lookup - * table that Java or native methods may be able to use directly to - * optimize color conversion in some cases. + * The {@code ICC_ProfileGray} class is a subclass of the {@code ICC_Profile} + * class that represents profiles which meet the following criteria: the color + * space type of the profile is {@code TYPE_GRAY} and the profile includes the + * {@code grayTRCTag} and {@code mediaWhitePointTag} tags. The + * {@code getInstance} methods in the {@code ICC_Profile} class will return an + * {@code ICC_ProfileGray} object when the above conditions are met. Examples of + * this kind of profile are monochrome input profiles, monochrome display + * profiles, and monochrome output profiles. + *

+ * The advantage of this class is that it provides a lookup table that Java + * or native methods can use directly to optimize color conversion in some + * cases. *

* To transform from a GRAY device profile color space to the CIEXYZ Profile - * Connection Space, the device gray component is transformed by - * a lookup through the tone reproduction curve (TRC). The result is - * treated as the achromatic component of the PCS. -

-
-                PCSY = grayTRC[deviceGray]
-
-
- * The inverse transform is done by converting the PCS Y components to - * device Gray via the inverse of the grayTRC. + * Connection Space, the device gray component is transformed by a lookup + * through the tone reproduction curve (TRC). The result is treated as the + * achromatic component of the PCS. + *
+ *
+ *                 PCSY = grayTRC[deviceGray]
+ *
+ * 
+ * The inverse transform is done by converting the PCS Y components to device + * Gray via the inverse of the grayTRC. */ - - - public class ICC_ProfileGray extends ICC_Profile { + /** + * Use serialVersionUID from JDK 1.2 for interoperability. + */ static final long serialVersionUID = -1124721290732002649L; /** - * Constructs a new ICC_ProfileGray from a CMM ID. + * Constructs a new {@code ICC_ProfileGray} from a CMM ID. */ ICC_ProfileGray(Profile p) { super(p); } /** - * Constructs a new ICC_ProfileGray from a ProfileDeferralInfo object. + * Constructs a new {@code ICC_ProfileGray} from a + * {@code ProfileDeferralInfo} object. */ ICC_ProfileGray(ProfileDeferralInfo pdi) { super(pdi); } - /** - * Returns a float array of length 3 containing the X, Y, and Z - * components of the mediaWhitePointTag in the ICC profile. - * @return an array containing the components of the - * mediaWhitePointTag in the ICC profile. + * Returns a float array of length 3 containing the X, Y, and Z components + * of the mediaWhitePointTag in the ICC profile. + * + * @return an array containing the components of the mediaWhitePointTag in + * the ICC profile */ public float[] getMediaWhitePoint() { return super.getMediaWhitePoint(); } - /** - * Returns a gamma value representing the tone reproduction - * curve (TRC). If the profile represents the TRC as a table rather - * than a single gamma value, then an exception is thrown. In this - * case the actual table can be obtained via getTRC(). When - * using a gamma value, the PCS Y component is computed as follows: -
-
-                          gamma
-         PCSY = deviceGray
-
-
- * @return the gamma value as a float. - * @exception ProfileDataException if the profile does not specify - * the TRC as a single gamma value. + * Returns a gamma value representing the tone reproduction curve (TRC). If + * the profile represents the TRC as a table rather than a single gamma + * value, then an exception is thrown. In this case the actual table can be + * obtained via {@code getTRC()}. When using a gamma value, the PCS Y + * component is computed as follows: + *
+     *
+     *                           gamma
+     *          PCSY = deviceGray
+     *
+     * 
+ * + * @return the gamma value as a float + * @throws ProfileDataException if the profile does not specify the TRC as a + * single gamma value */ public float getGamma() { float theGamma; @@ -123,22 +123,22 @@ } /** - * Returns the TRC as an array of shorts. If the profile has - * specified the TRC as linear (gamma = 1.0) or as a simple gamma - * value, this method throws an exception, and the getGamma() method - * should be used to get the gamma value. Otherwise the short array - * returned here represents a lookup table where the input Gray value - * is conceptually in the range [0.0, 1.0]. Value 0.0 maps - * to array index 0 and value 1.0 maps to array index length-1. - * Interpolation may be used to generate output values for - * input values which do not map exactly to an index in the - * array. Output values also map linearly to the range [0.0, 1.0]. - * Value 0.0 is represented by an array value of 0x0000 and - * value 1.0 by 0xFFFF, i.e. the values are really unsigned - * short values, although they are returned in a short array. - * @return a short array representing the TRC. - * @exception ProfileDataException if the profile does not specify - * the TRC as a table. + * Returns the TRC as an array of shorts. If the profile has specified the + * TRC as linear (gamma = 1.0) or as a simple gamma value, this method + * throws an exception, and the {@code getGamma()} method should be used to + * get the gamma value. Otherwise the short array returned here represents a + * lookup table where the input Gray value is conceptually in the range + * [0.0, 1.0]. Value 0.0 maps to array index 0 and value 1.0 maps to array + * index {@code length-1}. Interpolation may be used to generate output + * values for input values which do not map exactly to an index in the + * array. Output values also map linearly to the range [0.0, 1.0]. Value 0.0 + * is represented by an array value of 0x0000 and value 1.0 by 0xFFFF, i.e. + * the values are really unsigned short values, although they are returned + * in a short array. + * + * @return a short array representing the TRC + * @throws ProfileDataException if the profile does not specify the TRC as a + * table */ public short[] getTRC() { short[] theTRC; --- old/src/java.desktop/share/classes/java/awt/color/ICC_ProfileRGB.java 2018-10-24 21:12:18.000000000 -0700 +++ new/src/java.desktop/share/classes/java/awt/color/ICC_ProfileRGB.java 2018-10-24 21:12:18.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -23,8 +23,7 @@ * questions. */ -/* - ********************************************************************** +/* ******************************************************************** ********************************************************************** ********************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** @@ -40,30 +39,25 @@ import sun.java2d.cmm.ProfileDeferralInfo; /** - * - * The ICC_ProfileRGB class is a subclass of the ICC_Profile class - * that represents profiles which meet the following criteria: - * - * The {@code ICC_Profile getInstance} method will - * return an {@code ICC_ProfileRGB} object when these conditions are met. - * Three-component, matrix-based input profiles and RGB display profiles are - * examples of this type of profile. + * The {@code ICC_ProfileRGB} class is a subclass of the {@code ICC_Profile} + * class that represents profiles which meet the following criteria: the + * profile's color space type is RGB, and the profile includes the + * {@code redColorantTag}, {@code greenColorantTag}, {@code blueColorantTag}, + * {@code redTRCTag}, {@code greenTRCTag}, {@code blueTRCTag}, + * {@code mediaWhitePointTag} tags. The {@code getInstance} methods in the + * {@code ICC_Profile} class will return an {@code ICC_ProfileRGB} object when + * the above conditions are met. Three-component, matrix-based input profiles + * and RGB display profiles are examples of this type of profile. *

- * This profile class provides color transform matrices and lookup tables - * that Java or native methods can use directly to - * optimize color conversion in some cases. + * The advantage of this class is that it provides color transform matrices and + * lookup tables that Java or native methods can use directly to optimize color + * conversion in some cases. *

* To transform from a device profile color space to the CIEXYZ Profile - * Connection Space, each device color component is first linearized by - * a lookup through the corresponding tone reproduction curve (TRC). - * The resulting linear RGB components are converted to the CIEXYZ PCS - * using a a 3x3 matrix constructed from the RGB colorants. + * Connection Space, each device color component is first linearized by a lookup + * through the corresponding tone reproduction curve (TRC). The resulting linear + * RGB components are converted to the CIEXYZ PCS using a a 3x3 matrix + * constructed from the RGB colorants. *

  *
  *                 linearR = redTRC[deviceR]
@@ -81,12 +75,9 @@
  *
  * 
* The inverse transform is performed by converting PCS XYZ components to linear - * RGB components through the inverse of the above 3x3 matrix, and then converting - * linear RGB to device RGB through inverses of the TRCs. + * RGB components through the inverse of the above 3x3 matrix, and then + * converting linear RGB to device RGB through inverses of the TRCs. */ - - - public class ICC_ProfileRGB extends ICC_Profile { @@ -107,12 +98,10 @@ */ public static final int BLUECOMPONENT = 2; - /** * Constructs an new {@code ICC_ProfileRGB} from a CMM ID. * - * @param p The CMM ID for the profile. - * + * @param p the CMM ID for the profile. */ ICC_ProfileRGB(Profile p) { super(p); @@ -120,7 +109,7 @@ /** * Constructs a new {@code ICC_ProfileRGB} from a - * ProfileDeferralInfo object. + * {@code ProfileDeferralInfo} object. * * @param pdi */ @@ -128,31 +117,28 @@ super(pdi); } - /** * Returns an array that contains the components of the profile's * {@code mediaWhitePointTag}. * - * @return A 3-element {@code float} array containing the x, y, - * and z components of the profile's {@code mediaWhitePointTag}. + * @return a 3-element {@code float} array containing the x, y, and z + * components of the profile's {@code mediaWhitePointTag} */ public float[] getMediaWhitePoint() { return super.getMediaWhitePoint(); } - /** - * Returns a 3x3 {@code float} matrix constructed from the - * X, Y, and Z components of the profile's {@code redColorantTag}, + * Returns a 3x3 {@code float} matrix constructed from the X, Y, and Z + * components of the profile's {@code redColorantTag}, * {@code greenColorantTag}, and {@code blueColorantTag}. *

- * This matrix can be used for color transforms in the forward - * direction of the profile--from the profile color space - * to the CIEXYZ PCS. + * This matrix can be used for color transforms in the forward direction of + * the profile--from the profile color space to the CIEXYZ PCS. * - * @return A 3x3 {@code float} array that contains the x, y, and z - * components of the profile's {@code redColorantTag}, - * {@code greenColorantTag}, and {@code blueColorantTag}. + * @return a 3x3 {@code float} array that contains the x, y, and z + * components of the profile's {@code redColorantTag}, + * {@code greenColorantTag}, and {@code blueColorantTag} */ public float[][] getMatrix() { float[][] theMatrix = new float[3][3]; @@ -174,28 +160,27 @@ } /** - * Returns a gamma value representing the tone reproduction curve - * (TRC) for a particular component. The component parameter - * must be one of REDCOMPONENT, GREENCOMPONENT, or BLUECOMPONENT. + * Returns a gamma value representing the tone reproduction curve (TRC) for + * a particular component. The component parameter must be one of + * {@code REDCOMPONENT}, {@code GREENCOMPONENT}, or {@code BLUECOMPONENT}. *

- * If the profile - * represents the TRC for the corresponding component - * as a table rather than a single gamma value, an - * exception is thrown. In this case the actual table - * can be obtained through the {@link #getTRC(int)} method. - * When using a gamma value, - * the linear component (R, G, or B) is computed as follows: + * If the profile represents the TRC for the corresponding component as a + * table rather than a single gamma value, an exception is thrown. In this + * case the actual table can be obtained through the {@link #getTRC(int)} + * method. When using a gamma value, the linear component (R, G, or B) is + * computed as follows: *

      *
      *                                           gamma
      *          linearComponent = deviceComponent
      *
-     *
- * @param component The {@code ICC_ProfileRGB} constant that - * represents the component whose TRC you want to retrieve - * @return the gamma value as a float. - * @exception ProfileDataException if the profile does not specify - * the corresponding TRC as a single gamma value. + * + * + * @param component the {@code ICC_ProfileRGB} constant that represents the + * component whose TRC you want to retrieve + * @return the gamma value as a float + * @throws ProfileDataException if the profile does not specify the + * corresponding TRC as a single gamma value */ public float getGamma(int component) { float theGamma; @@ -224,34 +209,29 @@ } /** - * Returns the TRC for a particular component as an array. - * Component must be {@code REDCOMPONENT}, - * {@code GREENCOMPONENT}, or {@code BLUECOMPONENT}. - * Otherwise the returned array - * represents a lookup table where the input component value - * is conceptually in the range [0.0, 1.0]. Value 0.0 maps - * to array index 0 and value 1.0 maps to array index length-1. - * Interpolation might be used to generate output values for - * input values that do not map exactly to an index in the - * array. Output values also map linearly to the range [0.0, 1.0]. - * Value 0.0 is represented by an array value of 0x0000 and - * value 1.0 by 0xFFFF. In other words, the values are really unsigned - * {@code short} values even though they are returned in a + * Returns the TRC for a particular component as an array. Component must be + * {@code REDCOMPONENT}, {@code GREENCOMPONENT}, or {@code BLUECOMPONENT}. + * Otherwise the returned array represents a lookup table where the input + * component value is conceptually in the range [0.0, 1.0]. Value 0.0 maps + * to array index 0 and value 1.0 maps to array index {@code length-1}. + * Interpolation might be used to generate output values for input values + * that do not map exactly to an index in the array. Output values also map + * linearly to the range [0.0, 1.0]. Value 0.0 is represented by an array + * value of 0x0000 and value 1.0 by 0xFFFF. In other words, the values are + * really unsigned {@code short} values even though they are returned in a * {@code short} array. + *

+ * If the profile has specified the corresponding TRC as linear (gamma = + * 1.0) or as a simple gamma value, this method throws an exception. In this + * case, the {@link #getGamma(int)} method should be used to get the gamma + * value. * - * If the profile has specified the corresponding TRC - * as linear (gamma = 1.0) or as a simple gamma value, this method - * throws an exception. In this case, the {@link #getGamma(int)} - * method should be used to get the gamma value. - * - * @param component The {@code ICC_ProfileRGB} constant that - * represents the component whose TRC you want to retrieve: - * {@code REDCOMPONENT}, {@code GREENCOMPONENT}, or - * {@code BLUECOMPONENT}. - * - * @return a short array representing the TRC. - * @exception ProfileDataException if the profile does not specify - * the corresponding TRC as a table. + * @param component the {@code ICC_ProfileRGB} constant that represents the + * component whose TRC you want to retrieve: {@code REDCOMPONENT}, + * {@code GREENCOMPONENT}, or {@code BLUECOMPONENT} + * @return a short array representing the TRC + * @throws ProfileDataException if the profile does not specify the + * corresponding TRC as a table */ public short[] getTRC(int component) { short[] theTRC; --- old/src/java.desktop/share/classes/java/awt/color/ProfileDataException.java 2018-10-24 21:12:21.000000000 -0700 +++ new/src/java.desktop/share/classes/java/awt/color/ProfileDataException.java 2018-10-24 21:12:20.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -26,18 +26,23 @@ package java.awt.color; /** - * This exception is thrown when an error occurs in accessing or - * processing an ICC_Profile object. + * This exception is thrown when an error occurs in accessing or processing an + * {@code ICC_Profile} object. */ - public class ProfileDataException extends java.lang.RuntimeException { + + /** + * Use serialVersionUID from JDK 1.2 for interoperability. + */ private static final long serialVersionUID = 7286140888240322498L; /** - * Constructs a ProfileDataException with the specified detail message. - * @param s the specified detail message + * Constructs a {@code ProfileDataException} with the specified detail + * message. + * + * @param s the specified detail message */ public ProfileDataException(String s) { - super (s); + super(s); } }