/* * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* ******************************************************************** ********************************************************************** ********************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** *** As an unpublished work pursuant to Title 17 of the United *** *** States Code. All rights reserved. *** ********************************************************************** ********************************************************************** **********************************************************************/ package java.awt.color; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilePermission; 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 sun.java2d.cmm.CMSManager; import sun.java2d.cmm.PCMM; import sun.java2d.cmm.Profile; import sun.java2d.cmm.ProfileActivator; import sun.java2d.cmm.ProfileDataVerifier; import sun.java2d.cmm.ProfileDeferralInfo; import sun.java2d.cmm.ProfileDeferralMgr; /** * A representation of color profile data for device independent and device * dependent color spaces based on the International Color Consortium * Specification ICC.1:2001-12, File Format for Color Profiles, (see * http://www.color.org). *
* An {@code ICC_ColorSpace} object can be constructed from an appropriate * {@code ICC_Profile}. Typically, an {@code ICC_ColorSpace} would be associated * with an ICC Profile which is either an input, display, or output profile (see * the ICC specification). There are also device link, abstract, color space * conversion, and named color profiles. These are less useful for tagging a * color or image, but are useful for other purposes (in particular device link * profiles can provide improved performance for converting from one device's * color space to another's). *
* ICC Profiles represent transformations from the color space of the profile
* (e.g. a monitor) to a Profile Connection Space (PCS). Profiles of interest
* for tagging images or colors have a PCS which is one of the two specific
* device independent spaces (one CIEXYZ space and one CIELab space) defined in
* the ICC Profile Format Specification. Most profiles of interest either have
* invertible transformations or explicitly specify transformations going both
* directions.
*
* @see ICC_ColorSpace
*/
public class ICC_Profile implements Serializable {
private static final long serialVersionUID = -3938515861990936766L;
private transient Profile cmmProfile;
private transient ProfileDeferralInfo deferralInfo;
private transient ProfileActivator profileActivator;
// Registry of singleton profile objects for specific color spaces
// defined in the ColorSpace class (e.g. CS_sRGB), see
// getInstance(int cspace) factory method.
private static ICC_Profile sRGBprofile;
private static ICC_Profile XYZprofile;
private static ICC_Profile PYCCprofile;
private static ICC_Profile GRAYprofile;
private static ICC_Profile LINEAR_RGBprofile;
/**
* Profile class is input.
*/
public static final int CLASS_INPUT = 0;
/**
* Profile class is display.
*/
public static final int CLASS_DISPLAY = 1;
/**
* Profile class is output.
*/
public static final int CLASS_OUTPUT = 2;
/**
* Profile class is device link.
*/
public static final int CLASS_DEVICELINK = 3;
/**
* Profile class is color space conversion.
*/
public static final int CLASS_COLORSPACECONVERSION = 4;
/**
* Profile class is abstract.
*/
public static final int CLASS_ABSTRACT = 5;
/**
* Profile class is named color.
*/
public static final int CLASS_NAMEDCOLOR = 6;
/**
* ICC Profile Color Space Type Signature: 'XYZ '.
*/
public static final int icSigXYZData = 0x58595A20; /* 'XYZ ' */
/**
* ICC Profile Color Space Type Signature: 'Lab '.
*/
public static final int icSigLabData = 0x4C616220; /* 'Lab ' */
/**
* ICC Profile Color Space Type Signature: 'Luv '.
*/
public static final int icSigLuvData = 0x4C757620; /* 'Luv ' */
/**
* ICC Profile Color Space Type Signature: 'YCbr'.
*/
public static final int icSigYCbCrData = 0x59436272; /* 'YCbr' */
/**
* ICC Profile Color Space Type Signature: 'Yxy '.
*/
public static final int icSigYxyData = 0x59787920; /* 'Yxy ' */
/**
* ICC Profile Color Space Type Signature: 'RGB '.
*/
public static final int icSigRgbData = 0x52474220; /* 'RGB ' */
/**
* ICC Profile Color Space Type Signature: 'GRAY'.
*/
public static final int icSigGrayData = 0x47524159; /* 'GRAY' */
/**
* ICC Profile Color Space Type Signature: 'HSV'.
*/
public static final int icSigHsvData = 0x48535620; /* 'HSV ' */
/**
* ICC Profile Color Space Type Signature: 'HLS'.
*/
public static final int icSigHlsData = 0x484C5320; /* 'HLS ' */
/**
* ICC Profile Color Space Type Signature: 'CMYK'.
*/
public static final int icSigCmykData = 0x434D594B; /* 'CMYK' */
/**
* ICC Profile Color Space Type Signature: 'CMY '.
*/
public static final int icSigCmyData = 0x434D5920; /* 'CMY ' */
/**
* ICC Profile Color Space Type Signature: '2CLR'.
*/
public static final int icSigSpace2CLR = 0x32434C52; /* '2CLR' */
/**
* ICC Profile Color Space Type Signature: '3CLR'.
*/
public static final int icSigSpace3CLR = 0x33434C52; /* '3CLR' */
/**
* ICC Profile Color Space Type Signature: '4CLR'.
*/
public static final int icSigSpace4CLR = 0x34434C52; /* '4CLR' */
/**
* ICC Profile Color Space Type Signature: '5CLR'.
*/
public static final int icSigSpace5CLR = 0x35434C52; /* '5CLR' */
/**
* ICC Profile Color Space Type Signature: '6CLR'.
*/
public static final int icSigSpace6CLR = 0x36434C52; /* '6CLR' */
/**
* ICC Profile Color Space Type Signature: '7CLR'.
*/
public static final int icSigSpace7CLR = 0x37434C52; /* '7CLR' */
/**
* ICC Profile Color Space Type Signature: '8CLR'.
*/
public static final int icSigSpace8CLR = 0x38434C52; /* '8CLR' */
/**
* ICC Profile Color Space Type Signature: '9CLR'.
*/
public static final int icSigSpace9CLR = 0x39434C52; /* '9CLR' */
/**
* ICC Profile Color Space Type Signature: 'ACLR'.
*/
public static final int icSigSpaceACLR = 0x41434C52; /* 'ACLR' */
/**
* ICC Profile Color Space Type Signature: 'BCLR'.
*/
public static final int icSigSpaceBCLR = 0x42434C52; /* 'BCLR' */
/**
* ICC Profile Color Space Type Signature: 'CCLR'.
*/
public static final int icSigSpaceCCLR = 0x43434C52; /* 'CCLR' */
/**
* ICC Profile Color Space Type Signature: 'DCLR'.
*/
public static final int icSigSpaceDCLR = 0x44434C52; /* 'DCLR' */
/**
* ICC Profile Color Space Type Signature: 'ECLR'.
*/
public static final int icSigSpaceECLR = 0x45434C52; /* 'ECLR' */
/**
* ICC Profile Color Space Type Signature: 'FCLR'.
*/
public static final int icSigSpaceFCLR = 0x46434C52; /* 'FCLR' */
/**
* ICC Profile Class Signature: 'scnr'.
*/
public static final int icSigInputClass = 0x73636E72; /* 'scnr' */
/**
* ICC Profile Class Signature: 'mntr'.
*/
public static final int icSigDisplayClass = 0x6D6E7472; /* 'mntr' */
/**
* ICC Profile Class Signature: 'prtr'.
*/
public static final int icSigOutputClass = 0x70727472; /* 'prtr' */
/**
* ICC Profile Class Signature: 'link'.
*/
public static final int icSigLinkClass = 0x6C696E6B; /* 'link' */
/**
* ICC Profile Class Signature: 'abst'.
*/
public static final int icSigAbstractClass = 0x61627374; /* 'abst' */
/**
* ICC Profile Class Signature: 'spac'.
*/
public static final int icSigColorSpaceClass = 0x73706163; /* 'spac' */
/**
* ICC Profile Class Signature: 'nmcl'.
*/
public static final int icSigNamedColorClass = 0x6e6d636c; /* 'nmcl' */
/**
* ICC Profile Rendering Intent: Perceptual.
*/
public static final int icPerceptual = 0;
/**
* ICC Profile Rendering Intent: RelativeColorimetric.
*/
public static final int icRelativeColorimetric = 1;
/**
* ICC Profile Rendering Intent: Media-RelativeColorimetric.
*
* @since 1.5
*/
public static final int icMediaRelativeColorimetric = 1;
/**
* ICC Profile Rendering Intent: Saturation.
*/
public static final int icSaturation = 2;
/**
* ICC Profile Rendering Intent: AbsoluteColorimetric.
*/
public static final int icAbsoluteColorimetric = 3;
/**
* ICC Profile Rendering Intent: ICC-AbsoluteColorimetric.
*
* @since 1.5
*/
public static final int icICCAbsoluteColorimetric = 3;
/**
* ICC Profile Tag Signature: 'head' - special.
*/
public static final int icSigHead = 0x68656164; /* 'head' - special */
/**
* ICC Profile Tag Signature: 'A2B0'.
*/
public static final int icSigAToB0Tag = 0x41324230; /* 'A2B0' */
/**
* ICC Profile Tag Signature: 'A2B1'.
*/
public static final int icSigAToB1Tag = 0x41324231; /* 'A2B1' */
/**
* ICC Profile Tag Signature: 'A2B2'.
*/
public static final int icSigAToB2Tag = 0x41324232; /* 'A2B2' */
/**
* ICC Profile Tag Signature: 'bXYZ'.
*/
public static final int icSigBlueColorantTag = 0x6258595A; /* 'bXYZ' */
/**
* ICC Profile Tag Signature: 'bXYZ'.
*
* @since 1.5
*/
public static final int icSigBlueMatrixColumnTag = 0x6258595A; /* 'bXYZ' */
/**
* ICC Profile Tag Signature: 'bTRC'.
*/
public static final int icSigBlueTRCTag = 0x62545243; /* 'bTRC' */
/**
* ICC Profile Tag Signature: 'B2A0'.
*/
public static final int icSigBToA0Tag = 0x42324130; /* 'B2A0' */
/**
* ICC Profile Tag Signature: 'B2A1'.
*/
public static final int icSigBToA1Tag = 0x42324131; /* 'B2A1' */
/**
* ICC Profile Tag Signature: 'B2A2'.
*/
public static final int icSigBToA2Tag = 0x42324132; /* 'B2A2' */
/**
* ICC Profile Tag Signature: 'calt'.
*/
public static final int icSigCalibrationDateTimeTag = 0x63616C74;
/* 'calt' */
/**
* ICC Profile Tag Signature: 'targ'.
*/
public static final int icSigCharTargetTag = 0x74617267; /* 'targ' */
/**
* ICC Profile Tag Signature: 'cprt'.
*/
public static final int icSigCopyrightTag = 0x63707274; /* 'cprt' */
/**
* ICC Profile Tag Signature: 'crdi'.
*/
public static final int icSigCrdInfoTag = 0x63726469; /* 'crdi' */
/**
* ICC Profile Tag Signature: 'dmnd'.
*/
public static final int icSigDeviceMfgDescTag = 0x646D6E64; /* 'dmnd' */
/**
* ICC Profile Tag Signature: 'dmdd'.
*/
public static final int icSigDeviceModelDescTag = 0x646D6464; /* 'dmdd' */
/**
* ICC Profile Tag Signature: 'devs'.
*/
public static final int icSigDeviceSettingsTag = 0x64657673; /* 'devs' */
/**
* ICC Profile Tag Signature: 'gamt'.
*/
public static final int icSigGamutTag = 0x67616D74; /* 'gamt' */
/**
* ICC Profile Tag Signature: 'kTRC'.
*/
public static final int icSigGrayTRCTag = 0x6b545243; /* 'kTRC' */
/**
* ICC Profile Tag Signature: 'gXYZ'.
*/
public static final int icSigGreenColorantTag = 0x6758595A; /* 'gXYZ' */
/**
* ICC Profile Tag Signature: 'gXYZ'.
*
* @since 1.5
*/
public static final int icSigGreenMatrixColumnTag = 0x6758595A;/* 'gXYZ' */
/**
* ICC Profile Tag Signature: 'gTRC'.
*/
public static final int icSigGreenTRCTag = 0x67545243; /* 'gTRC' */
/**
* ICC Profile Tag Signature: 'lumi'.
*/
public static final int icSigLuminanceTag = 0x6C756d69; /* 'lumi' */
/**
* ICC Profile Tag Signature: 'meas'.
*/
public static final int icSigMeasurementTag = 0x6D656173; /* 'meas' */
/**
* ICC Profile Tag Signature: 'bkpt'.
*/
public static final int icSigMediaBlackPointTag = 0x626B7074; /* 'bkpt' */
/**
* ICC Profile Tag Signature: 'wtpt'.
*/
public static final int icSigMediaWhitePointTag = 0x77747074; /* 'wtpt' */
/**
* ICC Profile Tag Signature: 'ncl2'.
*/
public static final int icSigNamedColor2Tag = 0x6E636C32; /* 'ncl2' */
/**
* ICC Profile Tag Signature: 'resp'.
*/
public static final int icSigOutputResponseTag = 0x72657370; /* 'resp' */
/**
* ICC Profile Tag Signature: 'pre0'.
*/
public static final int icSigPreview0Tag = 0x70726530; /* 'pre0' */
/**
* ICC Profile Tag Signature: 'pre1'.
*/
public static final int icSigPreview1Tag = 0x70726531; /* 'pre1' */
/**
* ICC Profile Tag Signature: 'pre2'.
*/
public static final int icSigPreview2Tag = 0x70726532; /* 'pre2' */
/**
* ICC Profile Tag Signature: 'desc'.
*/
public static final int icSigProfileDescriptionTag = 0x64657363;
/* 'desc' */
/**
* ICC Profile Tag Signature: 'pseq'.
*/
public static final int icSigProfileSequenceDescTag = 0x70736571;
/* 'pseq' */
/**
* ICC Profile Tag Signature: 'psd0'.
*/
public static final int icSigPs2CRD0Tag = 0x70736430; /* 'psd0' */
/**
* ICC Profile Tag Signature: 'psd1'.
*/
public static final int icSigPs2CRD1Tag = 0x70736431; /* 'psd1' */
/**
* ICC Profile Tag Signature: 'psd2'.
*/
public static final int icSigPs2CRD2Tag = 0x70736432; /* 'psd2' */
/**
* ICC Profile Tag Signature: 'psd3'.
*/
public static final int icSigPs2CRD3Tag = 0x70736433; /* 'psd3' */
/**
* ICC Profile Tag Signature: 'ps2s'.
*/
public static final int icSigPs2CSATag = 0x70733273; /* 'ps2s' */
/**
* ICC Profile Tag Signature: 'ps2i'.
*/
public static final int icSigPs2RenderingIntentTag = 0x70733269;
/* 'ps2i' */
/**
* ICC Profile Tag Signature: 'rXYZ'.
*/
public static final int icSigRedColorantTag = 0x7258595A; /* 'rXYZ' */
/**
* ICC Profile Tag Signature: 'rXYZ'.
*
* @since 1.5
*/
public static final int icSigRedMatrixColumnTag = 0x7258595A; /* 'rXYZ' */
/**
* ICC Profile Tag Signature: 'rTRC'.
*/
public static final int icSigRedTRCTag = 0x72545243; /* 'rTRC' */
/**
* ICC Profile Tag Signature: 'scrd'.
*/
public static final int icSigScreeningDescTag = 0x73637264; /* 'scrd' */
/**
* ICC Profile Tag Signature: 'scrn'.
*/
public static final int icSigScreeningTag = 0x7363726E; /* 'scrn' */
/**
* ICC Profile Tag Signature: 'tech'.
*/
public static final int icSigTechnologyTag = 0x74656368; /* 'tech' */
/**
* ICC Profile Tag Signature: 'bfd '.
*/
public static final int icSigUcrBgTag = 0x62666420; /* 'bfd ' */
/**
* ICC Profile Tag Signature: 'vued'.
*/
public static final int icSigViewingCondDescTag = 0x76756564; /* 'vued' */
/**
* ICC Profile Tag Signature: 'view'.
*/
public static final int icSigViewingConditionsTag = 0x76696577;/* 'view' */
/**
* ICC Profile Tag Signature: 'chrm'.
*/
public static final int icSigChromaticityTag = 0x6368726d; /* 'chrm' */
/**
* ICC Profile Tag Signature: 'chad'.
*
* @since 1.5
*/
public static final int icSigChromaticAdaptationTag = 0x63686164;/* 'chad' */
/**
* ICC Profile Tag Signature: 'clro'.
*
* @since 1.5
*/
public static final int icSigColorantOrderTag = 0x636C726F; /* 'clro' */
/**
* ICC Profile Tag Signature: 'clrt'.
*
* @since 1.5
*/
public static final int icSigColorantTableTag = 0x636C7274; /* 'clrt' */
/**
* ICC Profile Header Location: profile size in bytes.
*/
public static final int icHdrSize = 0; /* Profile size in bytes */
/**
* ICC Profile Header Location: CMM for this profile.
*/
public static final int icHdrCmmId = 4; /* CMM for this profile */
/**
* ICC Profile Header Location: format version number.
*/
public static final int icHdrVersion = 8; /* Format version number */
/**
* ICC Profile Header Location: type of profile.
*/
public static final int icHdrDeviceClass = 12; /* Type of profile */
/**
* ICC Profile Header Location: color space of data.
*/
public static final int icHdrColorSpace = 16; /* Color space of data */
/**
* ICC Profile Header Location: PCS - XYZ or Lab only.
*/
public static final int icHdrPcs = 20; /* PCS - XYZ or Lab only */
/**
* ICC Profile Header Location: date profile was created.
*/
public static final int icHdrDate = 24; /* Date profile was created */
/**
* ICC Profile Header Location: icMagicNumber.
*/
public static final int icHdrMagic = 36; /* icMagicNumber */
/**
* ICC Profile Header Location: primary platform.
*/
public static final int icHdrPlatform = 40; /* Primary Platform */
/**
* ICC Profile Header Location: various bit settings.
*/
public static final int icHdrFlags = 44; /* Various bit settings */
/**
* ICC Profile Header Location: device manufacturer.
*/
public static final int icHdrManufacturer = 48; /* Device manufacturer */
/**
* ICC Profile Header Location: device model number.
*/
public static final int icHdrModel = 52; /* Device model number */
/**
* ICC Profile Header Location: device attributes.
*/
public static final int icHdrAttributes = 56; /* Device attributes */
/**
* ICC Profile Header Location: rendering intent.
*/
public static final int icHdrRenderingIntent = 64; /* Rendering intent */
/**
* ICC Profile Header Location: profile illuminant.
*/
public static final int icHdrIlluminant = 68; /* Profile illuminant */
/**
* ICC Profile Header Location: profile creator.
*/
public static final int icHdrCreator = 80; /* Profile creator */
/**
* ICC Profile Header Location: profile's ID.
*
* @since 1.5
*/
public static final int icHdrProfileID = 84; /* Profile's ID */
/**
* ICC Profile Constant: tag type signature.
*/
public static final int icTagType = 0; /* tag type signature */
/**
* ICC Profile Constant: reserved.
*/
public static final int icTagReserved = 4; /* reserved */
/**
* ICC Profile Constant: curveType count.
*/
public static final int icCurveCount = 8; /* curveType count */
/**
* ICC Profile Constant: curveType data.
*/
public static final int icCurveData = 12; /* curveType data */
/**
* ICC Profile Constant: XYZNumber X.
*/
public static final int icXYZNumberX = 8; /* XYZNumber X */
/**
* Constructs an {@code ICC_Profile} object with a given ID.
*/
ICC_Profile(Profile p) {
this.cmmProfile = p;
}
/**
* Constructs an {@code ICC_Profile} object whose loading will be deferred.
* The ID will be 0 until the profile is loaded.
*/
ICC_Profile(ProfileDeferralInfo pdi) {
this.deferralInfo = pdi;
this.profileActivator = new ProfileActivator() {
public void activate() throws ProfileDataException {
activateDeferredProfile();
}
};
ProfileDeferralMgr.registerDeferral(this.profileActivator);
}
/**
* Frees the resources associated with an {@code ICC_Profile} object.
*
* @deprecated The {@code finalize} method has been deprecated. Subclasses
* that override {@code finalize} in order to perform cleanup should
* be modified to use alternative cleanup mechanisms and to remove
* the overriding {@code finalize} method. When overriding the
* {@code finalize} method, its implementation must explicitly
* ensure that {@code super.finalize()} is invoked as described in
* {@link Object#finalize}. See the specification for {@link
* Object#finalize()} for further information about migration
* options.
*/
@Deprecated(since="9")
protected void finalize () {
if (cmmProfile != null) {
CMSManager.getModule().freeProfile(cmmProfile);
} else if (profileActivator != null) {
ProfileDeferralMgr.unregisterDeferral(profileActivator);
}
}
/**
* Constructs an {@code ICC_Profile} object corresponding to the data in a
* byte array. Throws an {@code IllegalArgumentException} if the data does
* not correspond to a valid ICC Profile.
*
* @param data the specified ICC Profile data
* @return an {@code ICC_Profile} object corresponding to the data in the
* specified {@code data} array
*/
public static ICC_Profile getInstance(byte[] data) {
ICC_Profile thisProfile;
Profile p = null;
if (ProfileDeferralMgr.deferring) {
ProfileDeferralMgr.activateProfiles();
}
ProfileDataVerifier.verify(data);
try {
p = CMSManager.getModule().loadProfile(data);
} catch (CMMException c) {
throw new IllegalArgumentException("Invalid ICC Profile Data");
}
try {
if ((getColorSpaceType (p) == ColorSpace.TYPE_GRAY) &&
(getData (p, icSigMediaWhitePointTag) != null) &&
(getData (p, icSigGrayTRCTag) != null)) {
thisProfile = new ICC_ProfileGray (p);
}
else if ((getColorSpaceType (p) == ColorSpace.TYPE_RGB) &&
(getData (p, icSigMediaWhitePointTag) != null) &&
(getData (p, icSigRedColorantTag) != null) &&
(getData (p, icSigGreenColorantTag) != null) &&
(getData (p, icSigBlueColorantTag) != null) &&
(getData (p, icSigRedTRCTag) != null) &&
(getData (p, icSigGreenTRCTag) != null) &&
(getData (p, icSigBlueTRCTag) != null)) {
thisProfile = new ICC_ProfileRGB (p);
}
else {
thisProfile = new ICC_Profile (p);
}
} catch (CMMException c) {
thisProfile = new ICC_Profile (p);
}
return thisProfile;
}
/**
* Constructs an {@code ICC_Profile} corresponding to one of the specific
* color spaces defined by the {@code ColorSpace} class (for example
* {@code CS_sRGB}). Throws an {@code IllegalArgumentException} if cspace is
* not one of the defined color spaces.
*
* @param cspace the type of color space to create a profile for. The
* specified type is one of the color space constants defined in the
* {@code ColorSpace} class.
* @return an {@code ICC_Profile} object corresponding to the specified
* {@code ColorSpace} type
* @throws IllegalArgumentException If {@code cspace} is not one of the
* predefined color space types
*/
public static ICC_Profile getInstance (int cspace) {
ICC_Profile thisProfile = null;
String fileName;
switch (cspace) {
case ColorSpace.CS_sRGB:
synchronized(ICC_Profile.class) {
if (sRGBprofile == null) {
/*
* Deferral is only used for standard profiles.
* Enabling the appropriate access privileges is handled
* at a lower level.
*/
ProfileDeferralInfo pInfo =
new ProfileDeferralInfo("sRGB.pf",
ColorSpace.TYPE_RGB, 3,
CLASS_DISPLAY);
sRGBprofile = getDeferredInstance(pInfo);
}
thisProfile = sRGBprofile;
}
break;
case ColorSpace.CS_CIEXYZ:
synchronized(ICC_Profile.class) {
if (XYZprofile == null) {
ProfileDeferralInfo pInfo =
new ProfileDeferralInfo("CIEXYZ.pf",
ColorSpace.TYPE_XYZ, 3,
CLASS_DISPLAY);
XYZprofile = getDeferredInstance(pInfo);
}
thisProfile = XYZprofile;
}
break;
case ColorSpace.CS_PYCC:
synchronized(ICC_Profile.class) {
if (PYCCprofile == null) {
if (standardProfileExists("PYCC.pf"))
{
ProfileDeferralInfo pInfo =
new ProfileDeferralInfo("PYCC.pf",
ColorSpace.TYPE_3CLR, 3,
CLASS_DISPLAY);
PYCCprofile = getDeferredInstance(pInfo);
} else {
throw new IllegalArgumentException(
"Can't load standard profile: PYCC.pf");
}
}
thisProfile = PYCCprofile;
}
break;
case ColorSpace.CS_GRAY:
synchronized(ICC_Profile.class) {
if (GRAYprofile == null) {
ProfileDeferralInfo pInfo =
new ProfileDeferralInfo("GRAY.pf",
ColorSpace.TYPE_GRAY, 1,
CLASS_DISPLAY);
GRAYprofile = getDeferredInstance(pInfo);
}
thisProfile = GRAYprofile;
}
break;
case ColorSpace.CS_LINEAR_RGB:
synchronized(ICC_Profile.class) {
if (LINEAR_RGBprofile == null) {
ProfileDeferralInfo pInfo =
new ProfileDeferralInfo("LINEAR_RGB.pf",
ColorSpace.TYPE_RGB, 3,
CLASS_DISPLAY);
LINEAR_RGBprofile = getDeferredInstance(pInfo);
}
thisProfile = LINEAR_RGBprofile;
}
break;
default:
throw new IllegalArgumentException("Unknown color space");
}
return thisProfile;
}
/**
* This method asserts system privileges, so is used only for the standard
* profiles.
*/
private static ICC_Profile getStandardProfile(final String name) {
return AccessController.doPrivileged(
new PrivilegedAction
* The {@code byte[]} array is the profile data for the profile. For
* predefined color spaces {@code null} is written instead of the
* profile data. If in the future versions of Java API new
* predefined color spaces will be added, future versions of this
* class may choose to write for new predefined color spaces not
* only the color space name, but the profile data as well so that
* older versions could still deserialize the object.
*/
private void writeObject(ObjectOutputStream s)
throws IOException
{
s.defaultWriteObject();
String csName = null;
if (this == sRGBprofile) {
csName = "CS_sRGB";
} else if (this == XYZprofile) {
csName = "CS_CIEXYZ";
} else if (this == PYCCprofile) {
csName = "CS_PYCC";
} else if (this == GRAYprofile) {
csName = "CS_GRAY";
} else if (this == LINEAR_RGBprofile) {
csName = "CS_LINEAR_RGB";
}
// Future versions may choose to write profile data for new
// predefined color spaces as well, if any will be introduced,
// so that old versions that don't recognize the new CS name
// may fall back to constructing profile from the data.
byte[] data = null;
if (csName == null) {
// getData will activate deferred profile if necessary
data = getData();
}
s.writeObject(csName);
s.writeObject(data);
}
// Temporary storage used by readObject to store resolved profile
// (obtained with getInstance) for readResolve to return.
private transient ICC_Profile resolvedDeserializedProfile;
/**
* Reads default serializable fields from the stream. Reads from the stream
* a string and an array of bytes as additional data.
*
* @param s stream used for deserialization
* @throws IOException thrown by {@code ObjectInputStream}
* @throws ClassNotFoundException thrown by {@code
* ObjectInputStream}
* @serialData the {@code String} is the name of one of
*
* The {@code byte[]} array is the profile data for the profile. It
* will usually be {@code null} for the predefined profiles.
*
* If the string is recognized as a constant name for predefined
* color space the object will be resolved into profile obtained
* with
* CS_*
constants defined in the
* {@link ColorSpace} class if the profile object is a profile for a
* predefined color space (for example {@code "CS_sRGB"}). The
* string is {@code null} otherwise.
* CS_*
constants defined in the
* {@link ColorSpace} class if the profile object is a profile for a
* predefined color space (for example {@code "CS_sRGB"}). The
* string is {@code null} otherwise.
* getInstance(int cspace)
and the profile data
* are
* ignored. Otherwise the object will be resolved into profile
* obtained with
* getInstance(byte[] data)
.
* @see #readResolve()
* @see #getInstance(int)
* @see #getInstance(byte[])
*/
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException
{
s.defaultReadObject();
String csName = (String)s.readObject();
byte[] data = (byte[])s.readObject();
int cspace = 0; // ColorSpace.CS_* constant if known
boolean isKnownPredefinedCS = false;
if (csName != null) {
isKnownPredefinedCS = true;
if (csName.equals("CS_sRGB")) {
cspace = ColorSpace.CS_sRGB;
} else if (csName.equals("CS_CIEXYZ")) {
cspace = ColorSpace.CS_CIEXYZ;
} else if (csName.equals("CS_PYCC")) {
cspace = ColorSpace.CS_PYCC;
} else if (csName.equals("CS_GRAY")) {
cspace = ColorSpace.CS_GRAY;
} else if (csName.equals("CS_LINEAR_RGB")) {
cspace = ColorSpace.CS_LINEAR_RGB;
} else {
isKnownPredefinedCS = false;
}
}
if (isKnownPredefinedCS) {
resolvedDeserializedProfile = getInstance(cspace);
} else {
resolvedDeserializedProfile = getInstance(data);
}
}
/**
* Resolves instances being deserialized into instances registered with CMM.
*
* @return ICC_Profile object for profile registered with CMM
* @throws ObjectStreamException never thrown, but mandated by the
* serialization spec
* @since 1.3
*/
protected Object readResolve() throws ObjectStreamException {
return resolvedDeserializedProfile;
}
}