summaryrefslogtreecommitdiffstats
path: root/awt/java/awt/color/ICC_Profile.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/java/awt/color/ICC_Profile.java')
-rw-r--r--awt/java/awt/color/ICC_Profile.java1231
1 files changed, 1231 insertions, 0 deletions
diff --git a/awt/java/awt/color/ICC_Profile.java b/awt/java/awt/color/ICC_Profile.java
new file mode 100644
index 0000000..ad704e0
--- /dev/null
+++ b/awt/java/awt/color/ICC_Profile.java
@@ -0,0 +1,1231 @@
+/*
+ * 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.
+ */
+/**
+ * @author Oleg V. Khaschansky
+ * @version $Revision$
+ */
+package java.awt.color;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamException;
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.StringTokenizer;
+
+import org.apache.harmony.awt.gl.color.ICC_ProfileHelper;
+import org.apache.harmony.awt.gl.color.NativeCMM;
+import org.apache.harmony.awt.internal.nls.Messages;
+
+/**
+ * The ICC_Profile class represents a color profile data for color spaces
+ * based on the International Color Consortium Specification ICC.1:2001-12,
+ * File Format for Color Profiles.
+ */
+public class ICC_Profile implements Serializable {
+
+ /** The Constant serialVersionUID. */
+ private static final long serialVersionUID = -3938515861990936766L;
+
+ // NOTE: Constant field values are noted in 1.5 specification.
+
+ /**
+ * The Constant CLASS_INPUT indicates that profile class is input.
+ */
+ public static final int CLASS_INPUT = 0;
+
+ /**
+ * The Constant CLASS_DISPLAY indicates that profile class is display.
+ */
+ public static final int CLASS_DISPLAY = 1;
+
+ /**
+ * The Constant CLASS_OUTPUT indicates that profile class is output.
+ */
+ public static final int CLASS_OUTPUT = 2;
+
+ /**
+ * The Constant CLASS_DEVICELINK indicates that profile class
+ * is device link.
+ */
+ public static final int CLASS_DEVICELINK = 3;
+
+ /**
+ * The Constant CLASS_COLORSPACECONVERSION indicates that profile class
+ * is color space conversion.
+ */
+ public static final int CLASS_COLORSPACECONVERSION = 4;
+
+ /** The Constant CLASS_ABSTRACT indicates that profile class is abstract. */
+ public static final int CLASS_ABSTRACT = 5;
+
+ /**
+ * The Constant CLASS_NAMEDCOLOR indicates that profile class
+ * is named color.
+ */
+ public static final int CLASS_NAMEDCOLOR = 6;
+
+ /** The Constant icSigXYZData - ICC Profile Color Space Type Signature. */
+ public static final int icSigXYZData = 1482250784;
+
+ /** The Constant icSigLabData - ICC Profile Color Space Type Signature. */
+ public static final int icSigLabData = 1281450528;
+
+ /** The Constant icSigLuvData - ICC Profile Color Space Type Signature. */
+ public static final int icSigLuvData = 1282766368;
+
+ /** The Constant icSigYCbCrData - ICC Profile Color Space Type Signature. */
+ public static final int icSigYCbCrData = 1497588338;
+
+ /** The Constant icSigYxyData - ICC Profile Color Space Type Signature. */
+ public static final int icSigYxyData = 1501067552;
+
+ /** The Constant icSigRgbData - ICC Profile Color Space Type Signature. */
+ public static final int icSigRgbData = 1380401696;
+
+ /** The Constant icSigGrayData - ICC Profile Color Space Type Signature. */
+ public static final int icSigGrayData = 1196573017;
+
+ /** The Constant icSigHsvData - ICC Profile Color Space Type Signature. */
+ public static final int icSigHsvData = 1213421088;
+
+ /** The Constant icSigHlsData - ICC Profile Color Space Type Signature. */
+ public static final int icSigHlsData = 1212961568;
+
+ /** The Constant icSigCmykData - ICC Profile Color Space Type Signature. */
+ public static final int icSigCmykData = 1129142603;
+
+ /** The Constant icSigCmyData - ICC Profile Color Space Type Signature. */
+ public static final int icSigCmyData = 1129142560;
+
+ /** The Constant icSigSpace2CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace2CLR = 843271250;
+
+ /** The Constant icSigSpace3CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace3CLR = 860048466;
+
+ /** The Constant icSigSpace4CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace4CLR = 876825682;
+
+ /** The Constant icSigSpace5CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace5CLR = 893602898;
+
+ /** The Constant icSigSpace6CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace6CLR = 910380114;
+
+ /** The Constant icSigSpace7CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace7CLR = 927157330;
+
+ /** The Constant icSigSpace8CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace8CLR = 943934546;
+
+ /** The Constant icSigSpace9CLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpace9CLR = 960711762;
+
+ /** The Constant icSigSpaceACLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpaceACLR = 1094929490;
+
+ /** The Constant icSigSpaceBCLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpaceBCLR = 1111706706;
+
+ /** The Constant icSigSpaceCCLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpaceCCLR = 1128483922;
+
+ /** The Constant icSigSpaceDCLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpaceDCLR = 1145261138;
+
+ /** The Constant icSigSpaceECLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpaceECLR = 1162038354;
+
+ /** The Constant icSigSpaceFCLR - ICC Profile Color Space Type Signature. */
+ public static final int icSigSpaceFCLR = 1178815570;
+
+ /** The Constant icSigInputClass - ICC Profile Class Signature. */
+ public static final int icSigInputClass = 1935896178;
+
+ /** The Constant icSigDisplayClass - ICC Profile Class Signature. */
+ public static final int icSigDisplayClass = 1835955314;
+
+ /** The Constant icSigOutputClass - ICC Profile Class Signature. */
+ public static final int icSigOutputClass = 1886549106;
+
+ /** The Constant icSigLinkClass - ICC Profile Class Signature. */
+ public static final int icSigLinkClass = 1818848875;
+
+ /** The Constant icSigAbstractClass - ICC Profile Class Signature. */
+ public static final int icSigAbstractClass = 1633842036;
+
+ /** The Constant icSigColorantOrderTag - ICC Profile Tag Signature. */
+ public static final int icSigColorantOrderTag = 1668051567;
+
+ /** The Constant icSigColorantTableTag - ICC Profile Tag Signature. */
+ public static final int icSigColorantTableTag = 1668051572;
+
+ /** The Constant icSigColorSpaceClass - ICC Profile Tag Signature. */
+ public static final int icSigColorSpaceClass = 1936744803;
+
+ /** The Constant icSigNamedColorClass - ICC Profile Tag Signature. */
+ public static final int icSigNamedColorClass = 1852662636;
+
+ /** The Constant icPerceptual - ICC Profile Rendering Intent. */
+ public static final int icPerceptual = 0;
+
+ /** The Constant icRelativeColorimetric - ICC Profile Rendering Intent. */
+ public static final int icRelativeColorimetric = 1;
+
+ /** The Constant icSaturation - ICC Profile Rendering Intent. */
+ public static final int icSaturation = 2;
+
+ /** The Constant icAbsoluteColorimetric - ICC Profile Rendering Intent. */
+ public static final int icAbsoluteColorimetric = 3;
+
+ /** The Constant icSigHead - ICC Profile Tag Signature. */
+ public static final int icSigHead = 1751474532;
+
+ /** The Constant icSigAToB0Tag - ICC Profile Tag Signature. */
+ public static final int icSigAToB0Tag = 1093812784;
+
+ /** The Constant icSigAToB1Tag - ICC Profile Tag Signature. */
+ public static final int icSigAToB1Tag = 1093812785;
+
+ /** The Constant icSigAToB2Tag - ICC Profile Tag Signature. */
+ public static final int icSigAToB2Tag = 1093812786;
+
+ /** The Constant icSigBlueColorantTag - ICC Profile Tag Signature. */
+ public static final int icSigBlueColorantTag = 1649957210;
+
+ /** The Constant icSigBlueMatrixColumnTag - ICC Profile Tag Signature. */
+ public static final int icSigBlueMatrixColumnTag = 1649957210;
+
+ /** The Constant icSigBlueTRCTag - ICC Profile Tag Signature. */
+ public static final int icSigBlueTRCTag = 1649693251;
+
+ /** The Constant icSigBToA0Tag - ICC Profile Tag Signature. */
+ public static final int icSigBToA0Tag = 1110589744;
+
+ /** The Constant icSigBToA1Tag - ICC Profile Tag Signature. */
+ public static final int icSigBToA1Tag = 1110589745;
+
+ /** The Constant icSigBToA2Tag - ICC Profile Tag Signature. */
+ public static final int icSigBToA2Tag = 1110589746;
+
+ /** The Constant icSigCalibrationDateTimeTag - ICC Profile Tag Signature. */
+ public static final int icSigCalibrationDateTimeTag = 1667329140;
+
+ /** The Constant icSigCharTargetTag - ICC Profile Tag Signature. */
+ public static final int icSigCharTargetTag = 1952543335;
+
+ /** The Constant icSigCopyrightTag - ICC Profile Tag Signature. */
+ public static final int icSigCopyrightTag = 1668313716;
+
+ /** The Constant icSigCrdInfoTag - ICC Profile Tag Signature. */
+ public static final int icSigCrdInfoTag = 1668441193;
+
+ /** The Constant icSigDeviceMfgDescTag - ICC Profile Tag Signature. */
+ public static final int icSigDeviceMfgDescTag = 1684893284;
+
+ /** The Constant icSigDeviceModelDescTag - ICC Profile Tag Signature. */
+ public static final int icSigDeviceModelDescTag = 1684890724;
+
+ /** The Constant icSigDeviceSettingsTag - ICC Profile Tag Signature. */
+ public static final int icSigDeviceSettingsTag = 1684371059;
+
+ /** The Constant icSigGamutTag - ICC Profile Tag Signature. */
+ public static final int icSigGamutTag = 1734438260;
+
+ /** The Constant icSigGrayTRCTag - ICC Profile Tag Signature. */
+ public static final int icSigGrayTRCTag = 1800688195;
+
+ /** The Constant icSigGreenColorantTag - ICC Profile Tag Signature. */
+ public static final int icSigGreenColorantTag = 1733843290;
+
+ /** The Constant icSigGreenMatrixColumnTag - ICC Profile Tag Signature. */
+ public static final int icSigGreenMatrixColumnTag = 1733843290;
+
+ /** The Constant icSigGreenTRCTag - ICC Profile Tag Signature. */
+ public static final int icSigGreenTRCTag = 1733579331;
+
+ /** The Constant icSigLuminanceTag - ICC Profile Tag Signature. */
+ public static final int icSigLuminanceTag = 1819635049;
+
+ /** The Constant icSigMeasurementTag - ICC Profile Tag Signature. */
+ public static final int icSigMeasurementTag = 1835360627;
+
+ /** The Constant icSigMediaBlackPointTag - ICC Profile Tag Signature. */
+ public static final int icSigMediaBlackPointTag = 1651208308;
+
+ /** The Constant icSigMediaWhitePointTag - ICC Profile Tag Signature. */
+ public static final int icSigMediaWhitePointTag = 2004119668;
+
+ /** The Constant icSigNamedColor2Tag - ICC Profile Tag Signature. */
+ public static final int icSigNamedColor2Tag = 1852009522;
+
+ /** The Constant icSigOutputResponseTag - ICC Profile Tag Signature. */
+ public static final int icSigOutputResponseTag = 1919251312;
+
+ /** The Constant icSigPreview0Tag - ICC Profile Tag Signature. */
+ public static final int icSigPreview0Tag = 1886545200;
+
+ /** The Constant icSigPreview1Tag - ICC Profile Tag Signature. */
+ public static final int icSigPreview1Tag = 1886545201;
+
+ /** The Constant icSigPreview2Tag - ICC Profile Tag Signature. */
+ public static final int icSigPreview2Tag = 1886545202;
+
+ /** The Constant icSigProfileDescriptionTag - ICC Profile Tag Signature. */
+ public static final int icSigProfileDescriptionTag = 1684370275;
+
+ /** The Constant icSigProfileSequenceDescTag - ICC Profile Tag Signature. */
+ public static final int icSigProfileSequenceDescTag = 1886610801;
+
+ /** The Constant icSigPs2CRD0Tag - ICC Profile Tag Signature. */
+ public static final int icSigPs2CRD0Tag = 1886610480;
+
+ /** The Constant icSigPs2CRD1Tag - ICC Profile Tag Signature. */
+ public static final int icSigPs2CRD1Tag = 1886610481;
+
+ /** The Constant icSigPs2CRD2Tag - ICC Profile Tag Signature. */
+ public static final int icSigPs2CRD2Tag = 1886610482;
+
+ /** The Constant icSigPs2CRD3Tag - ICC Profile Tag Signature. */
+ public static final int icSigPs2CRD3Tag = 1886610483;
+
+ /** The Constant icSigPs2CSATag - ICC Profile Tag Signature. */
+ public static final int icSigPs2CSATag = 1886597747;
+
+ /** The Constant icSigPs2RenderingIntentTag - ICC Profile Tag Signature. */
+ public static final int icSigPs2RenderingIntentTag = 1886597737;
+
+ /** The Constant icSigRedColorantTag - ICC Profile Tag Signature. */
+ public static final int icSigRedColorantTag = 1918392666;
+
+ /** The Constant icSigRedMatrixColumnTag - ICC Profile Tag Signature. */
+ public static final int icSigRedMatrixColumnTag = 1918392666;
+
+ /** The Constant icSigRedTRCTag - ICC Profile Tag Signature. */
+ public static final int icSigRedTRCTag = 1918128707;
+
+ /** The Constant icSigScreeningDescTag - ICC Profile Tag Signature. */
+ public static final int icSigScreeningDescTag = 1935897188;
+
+ /** The Constant icSigScreeningTag - ICC Profile Tag Signature. */
+ public static final int icSigScreeningTag = 1935897198;
+
+ /** The Constant icSigTechnologyTag - ICC Profile Tag Signature. */
+ public static final int icSigTechnologyTag = 1952801640;
+
+ /** The Constant icSigUcrBgTag - ICC Profile Tag Signature. */
+ public static final int icSigUcrBgTag = 1650877472;
+
+ /** The Constant icSigViewingCondDescTag - ICC Profile Tag Signature. */
+ public static final int icSigViewingCondDescTag = 1987405156;
+
+ /** The Constant icSigViewingConditionsTag - ICC Profile Tag Signature. */
+ public static final int icSigViewingConditionsTag = 1986618743;
+
+ /** The Constant icSigChromaticAdaptationTag - ICC Profile Tag Signature. */
+ public static final int icSigChromaticAdaptationTag = 1667785060;
+
+ /** The Constant icSigChromaticityTag - ICC Profile Tag Signature. */
+ public static final int icSigChromaticityTag = 1667789421;
+
+ /** The Constant icHdrSize - ICC Profile Header Location. */
+ public static final int icHdrSize = 0;
+
+ /** The Constant icHdrCmmId - ICC Profile Header Location. */
+ public static final int icHdrCmmId = 4;
+
+ /** The Constant icHdrVersion - ICC Profile Header Location. */
+ public static final int icHdrVersion = 8;
+
+ /** The Constant icHdrDeviceClass - ICC Profile Header Location. */
+ public static final int icHdrDeviceClass = 12;
+
+ /** The Constant icHdrColorSpace - ICC Profile Header Location. */
+ public static final int icHdrColorSpace = 16;
+
+ /** The Constant icHdrPcs - ICC Profile Header Location. */
+ public static final int icHdrPcs = 20;
+
+ /** The Constant icHdrDate - ICC Profile Header Location. */
+ public static final int icHdrDate = 24;
+
+ /** The Constant icHdrMagic - ICC Profile Header Location. */
+ public static final int icHdrMagic = 36;
+
+ /** The Constant icHdrPlatform - ICC Profile Header Location. */
+ public static final int icHdrPlatform = 40;
+
+ /** The Constant icHdrProfileID - ICC Profile Header Location. */
+ public static final int icHdrProfileID = 84;
+
+ /** The Constant icHdrFlags - ICC Profile Header Location. */
+ public static final int icHdrFlags = 44;
+
+ /** The Constant icHdrManufacturer - ICC Profile Header Location. */
+ public static final int icHdrManufacturer = 48;
+
+ /** The Constant icHdrModel - ICC Profile Header Location. */
+ public static final int icHdrModel = 52;
+
+ /** The Constant icHdrAttributes - ICC Profile Header Location. */
+ public static final int icHdrAttributes = 56;
+
+ /** The Constant icHdrRenderingIntent - ICC Profile Header Location. */
+ public static final int icHdrRenderingIntent = 64;
+
+ /** The Constant icHdrIlluminant - ICC Profile Header Location. */
+ public static final int icHdrIlluminant = 68;
+
+ /** The Constant icHdrCreator - ICC Profile Header Location. */
+ public static final int icHdrCreator = 80;
+
+ /** The Constant icICCAbsoluteColorimetric - ICC Profile Rendering Intent. */
+ public static final int icICCAbsoluteColorimetric = 3;
+
+ /** The Constant icMediaRelativeColorimetric - ICC Profile Rendering Intent. */
+ public static final int icMediaRelativeColorimetric = 1;
+
+ /** The Constant icTagType - ICC Profile Constant. */
+ public static final int icTagType = 0;
+
+ /** The Constant icTagReserved - ICC Profile Constant. */
+ public static final int icTagReserved = 4;
+
+ /** The Constant icCurveCount - ICC Profile Constant. */
+ public static final int icCurveCount = 8;
+
+ /** The Constant icCurveData - ICC Profile Constant. */
+ public static final int icCurveData = 12;
+
+ /** The Constant icXYZNumberX - ICC Profile Constant. */
+ public static final int icXYZNumberX = 8;
+
+ /** Size of a profile header. */
+ private static final int headerSize = 128;
+
+ /** header magic number. */
+ private static final int headerMagicNumber = 0x61637370;
+
+ // Cache of predefined profiles
+ /** The s rgb profile. */
+ private static ICC_Profile sRGBProfile;
+
+ /** The xyz profile. */
+ private static ICC_Profile xyzProfile;
+
+ /** The gray profile. */
+ private static ICC_Profile grayProfile;
+
+ /** The pycc profile. */
+ private static ICC_Profile pyccProfile;
+
+ /** The linear rgb profile. */
+ private static ICC_Profile linearRGBProfile;
+
+ /** Handle to the current profile. */
+ private transient long profileHandle = 0;
+
+ /** If handle is used by another class this object is not responsible for closing profile. */
+ private transient boolean handleStolen = false;
+
+ /** Cached header data. */
+ private transient byte[] headerData = null;
+
+ /** Serialization support. */
+ private transient ICC_Profile openedProfileObject;
+
+ /**
+ * Instantiates a new iC c_ profile.
+ *
+ * @param data the data
+ */
+ private ICC_Profile(byte[] data) {
+ profileHandle = NativeCMM.cmmOpenProfile(data);
+ NativeCMM.addHandle(this, profileHandle);
+ }
+
+ /**
+ * Used to instantiate dummy ICC_ProfileStub objects.
+ */
+ ICC_Profile() {
+ }
+
+ /**
+ * Used to instantiate subclasses (ICC_ProfileGrey and ICC_ProfileRGB).
+ *
+ * @param profileHandle - should be valid handle to opened color profile
+ */
+ ICC_Profile(long profileHandle) {
+ this.profileHandle = profileHandle;
+ // A new object reference, need to add it.
+ NativeCMM.addHandle(this, profileHandle);
+ }
+
+ /**
+ * Writes the ICC_Profile to a file with the specified name.
+ *
+ * @param fileName the file name.
+ *
+ * @throws IOException signals that an I/O exception has occurred during
+ * writing or opening the file.
+ */
+ public void write(String fileName) throws IOException {
+ FileOutputStream oStream = new FileOutputStream(fileName);
+ oStream.write(getData());
+ oStream.close();
+ }
+
+ /**
+ * Serializable implementation.
+ *
+ * @param s the s
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ private void writeObject(ObjectOutputStream s) throws IOException {
+ s.defaultWriteObject();
+ s.writeObject(null);
+ s.writeObject(getData());
+ }
+
+ /**
+ * Serializable implementation.
+ *
+ * @param s the s
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws ClassNotFoundException the class not found exception
+ */
+ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
+ s.defaultReadObject();
+ String colorSpaceStr = (String)s.readObject();
+ byte[] data = (byte[])s.readObject();
+
+ if (colorSpaceStr != null) {
+ if (colorSpaceStr.equals("CS_sRGB")) { //$NON-NLS-1$
+ openedProfileObject = getInstance(ColorSpace.CS_sRGB);
+ } else if (colorSpaceStr.equals("CS_GRAY")) { //$NON-NLS-1$
+ openedProfileObject = getInstance(ColorSpace.CS_GRAY);
+ } else if (colorSpaceStr.equals("CS_LINEAR_RGB")) { //$NON-NLS-1$
+ openedProfileObject = getInstance(ColorSpace.CS_LINEAR_RGB);
+ } else if (colorSpaceStr.equals("CS_CIEXYZ")) { //$NON-NLS-1$
+ openedProfileObject = getInstance(ColorSpace.CS_CIEXYZ);
+ } else if (colorSpaceStr.equals("CS_PYCC")) { //$NON-NLS-1$
+ openedProfileObject = getInstance(ColorSpace.CS_PYCC);
+ } else {
+ openedProfileObject = ICC_Profile.getInstance(data);
+ }
+ } else {
+ openedProfileObject = ICC_Profile.getInstance(data);
+ }
+ }
+
+ /**
+ * Resolves instances being deserialized into instances registered with CMM.
+ *
+ * @return ICC_Profile object for profile registered with CMM.
+ *
+ * @throws ObjectStreamException if there is an error in the serialized
+ * files or during the process of reading them.
+ */
+ protected Object readResolve() throws ObjectStreamException {
+ return openedProfileObject;
+ }
+
+ /**
+ * Writes the ICC_Profile to an OutputStream.
+ *
+ * @param s the OutputStream.
+ *
+ * @throws IOException signals that an I/O exception has occurred during
+ * writing or opening OutputStream.
+ */
+ public void write(OutputStream s) throws IOException {
+ s.write(getData());
+ }
+
+ /**
+ * Sets a tagged data element in the profile from a byte array.
+ *
+ * @param tagSignature the ICC tag signature for the data element to be set.
+ * @param tagData the data to be set for the specified tag signature.
+ */
+ public void setData(int tagSignature, byte[] tagData) {
+ NativeCMM.cmmSetProfileElement(profileHandle, tagSignature, tagData);
+ // Remove cached header data if header is modified
+ if (tagSignature == icSigHead) {
+ headerData = null;
+ }
+ }
+
+ /**
+ * Gets a tagged data element from the profile as a byte array.
+ * Elements are identified by tag signatures as defined in
+ * the ICC specification.
+ *
+ * @param tagSignature the ICC tag signature for the data element to get.
+ *
+ * @return a byte array that contains the tagged data element.
+ */
+ public byte[] getData(int tagSignature) {
+ int tagSize = 0;
+ try {
+ tagSize = NativeCMM.cmmGetProfileElementSize(
+ profileHandle,
+ tagSignature
+ );
+ } catch (CMMException e) {
+ // We'll get this exception if there's no element with
+ // the specified tag signature
+ return null;
+ }
+
+ byte[] data = new byte[tagSize];
+ NativeCMM.cmmGetProfileElement(profileHandle, tagSignature, data);
+ return data;
+ }
+
+ /**
+ * Gets a data byte array of this ICC_Profile.
+ *
+ * @return a byte array that contains the ICC Profile data.
+ */
+ public byte[] getData() {
+ int profileSize = NativeCMM.cmmGetProfileSize(profileHandle);
+ byte[] data = new byte[profileSize];
+ NativeCMM.cmmGetProfile(profileHandle, data);
+ return data;
+ }
+
+ /**
+ * Frees the resources associated with an ICC_Profile object.
+ */
+ @Override
+ protected void finalize() {
+ if (profileHandle!=0 && !handleStolen) {
+ NativeCMM.cmmCloseProfile(profileHandle);
+ }
+
+ // Always remove because key no more exist
+ // when object is destroyed
+ NativeCMM.removeHandle(this);
+ }
+
+ /**
+ * Gets the profile class.
+ *
+ * @return the profile class constant.
+ */
+ public int getProfileClass() {
+ int deviceClassSignature = getIntFromHeader(icHdrDeviceClass);
+
+ switch (deviceClassSignature) {
+ case icSigColorSpaceClass:
+ return CLASS_COLORSPACECONVERSION;
+ case icSigDisplayClass:
+ return CLASS_DISPLAY;
+ case icSigOutputClass:
+ return CLASS_OUTPUT;
+ case icSigInputClass:
+ return CLASS_INPUT;
+ case icSigLinkClass:
+ return CLASS_DEVICELINK;
+ case icSigAbstractClass:
+ return CLASS_ABSTRACT;
+ case icSigNamedColorClass:
+ return CLASS_NAMEDCOLOR;
+ default:
+ }
+
+ // Not an ICC profile class
+ // awt.15F=Profile class does not comply with ICC specification
+ throw new IllegalArgumentException(Messages.getString("awt.15F")); //$NON-NLS-1$
+
+ }
+
+ /**
+ * Returns the color space type of the Profile Connection Space (PCS).
+ *
+ * @return the PCS type.
+ */
+ public int getPCSType() {
+ return csFromSignature(getIntFromHeader(icHdrPcs));
+ }
+
+ /**
+ * Gets the number of components of this ICC Profile.
+ *
+ * @return the number of components of this ICC Profile.
+ */
+ public int getNumComponents() {
+ switch (getIntFromHeader(icHdrColorSpace)) {
+ // The most common cases go first to increase speed
+ case icSigRgbData:
+ case icSigXYZData:
+ case icSigLabData:
+ return 3;
+ case icSigCmykData:
+ return 4;
+ // Then all other
+ case icSigGrayData:
+ return 1;
+ case icSigSpace2CLR:
+ return 2;
+ case icSigYCbCrData:
+ case icSigLuvData:
+ case icSigYxyData:
+ case icSigHlsData:
+ case icSigHsvData:
+ case icSigCmyData:
+ case icSigSpace3CLR:
+ return 3;
+ case icSigSpace4CLR:
+ return 4;
+ case icSigSpace5CLR:
+ return 5;
+ case icSigSpace6CLR:
+ return 6;
+ case icSigSpace7CLR:
+ return 7;
+ case icSigSpace8CLR:
+ return 8;
+ case icSigSpace9CLR:
+ return 9;
+ case icSigSpaceACLR:
+ return 10;
+ case icSigSpaceBCLR:
+ return 11;
+ case icSigSpaceCCLR:
+ return 12;
+ case icSigSpaceDCLR:
+ return 13;
+ case icSigSpaceECLR:
+ return 14;
+ case icSigSpaceFCLR:
+ return 15;
+ default:
+ }
+
+ // awt.160=Color space doesn't comply with ICC specification
+ throw new ProfileDataException(Messages.getString("awt.160") //$NON-NLS-1$
+ );
+ }
+
+ /**
+ * Gets the minor version of this ICC profile.
+ *
+ * @return the minor version of this ICC profile.
+ */
+ public int getMinorVersion() {
+ return getByteFromHeader(icHdrVersion+1);
+ }
+
+ /**
+ * Gets the major version of this ICC profile.
+ *
+ * @return the major version of this ICC profile.
+ */
+ public int getMajorVersion() {
+ return getByteFromHeader(icHdrVersion);
+ }
+
+ /**
+ * Gets the color space type of this ICC_Profile.
+ *
+ * @return the color space type.
+ */
+ public int getColorSpaceType() {
+ return csFromSignature(getIntFromHeader(icHdrColorSpace));
+ }
+
+ /**
+ * Tries to open file at the specified path. Path entries can be
+ * divided by a separator character.
+ *
+ * @param path the path
+ * @param fileName the file name
+ *
+ * @return the file input stream
+ */
+ private static FileInputStream tryPath(String path, String fileName) {
+ FileInputStream fiStream = null;
+
+ if (path == null) {
+ return null;
+ }
+
+ StringTokenizer st = new StringTokenizer(path, File.pathSeparator);
+
+ while (st.hasMoreTokens()) {
+ String pathEntry = st.nextToken();
+ try {
+ fiStream = new FileInputStream(pathEntry + File.separatorChar + fileName);
+ if (fiStream != null) {
+ return fiStream;
+ }
+ } catch (FileNotFoundException e) {}
+ }
+
+ return fiStream;
+ }
+
+ /**
+ * Gets the single instance of ICC_Profile from data in the specified file.
+ *
+ * @param fileName the specified name of file with ICC profile data.
+ *
+ * @return single instance of ICC_Profile.
+ *
+ * @throws IOException signals that an I/O error occured while reading the file
+ * or the file doesn't exist.
+ */
+ public static ICC_Profile getInstance(String fileName) throws IOException {
+ final String fName = fileName; // to use in the privileged block
+
+ FileInputStream fiStream = (FileInputStream) AccessController.doPrivileged(
+ new PrivilegedAction<FileInputStream>() {
+ public FileInputStream run() {
+ FileInputStream fiStream = null;
+
+ // Open absolute path
+ try {
+ fiStream = new FileInputStream(fName);
+ if (fiStream != null) {
+ return fiStream;
+ }
+ } catch (FileNotFoundException e) {}
+
+ // Check java.iccprofile.path entries
+ fiStream = tryPath(System.getProperty("java.iccprofile.path"), fName); //$NON-NLS-1$
+ if (fiStream != null) {
+ return fiStream;
+ }
+
+ // Check java.class.path entries
+ fiStream = tryPath(System.getProperty("java.class.path"), fName); //$NON-NLS-1$
+ if (fiStream != null) {
+ return fiStream;
+ }
+
+ // Check directory with java sample profiles
+ String home = System.getProperty("java.home"); //$NON-NLS-1$
+ if (home != null) {
+ fiStream = tryPath(
+ home + File.separatorChar +
+ "lib" + File.separatorChar + "cmm", fName //$NON-NLS-1$ //$NON-NLS-2$
+ );
+ }
+
+ return fiStream;
+ }
+ });
+
+ if (fiStream == null) {
+ // awt.161=Unable to open file {0}
+ throw new IOException(Messages.getString("awt.161", fileName)); //$NON-NLS-1$
+ }
+
+ ICC_Profile pf = getInstance(fiStream);
+ fiStream.close();
+ return pf;
+ }
+
+ /**
+ * Gets the single instance of ICC_Profile with data in
+ * the specified InputStream.
+ *
+ * @param s the InputStream with ICC profile data.
+ *
+ * @return single instance of ICC_Profile.
+ *
+ * @throws IOException if an I/O exception has occurred during reading
+ * from InputStream.
+ * @throws IllegalArgumentException if the file does not contain valid
+ * ICC Profile data.
+ */
+ public static ICC_Profile getInstance(InputStream s) throws IOException {
+ byte[] header = new byte[headerSize];
+ // awt.162=Invalid ICC Profile Data
+ String invalidDataMessage = Messages.getString("awt.162"); //$NON-NLS-1$
+
+ // Get header from the input stream
+ if (s.read(header) != headerSize) {
+ throw new IllegalArgumentException(invalidDataMessage);
+ }
+
+ // Check the profile data for consistency
+ if (
+ ICC_ProfileHelper.getBigEndianFromByteArray(header, icHdrMagic) !=
+ headerMagicNumber
+ ) {
+ throw new IllegalArgumentException(invalidDataMessage);
+ }
+
+ // Get profile size from header, create an array for profile data
+ int profileSize = ICC_ProfileHelper.getBigEndianFromByteArray(header, icHdrSize);
+ byte[] profileData = new byte[profileSize];
+
+ // Copy header into it
+ System.arraycopy(header, 0, profileData, 0, headerSize);
+
+ // Read the profile itself
+ if (
+ s.read(profileData, headerSize, profileSize - headerSize) !=
+ profileSize - headerSize
+ ) {
+ throw new IllegalArgumentException(invalidDataMessage);
+ }
+
+ return getInstance(profileData);
+ }
+
+ /**
+ * Gets the single instance of ICC_Profile from the specified data in
+ * a byte array.
+ *
+ * @param data the byte array of ICC profile.
+ *
+ * @return single instance of ICC_Profile from the specified data in
+ * a byte array.
+ *
+ * @throws IllegalArgumentException if the file does not contain valid
+ * ICC Profile data.
+ */
+ public static ICC_Profile getInstance(byte[] data) {
+ ICC_Profile res = null;
+
+ try {
+ res = new ICC_Profile(data);
+ } catch (CMMException e) {
+ // awt.162=Invalid ICC Profile Data
+ throw new IllegalArgumentException(Messages.getString("awt.162")); //$NON-NLS-1$
+ }
+
+ if (System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0) { //$NON-NLS-1$ //$NON-NLS-2$
+ try {
+ if ( res.getColorSpaceType () == ColorSpace.TYPE_RGB &&
+ res.getDataSize(icSigMediaWhitePointTag) > 0 &&
+ res.getDataSize(icSigRedColorantTag) > 0 &&
+ res.getDataSize(icSigGreenColorantTag) > 0 &&
+ res.getDataSize(icSigBlueColorantTag) > 0 &&
+ res.getDataSize(icSigRedTRCTag) > 0 &&
+ res.getDataSize(icSigGreenTRCTag) > 0 &&
+ res.getDataSize(icSigBlueTRCTag) > 0
+ ) {
+ res = new ICC_ProfileRGB(res.getProfileHandle());
+ } else if ( res.getColorSpaceType () == ColorSpace.TYPE_GRAY &&
+ res.getDataSize(icSigMediaWhitePointTag) > 0 &&
+ res.getDataSize(icSigGrayTRCTag) > 0
+ ) {
+ res = new ICC_ProfileGray (res.getProfileHandle());
+ }
+
+ } catch (CMMException e) { /* return res in this case */ }
+ }
+
+ return res;
+ }
+
+ /**
+ * Gets the single instance of ICC_Profile with the specific color space
+ * defined by the ColorSpace class: CS_sRGB, CS_LINEAR_RGB, CS_CIEXYZ,
+ * CS_PYCC, CS_GRAY.
+ *
+ * @param cspace the type of color space defined in the ColorSpace class.
+ *
+ * @return single instance of ICC_Profile.
+ *
+ * @throws IllegalArgumentException is not one of the defined color
+ * space types.
+ */
+ public static ICC_Profile getInstance(int cspace) {
+ try {
+ switch (cspace) {
+
+ case ColorSpace.CS_sRGB:
+ if (sRGBProfile == null) {
+ sRGBProfile = getInstance("sRGB.pf"); //$NON-NLS-1$
+ }
+ return sRGBProfile;
+
+ case ColorSpace.CS_CIEXYZ:
+ if (xyzProfile == null) {
+ xyzProfile = getInstance("CIEXYZ.pf"); //$NON-NLS-1$
+ }
+ return xyzProfile;
+
+ case ColorSpace.CS_GRAY:
+ if (grayProfile == null) {
+ grayProfile = getInstance("GRAY.pf"); //$NON-NLS-1$
+ }
+ return grayProfile;
+
+ case ColorSpace.CS_PYCC:
+ if (pyccProfile == null) {
+ pyccProfile = getInstance("PYCC.pf"); //$NON-NLS-1$
+ }
+ return pyccProfile;
+
+ case ColorSpace.CS_LINEAR_RGB:
+ if (linearRGBProfile == null) {
+ linearRGBProfile = getInstance("LINEAR_RGB.pf"); //$NON-NLS-1$
+ }
+ return linearRGBProfile;
+ }
+
+ } catch (IOException e) {
+ // awt.163=Can't open color profile
+ throw new IllegalArgumentException(Messages.getString("Can't open color profile")); //$NON-NLS-1$
+ }
+
+ // awt.164=Not a predefined color space
+ throw new IllegalArgumentException(Messages.getString("Not a predefined color space")); //$NON-NLS-1$
+ }
+
+ /**
+ * Reads an integer from the profile header at the specified position.
+ *
+ * @param idx - offset in bytes from the beginning of the header
+ *
+ * @return the int from header
+ */
+ private int getIntFromHeader(int idx) {
+ if (headerData == null) {
+ headerData = getData(icSigHead);
+ }
+
+ return ((headerData[idx] & 0xFF) << 24)|
+ ((headerData[idx+1] & 0xFF) << 16)|
+ ((headerData[idx+2] & 0xFF) << 8) |
+ ((headerData[idx+3] & 0xFF));
+ }
+
+ /**
+ * Reads byte from the profile header at the specified position.
+ *
+ * @param idx - offset in bytes from the beginning of the header
+ *
+ * @return the byte from header
+ */
+ private byte getByteFromHeader(int idx) {
+ if (headerData == null) {
+ headerData = getData(icSigHead);
+ }
+
+ return headerData[idx];
+ }
+
+ /**
+ * Converts ICC color space signature to the java predefined
+ * color space type.
+ *
+ * @param signature the signature
+ *
+ * @return the int
+ */
+ private int csFromSignature(int signature) {
+ switch (signature) {
+ case icSigRgbData:
+ return ColorSpace.TYPE_RGB;
+ case icSigXYZData:
+ return ColorSpace.TYPE_XYZ;
+ case icSigCmykData:
+ return ColorSpace.TYPE_CMYK;
+ case icSigLabData:
+ return ColorSpace.TYPE_Lab;
+ case icSigGrayData:
+ return ColorSpace.TYPE_GRAY;
+ case icSigHlsData:
+ return ColorSpace.TYPE_HLS;
+ case icSigLuvData:
+ return ColorSpace.TYPE_Luv;
+ case icSigYCbCrData:
+ return ColorSpace.TYPE_YCbCr;
+ case icSigYxyData:
+ return ColorSpace.TYPE_Yxy;
+ case icSigHsvData:
+ return ColorSpace.TYPE_HSV;
+ case icSigCmyData:
+ return ColorSpace.TYPE_CMY;
+ case icSigSpace2CLR:
+ return ColorSpace.TYPE_2CLR;
+ case icSigSpace3CLR:
+ return ColorSpace.TYPE_3CLR;
+ case icSigSpace4CLR:
+ return ColorSpace.TYPE_4CLR;
+ case icSigSpace5CLR:
+ return ColorSpace.TYPE_5CLR;
+ case icSigSpace6CLR:
+ return ColorSpace.TYPE_6CLR;
+ case icSigSpace7CLR:
+ return ColorSpace.TYPE_7CLR;
+ case icSigSpace8CLR:
+ return ColorSpace.TYPE_8CLR;
+ case icSigSpace9CLR:
+ return ColorSpace.TYPE_9CLR;
+ case icSigSpaceACLR:
+ return ColorSpace.TYPE_ACLR;
+ case icSigSpaceBCLR:
+ return ColorSpace.TYPE_BCLR;
+ case icSigSpaceCCLR:
+ return ColorSpace.TYPE_CCLR;
+ case icSigSpaceDCLR:
+ return ColorSpace.TYPE_DCLR;
+ case icSigSpaceECLR:
+ return ColorSpace.TYPE_ECLR;
+ case icSigSpaceFCLR:
+ return ColorSpace.TYPE_FCLR;
+ default:
+ }
+
+ // awt.165=Color space doesn't comply with ICC specification
+ throw new IllegalArgumentException (Messages.getString("awt.165")); //$NON-NLS-1$
+ }
+
+ /**
+ * Gets the profile handle.
+ *
+ * @return the profile handle
+ */
+ private long getProfileHandle() {
+ handleStolen = true;
+ return profileHandle;
+ }
+
+ /**
+ * Gets the data size.
+ *
+ * @param tagSignature the tag signature
+ *
+ * @return the data size
+ */
+ private int getDataSize(int tagSignature) {
+ return NativeCMM.cmmGetProfileElementSize(
+ profileHandle,
+ tagSignature
+ );
+ }
+
+ /**
+ * Reads XYZ value from the tag data.
+ *
+ * @param tagSignature the tag signature
+ *
+ * @return the XYZ value
+ */
+ float[] getXYZValue(int tagSignature) {
+ float[] res = new float[3];
+ byte[] data = getData(tagSignature);
+
+ // Convert from ICC s15Fixed16Number type
+ // 1 (float) = 0x10000 (s15Fixed16Number),
+ // hence dividing by 0x10000
+ res[0] = ICC_ProfileHelper.getIntFromByteArray(data, 0) / 65536.f;
+ res[1] = ICC_ProfileHelper.getIntFromByteArray(data, 4) / 65536.f;
+ res[2] = ICC_ProfileHelper.getIntFromByteArray(data, 8) / 65536.f;
+
+ return res;
+ }
+
+ /**
+ * Gets the media white point.
+ *
+ * @return the media white point
+ */
+ float[] getMediaWhitePoint() {
+ return getXYZValue(icSigMediaWhitePointTag);
+ }
+
+ /**
+ * If TRC is not a table returns gamma via return value
+ * and sets dataTRC to null. If TRC is a table returns 0
+ * and fills dataTRC with values.
+ *
+ * @param tagSignature the tag signature
+ * @param dataTRC the data trc
+ *
+ * @return - gamma or zero if TRC is a table
+ */
+ private float getGammaOrTRC(int tagSignature, short[] dataTRC) {
+ byte[] data = getData(tagSignature);
+ int trcSize = ICC_ProfileHelper.getIntFromByteArray(data, icCurveCount);
+
+ dataTRC = null;
+
+ if (trcSize == 0) {
+ return 1.0f;
+ }
+
+ if (trcSize == 1) {
+ // Cast from ICC u8Fixed8Number to float
+ return ICC_ProfileHelper.getShortFromByteArray(data, icCurveData) / 256.f;
+ }
+
+ // TRC is a table
+ dataTRC = new short[trcSize];
+ for (int i = 0, pos = icCurveData; i < trcSize; i++, pos += 2) {
+ dataTRC[i] = ICC_ProfileHelper.getShortFromByteArray(data, pos);
+ }
+ return 0;
+ }
+
+ /**
+ * Gets the gamma.
+ *
+ * @param tagSignature the tag signature
+ *
+ * @return the gamma
+ */
+ float getGamma(int tagSignature) {
+ short[] dataTRC = null;
+ float gamma = getGammaOrTRC(tagSignature, dataTRC);
+
+ if (dataTRC == null) {
+ return gamma;
+ }
+ // awt.166=TRC is not a simple gamma value.
+ throw new ProfileDataException(Messages.getString("awt.166")); //$NON-NLS-1$
+ }
+
+ /**
+ * Gets the tRC.
+ *
+ * @param tagSignature the tag signature
+ *
+ * @return the tRC
+ */
+ short[] getTRC(int tagSignature) {
+ short[] dataTRC = null;
+ getGammaOrTRC(tagSignature, dataTRC);
+
+ if (dataTRC == null) {
+ // awt.167=TRC is a gamma value, not a table.
+ throw new ProfileDataException(Messages.getString("awt.167")); //$NON-NLS-1$
+ }
+ return dataTRC;
+ }
+}
+