diff options
Diffstat (limited to 'awt/java/awt/color/ICC_Profile.java')
-rw-r--r-- | awt/java/awt/color/ICC_Profile.java | 1231 |
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; + } +} + |