| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.sanselan.icc; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.IOException; |
| |
| import org.apache.sanselan.ImageReadException; |
| import org.apache.sanselan.common.BinaryConstants; |
| import org.apache.sanselan.common.BinaryInputStream; |
| |
| public interface IccConstants |
| { |
| public final static int IEC = (((0xff & 'I') << 24) | ((0xff & 'E') << 16) |
| | ((0xff & 'C') << 8) | ((0xff & ' ') << 0)); |
| public final static int sRGB = (((0xff & 's') << 24) | ((0xff & 'R') << 16) |
| | ((0xff & 'G') << 8) | ((0xff & 'B') << 0)); |
| |
| public static final IccTagDataType descType = new IccTagDataType( |
| "descType", 0x64657363) |
| { |
| public void dump(String prefix, byte bytes[]) |
| throws ImageReadException, IOException |
| { |
| BinaryInputStream bis = new BinaryInputStream( |
| new ByteArrayInputStream(bytes), |
| BinaryConstants.BYTE_ORDER_NETWORK); |
| bis.read4Bytes("type_signature", "ICC: corrupt tag data"); |
| |
| // bis.setDebug(true); |
| bis.read4Bytes("ignore", "ICC: corrupt tag data"); |
| int string_length = bis.read4Bytes("string_length", |
| "ICC: corrupt tag data"); |
| |
| // bis.readByteArray("ignore", bytes.length -12, "none"); |
| String s = new String(bytes, 12, string_length - 1); |
| System.out.println(prefix + "s: '" + s + "'"); |
| } |
| |
| }; |
| |
| public static final IccTagDataType dataType = new IccTagDataType( |
| "dataType", 0x64617461) |
| { |
| public void dump(String prefix, byte bytes[]) |
| throws ImageReadException, IOException |
| { |
| BinaryInputStream bis = new BinaryInputStream( |
| new ByteArrayInputStream(bytes), |
| BinaryConstants.BYTE_ORDER_NETWORK); |
| bis.read4Bytes("type_signature", "ICC: corrupt tag data"); |
| } |
| |
| }; |
| |
| public static final IccTagDataType multiLocalizedUnicodeType = new IccTagDataType( |
| "multiLocalizedUnicodeType", (0x6D6C7563)) |
| { |
| public void dump(String prefix, byte bytes[]) |
| throws ImageReadException, IOException |
| { |
| BinaryInputStream bis = new BinaryInputStream( |
| new ByteArrayInputStream(bytes), |
| BinaryConstants.BYTE_ORDER_NETWORK); |
| bis.read4Bytes("type_signature", "ICC: corrupt tag data"); |
| } |
| |
| }; |
| |
| public static final IccTagDataType signatureType = new IccTagDataType( |
| "signatureType", ((0x73696720))) |
| { |
| public void dump(String prefix, byte bytes[]) |
| throws ImageReadException, IOException |
| { |
| BinaryInputStream bis = new BinaryInputStream( |
| new ByteArrayInputStream(bytes), |
| BinaryConstants.BYTE_ORDER_NETWORK); |
| bis.read4Bytes("type_signature", "ICC: corrupt tag data"); |
| bis.read4Bytes("ignore", "ICC: corrupt tag data"); |
| int thesignature = bis.read4Bytes("thesignature ", |
| "ICC: corrupt tag data"); |
| System.out.println(prefix |
| + "thesignature: " |
| + Integer.toHexString(thesignature) |
| + " (" |
| + new String(new byte[]{ |
| (byte) (0xff & (thesignature >> 24)), |
| (byte) (0xff & (thesignature >> 16)), |
| (byte) (0xff & (thesignature >> 8)), |
| (byte) (0xff & (thesignature >> 0)), |
| }) + ")"); |
| } |
| |
| }; |
| |
| public static final IccTagDataType textType = new IccTagDataType( |
| "textType", 0x74657874) |
| { |
| public void dump(String prefix, byte bytes[]) |
| throws ImageReadException, IOException |
| { |
| BinaryInputStream bis = new BinaryInputStream( |
| new ByteArrayInputStream(bytes), |
| BinaryConstants.BYTE_ORDER_NETWORK); |
| bis.read4Bytes("type_signature", "ICC: corrupt tag data"); |
| bis.read4Bytes("ignore", "ICC: corrupt tag data"); |
| String s = new String(bytes, 8, bytes.length - 8); |
| System.out.println(prefix + "s: '" + s + "'"); |
| } |
| |
| }; |
| |
| public static final IccTagDataType IccTagDataTypes[] = { |
| descType, dataType, multiLocalizedUnicodeType, signatureType, |
| textType, |
| }; |
| // public static final IccTagDataType dataType = new IccTagDataType("dataType", |
| // 0x64617461 |
| // ); |
| |
| public static final IccTagType AToB0Tag = new IccTagType("AToB0Tag", |
| "lut8Type or lut16Type or lutAtoBType", 0x41324230 |
| // "This tag defines a color transform from Device to PCS using lookup table tag element structures. The processing mechanisms are described in lut8Type or lut16Type or lutAtoBType."); |
| ); |
| |
| // public static final IccTagType AToB0Tag = new IccTagType( |
| // "AToB0Tag", |
| // "lut8Type or lut16Type or lutAtoBType", |
| // "A2B0 (41324230h)", |
| // "This tag defines a color transform from Device to PCS using lookup table tag element structures. The processing", |
| // "mechanisms are described in lut8Type or lut16Type or lutAtoBType.", |
| // ); |
| |
| public static final IccTagType AToB1Tag = new IccTagType("AToB1Tag", |
| "lut8Type or lut16Type or lutAtoBType", 0x41324231 |
| // "This tag defines a color transform from Device to PCS using lookup table tag element structures. The processing", |
| // "mechanisms are described in lut8Type or lut16Type or lutAtoBType.", |
| ); |
| |
| public static final IccTagType AToB2Tag = new IccTagType("AToB2Tag", |
| "lut8Type or lut16Type or lutAtoBType", 0x41324232 |
| // "This tag defines a color transform from Device to PCS using lookup table tag element structures. The processing", |
| // "mechanisms are described in lut8Type or lut16Type or lutAtoBType.", |
| ); |
| |
| public static final IccTagType blueMatrixColumnTag = new IccTagType( |
| "blueMatrixColumnTag", "XYZType", 0x6258595A |
| // "The third column in the matrix used in TRC/matrix transforms.", |
| ); |
| |
| public static final IccTagType blueTRCTag = new IccTagType("blueTRCTag", |
| "curveType or parametricCurveType", 0x62545243 |
| // "Blue channel tone reproduction curve. The first element represents no colorant (white) or phosphors", |
| // "(black) and the last element represents 100 percent colorant (blue) or 100 percent phosphor (blue).", |
| ); |
| |
| public static final IccTagType BToA0Tag = new IccTagType("BToA0Tag", |
| "lut8Type or lut16Type or lutBtoAType", 0x42324130 |
| // "This tag defines a color transform from PCS to Device using the lookup table tag element structures. The", |
| // "processing mechanisms are described in lut8Type or lut16Type or lutBtoAType.", |
| ); |
| |
| public static final IccTagType BToA1Tag = new IccTagType("BToA1Tag", |
| "lut8Type or lut16Type or lutBtoAType", 0x42324131 |
| // "This tag defines a color transform from PCS to Device using the lookup table tag element structures. The", |
| // "processing mechanisms are described in lut8Type or lut16Type or lutBtoAType.", |
| ); |
| |
| public static final IccTagType BToA2Tag = new IccTagType("BToA2Tag", |
| "lut8Type or lut16Type or lutBtoAType", 0x42324132 |
| // "This tag defines a color transform from PCS to Device using the lookup table tag element structures. The", |
| // "processing mechanisms are described in lut8Type or lut16Type or lutBtoAType.", |
| ); |
| |
| public static final IccTagType calibrationDateTimeTag = new IccTagType( |
| "calibrationDateTimeTag", "dateTimeType", 0x63616C74 |
| // "Profile calibration date and time. Initially, this tag matches the contents of the profile headers creation", |
| // "date/time field. This allows applications and utilities to verify if this profile matches a vendors profile and", |
| // "how recently calibration has been performed.", |
| ); |
| |
| public static final IccTagType charTargetTag = new IccTagType( |
| "charTargetTag", "textType", 0x74617267 |
| // "This tag contains the name of the registered characterization data set, or it contains the measurement data", |
| // "for a characterization target. This tag is provided so that distributed utilities can identify the underlying", |
| // "characterization data, create transforms \"on the fly\" or check the current performance against the original", |
| // "device performance.", |
| // "The first seven characters of the text shall identify the nature of the characterization data.", |
| // "If the first seven characters are \"ICCHDAT\", then the remainder of the text shall be a single space followed", |
| // "by the Reference Name of a characterization data set in the ICC Characterization Data Registry and terminated", |
| // "with a NULL byte (00h). The Reference Name in the text must match exactly (including case) the", |
| // "Reference Name in the registry.", |
| // "If the first seven characters match one of the identifiers defined in an ANSI or ISO standard, then the tag", |
| // "embeds the exact data file format defined in that standard. Each of these file formats contains an identifying", |
| // "character string as the first seven characters of the format, allowing an external parser to determine", |
| // "which data file format is being used. This provides the facilities to include a wide range of targets using a", |
| // "variety of measurement specifications in a standard manner.", |
| // "NOTE: It is highly recommended that the profileDescriptionTag also include an identification of the characterization", |
| // "data that was used in the creation of the profile (e.g. \"Based on CGATS TR 001\").", |
| ); |
| |
| public static final IccTagType chromaticAdaptationTag = new IccTagType( |
| "chromaticAdaptationTag", "s15Fixed16ArrayType", 0x63686164 |
| // "This tag converts an XYZ color, measured at a device's specific illumination conditions, to an XYZ color in", |
| // "the PCS illumination conditions after complete adaptation.", |
| // "The tag reflects a survey of the currently used methods of conversion, all of which can be formulated as a", |
| // "matrix transformation (see Annex E). Such a 3 by 3 chromatic adaptation matrix is organized as a 9-element", |
| // "array of signed 15.16 numbers (s15Fixed16ArrayType tag). Similarly as in the other occurrences of a", |
| // "3 by 3 matrix in the ICC tags, the dimension corresponding to the matrix rows varies least rapidly while the", |
| // "one corresponding to the matrix columns varies most rapidly.", |
| // "(19)", |
| // "(20)", |
| // "array a0 a1 a2 a3 a4 a5 a6 a7 a8 =", |
| // "Xpcs", |
| // "Ypcs", |
| // "Zpcs", |
| // "a0 a1 a2", |
| // "a3 a4 a5", |
| // "a6 a7 a8", |
| // "Xsrc", |
| // "Ysrc", |
| // "Zsrc", |
| // "=", |
| // "Where XYZsrc represents the measured value in the actual device viewing condition and XYZpcs represents", |
| // "the chromatically adapted value in the PCS.", |
| // "The chromatic adaptation matrix is a combination of three separate conversions:", |
| // "1) Conversion of source CIE XYZ tristimulus values to cone response tristimulus values.", |
| // "2) Adjustment of the cone response values for an observers chromatic adaptation.", |
| // "3) Conversion of the adjusted cone response tristimulus back to CIE XYZ values.", |
| ); |
| |
| public static final IccTagType chromaticityTag = new IccTagType( |
| "chromaticityTag", "chromaticityType", 0x6368726D |
| // "The data and type of phosphor/colorant chromaticity set.", |
| ); |
| |
| public static final IccTagType colorantOrderTag = new IccTagType( |
| "colorantOrderTag", "colorantOrderType", 0x636C726F |
| // "This tag specifies the laydown order of colorants.", |
| ); |
| |
| public static final IccTagType colorantTableTag = new IccTagType( |
| "colorantTableTag", "colorantTableType", 0x636C7274 |
| // "This tag identifies the colorants used in the profile by a unique name and an XYZ or L*a*b* value.", |
| // "This is a required tag for profiles where the color space defined in the header is xCLR, where x is one of", |
| // "the allowed numbers from 2 through Fh, per Table 13. See Section 6.3.3.2, Section 6.3.4.1.", |
| ); |
| |
| public static final IccTagType copyrightTag = new IccTagType( |
| "copyrightTag", "multiLocalizedUnicodeType", 0x63707274 |
| // "This tag contains the text copyright information for the profile.", |
| ); |
| |
| public static final IccTagType deviceMfgDescTag = new IccTagType( |
| "deviceMfgDescTag", "multiLocalizedUnicodeType", 0x646D6E64 |
| // "Structure containing invariant and localizable versions of the device manufacturer for display. The content", |
| // "of this structure is described in 6.5.12.", |
| ); |
| |
| public static final IccTagType deviceModelDescTag = new IccTagType( |
| "deviceModelDescTag", "multiLocalizedUnicodeType", 0x646D6464 |
| // "Structure containing invariant and localizable versions of the device model for display. The content of this", |
| // "structure is described in 6.5.12.", |
| ); |
| |
| public static final IccTagType gamutTag = new IccTagType("gamutTag", |
| "lut8Type or lut16Type or lutBtoAType", 0x67616D74 |
| // "Out of gamut tag. The processing mechanisms are described in lut8Type or lut16Type or lutBtoAType.", |
| // "This tag takes PCS values as its input and produces a single channel of output. If the output value is 0, the", |
| // "PCS color is in-gamut. If the output is non-zero, the PCS color is out-of-gamut, with the output value n+1", |
| // "being at least as far out of gamut as the output value n.", |
| ); |
| |
| public static final IccTagType grayTRCTag = new IccTagType("grayTRCTag", |
| "curveType or parametricCurveType", 0x6B545243 |
| // "Gray tone reproduction curve. The tone reproduction curve provides the necessary information to convert", |
| // "between a single device channel and the CIEXYZ encoding of the profile connection space. The first element", |
| // "represents black and the last element represents white.", |
| ); |
| |
| public static final IccTagType greenMatrixColumnTag = new IccTagType( |
| "greenMatrixColumnTag", "XYZType", 0x6758595A |
| // "The second column in the matrix used in TRC/matrix transforms.", |
| ); |
| |
| public static final IccTagType greenTRCTag = new IccTagType( |
| // "6.4.21 ", |
| "greenTRCTag", "curveType or parametricCurveType", 0x67545243 |
| // "Green channel tone reproduction curve. The first element represents no colorant (white) or phosphors", |
| // "(black) and the last element represents 100 percent colorant (green) or 100 percent phosphor (green).", |
| ); |
| |
| public static final IccTagType luminanceTag = new IccTagType( |
| // "6.4.22 ", |
| "luminanceTag", "XYZType", 0x6C756D69 |
| // "Absolute luminance of emissive devices in candelas per square meter as described by the Y channel. The", |
| // "X and Z channels are ignored in all cases.", |
| ); |
| |
| public static final IccTagType measurementTag = new IccTagType( |
| // "6.4.23 ", |
| "measurementTag", "measurementType", 0x6D656173 |
| // "Alternative measurement specification such as a D65 illuminant instead of the default D50.", |
| ); |
| |
| public static final IccTagType mediaBlackPointTag = new IccTagType( |
| // "6.4.24 ", |
| "mediaBlackPointTag", "XYZType", 0x626B7074 |
| // "This tag specifies the media black point and contains the CIE 1931 XYZ colorimetry of the black point of", |
| // "the actual medium.", |
| // "NOTE Previous revisions of this specification contained an error indicating that this tag is used to calculate", |
| // "ICC-absolute colorimetry. This is not the case.", |
| ); |
| |
| public static final IccTagType mediaWhitePointTag = new IccTagType( |
| // "6.4.25 ", |
| "mediaWhitePointTag", "XYZType", 0x77747074 |
| // "This tag, which is used for generating ICC-absolute colorimetric intent, specifies the XYZ tristimulus values", |
| // "of the media white point. If the media is measured under an illumination source which has a chromaticity", |
| // "other than D50, the measured values must be adjusted to D50 using the chromaticAdaptationTag matrix", |
| // "before recording in the tag. For reflecting and transmitting media, the tag values are specified relative to", |
| // "the perfect diffuser (which is normalized to a Y value of 1,0) for illuminant D50. For displays, the values", |
| // "specified must be those of D50 (i.e. 0,9642, 1,0 0,8249) normalized such that Y = 1,0.", |
| // "See Annex A for a more complete description of the use of the media white point.", |
| ); |
| |
| public static final IccTagType namedColor2Tag = new IccTagType( |
| // "6.4.26 ", |
| "namedColor2Tag", "namedColor2Type", 0x6E636C32 |
| // "Named color information providing a PCS and optional device representation for a list of named colors.", |
| ); |
| |
| public static final IccTagType outputResponseTag = new IccTagType( |
| // "6.4.27 ", |
| "outputResponseTag", "responseCurveSet16Type", 0x72657370 |
| // "Structure containing a description of the device response for which the profile is intended. The content of", |
| // "this structure is described in 6.5.16.", |
| // "NOTE The users attention is called to the possibility that the use of this tag for device calibration may", |
| // "require use of an invention covered by patent rights. By publication of this specification, no position is", |
| // "taken with respect to the validity of this claim or of any patent rights in connection therewith. The patent", |
| // "holder has, however, filed a statement of willingness to grant a license under these rights on reasonable", |
| // "and nondiscriminatory terms and conditions to applicants desiring to obtain such a license. Details may be", |
| // "obtained from the publisher.", |
| ); |
| |
| public static final IccTagType preview0Tag = new IccTagType( |
| // "6.4.28 ", |
| "preview0Tag", "lut8Type or lut16Type or lutBtoAType", 0x70726530 |
| // "Preview transformation from PCS to device space and back to the PCS. The processing mechanisms are", |
| // "described in lut8Type or lut16Type or lutBtoAType.", |
| // "This tag contains the combination of tag B2A0 and tag A2B1.", |
| ); |
| |
| public static final IccTagType preview1Tag = new IccTagType( |
| // "6.4.29 ", |
| "preview1Tag", "lut8Type or lut16Type or lutBtoAType", 0x70726531 |
| // "Preview transformation from the PCS to device space and back to the PCS. The processing mechanisms", |
| // "are described in lut8Type or lut16Type or lutBtoAType.", |
| // "This tag contains the combination of tag B2A1 and tag A2B1.", |
| ); |
| |
| public static final IccTagType preview2Tag = new IccTagType( |
| // "6.4.30 ", |
| "preview2Tag", "lut8Type or lut16Type or lutBtoAType", 0x70726532 |
| // "Preview transformation from PCS to device space and back to the PCS. The processing mechanisms are", |
| // "described in lut8Type or lut16Type or lutBtoAType.", |
| // "This tag contains the combination of tag B2A2 and tag A2B1.", |
| ); |
| |
| public static final IccTagType profileDescriptionTag = new IccTagType( |
| // "6.4.31 ", |
| "profileDescriptionTag", "multiLocalizedUnicodeType", 0x64657363 |
| // "Structure containing invariant and localizable versions of the profile description for display. The content of", |
| // "this structure is described in 6.5.12. This invariant description has no fixed relationship to the actual profile", |
| // "disk file name.", |
| ); |
| |
| public static final IccTagType profileSequenceDescTag = new IccTagType( |
| // "6.4.32 ", |
| "profileSequenceDescTag", "profileSequenceDescType", 0x70736571 |
| // "Structure containing a description of the profile sequence from source to destination, typically used with", |
| // "the DeviceLink profile. The content of this structure is described in 6.5.15.", |
| ); |
| |
| public static final IccTagType redMatrixColumnTag = new IccTagType( |
| // "6.4.33 ", |
| "redMatrixColumnTag", "XYZType", 0x7258595A |
| // "The first column in the matrix used in TRC/matrix transforms.", |
| ); |
| |
| public static final IccTagType redTRCTag = new IccTagType( |
| // "6.4.34 ", |
| "redTRCTag", "curveType or parametricCurveType", 0x72545243 |
| // "Red channel tone reproduction curve. The first element represents no colorant (white) or phosphors", |
| // "(black) and the last element represents 100 percent colorant (red) or 100 percent phosphor (red).", |
| ); |
| |
| public static final IccTagType technologyTag = new IccTagType( |
| // "6.4.35 ", |
| "technologyTag", "signatureType", 0x74656368 |
| // "Device technology information such as CRT, Dye Sublimation, etc. The encoding is such that:", |
| ); |
| |
| public static final IccTagType viewingCondDescTag = new IccTagType( |
| // "6.4.36 ", |
| "viewingCondDescTag", "multiLocalizedUnicodeType", 0x76756564 |
| // "Structure containing invariant and localizable versions of the viewing conditions. The content of this structure", |
| // "is described in 6.5.12.", |
| |
| ); |
| |
| public static final IccTagType viewingConditionsTag = new IccTagType( |
| // "6.4.37 ", |
| "viewingConditionsTag", "viewingConditionsType", 0x76696577 |
| // "Viewing conditions parameters. The content of this structure is described in 6.5.25.", |
| ); |
| |
| // public static final IccTagType = new IccTagType( |
| // // "6.4.37 ", |
| // "viewingConditionsTag", "viewingConditionsType", 0x76696577 |
| // // "Viewing conditions parameters. The content of this structure is described in 6.5.25.", |
| // ); |
| |
| public static final IccTagType TagTypes[] = { |
| AToB0Tag, AToB1Tag, AToB2Tag, blueMatrixColumnTag, blueTRCTag, |
| BToA0Tag, BToA1Tag, BToA2Tag, calibrationDateTimeTag, |
| charTargetTag, chromaticAdaptationTag, chromaticityTag, |
| colorantOrderTag, colorantTableTag, copyrightTag, deviceMfgDescTag, |
| deviceModelDescTag, gamutTag, grayTRCTag, greenMatrixColumnTag, |
| greenTRCTag, luminanceTag, measurementTag, mediaBlackPointTag, |
| mediaWhitePointTag, namedColor2Tag, outputResponseTag, preview0Tag, |
| preview1Tag, preview2Tag, profileDescriptionTag, |
| profileSequenceDescTag, redMatrixColumnTag, redTRCTag, |
| technologyTag, viewingCondDescTag, viewingConditionsTag, |
| }; |
| |
| } |