/* * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ /********************************************************************** ********************************************************************** ********************************************************************** *** 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.awt.image.LookupTable; import sun.java2d.cmm.ProfileDeferralInfo; /** * * The ICC_ProfileRGB class is a subclass of the ICC_Profile class * that represents profiles which meet the following criteria: *
redColorantTag
,
* greenColorantTag
, blueColorantTag
,
* redTRCTag
, greenTRCTag
,
* blueTRCTag
, and mediaWhitePointTag
tags.ICC_Profile
getInstance
method will
* return an ICC_ProfileRGB
object when these conditions are met.
* Three-component, matrix-based input profiles and RGB display profiles are
* examples of this type of profile.
* * This profile class provides color transform matrices and lookup tables * that Java or native methods can use directly to * optimize color conversion in some cases. *
* To transform from a device profile color space to the CIEXYZ Profile * Connection Space, each device color component is first linearized by * a lookup through the corresponding tone reproduction curve (TRC). * The resulting linear RGB components are converted to the CIEXYZ PCS * using a a 3x3 matrix constructed from the RGB colorants. *
* * linearR = redTRC[deviceR] * * linearG = greenTRC[deviceG] * * linearB = blueTRC[deviceB] * * _ _ _ _ _ _ * [ PCSX ] [ redColorantX greenColorantX blueColorantX ] [ linearR ] * [ ] [ ] [ ] * [ PCSY ] = [ redColorantY greenColorantY blueColorantY ] [ linearG ] * [ ] [ ] [ ] * [_ PCSZ _] [_ redColorantZ greenColorantZ blueColorantZ _] [_ linearB _] * ** The inverse transform is performed by converting PCS XYZ components to linear * RGB components through the inverse of the above 3x3 matrix, and then converting * linear RGB to device RGB through inverses of the TRCs. *
*/
public class ICC_ProfileRGB
extends ICC_Profile {
static final long serialVersionUID = 8505067385152579334L;
/**
* Used to get a gamma value or TRC for the red component.
*/
public static final int REDCOMPONENT = 0;
/**
* Used to get a gamma value or TRC for the green component.
*/
public static final int GREENCOMPONENT = 1;
/**
* Used to get a gamma value or TRC for the blue component.
*/
public static final int BLUECOMPONENT = 2;
/**
* Constructs an new ICC_ProfileRGB
from a CMM ID.
*
* @param ID The CMM ID for the profile.
*
*/
ICC_ProfileRGB(long ID) {
super(ID);
}
/**
* Constructs a new ICC_ProfileRGB
from a
* ProfileDeferralInfo object.
*
* @param pdi
*/
ICC_ProfileRGB(ProfileDeferralInfo pdi) {
super(pdi);
}
/**
* Returns an array that contains the components of the profile's
* mediaWhitePointTag
.
*
* @return A 3-element float
array containing the x, y,
* and z components of the profile's mediaWhitePointTag
.
*/
public float[] getMediaWhitePoint() {
return super.getMediaWhitePoint();
}
/**
* Returns a 3x3 float
matrix constructed from the
* X, Y, and Z components of the profile's redColorantTag
,
* greenColorantTag
, and blueColorantTag
.
*
* This matrix can be used for color transforms in the forward
* direction of the profile--from the profile color space
* to the CIEXYZ PCS.
*
* @return A 3x3 float
array that contains the x, y, and z
* components of the profile's redColorantTag
,
* greenColorantTag
, and blueColorantTag
.
*/
public float[][] getMatrix() {
float[][] theMatrix = new float[3][3];
float[] tmpMatrix;
tmpMatrix = getXYZTag(ICC_Profile.icSigRedColorantTag);
theMatrix[0][0] = tmpMatrix[0];
theMatrix[1][0] = tmpMatrix[1];
theMatrix[2][0] = tmpMatrix[2];
tmpMatrix = getXYZTag(ICC_Profile.icSigGreenColorantTag);
theMatrix[0][1] = tmpMatrix[0];
theMatrix[1][1] = tmpMatrix[1];
theMatrix[2][1] = tmpMatrix[2];
tmpMatrix = getXYZTag(ICC_Profile.icSigBlueColorantTag);
theMatrix[0][2] = tmpMatrix[0];
theMatrix[1][2] = tmpMatrix[1];
theMatrix[2][2] = tmpMatrix[2];
return theMatrix;
}
/**
* Returns a gamma value representing the tone reproduction curve
* (TRC) for a particular component. The component parameter
* must be one of REDCOMPONENT, GREENCOMPONENT, or BLUECOMPONENT.
*
* If the profile * represents the TRC for the corresponding component * as a table rather than a single gamma value, an * exception is thrown. In this case the actual table * can be obtained through the {@link #getTRC(int)} method. * When using a gamma value, * the linear component (R, G, or B) is computed as follows: *
* * gamma * linearComponent = deviceComponent * ** @param component The
ICC_ProfileRGB
constant that
* represents the component whose TRC you want to retrieve
* @return the gamma value as a float.
* @exception ProfileDataException if the profile does not specify
* the corresponding TRC as a single gamma value.
*/
public float getGamma(int component) {
float theGamma;
int theSignature;
switch (component) {
case REDCOMPONENT:
theSignature = ICC_Profile.icSigRedTRCTag;
break;
case GREENCOMPONENT:
theSignature = ICC_Profile.icSigGreenTRCTag;
break;
case BLUECOMPONENT:
theSignature = ICC_Profile.icSigBlueTRCTag;
break;
default:
throw new IllegalArgumentException("Must be Red, Green, or Blue");
}
theGamma = super.getGamma(theSignature);
return theGamma;
}
/**
* Returns the TRC for a particular component as an array.
* Component must be REDCOMPONENT
,
* GREENCOMPONENT
, or BLUECOMPONENT
.
* Otherwise the returned array
* represents a lookup table where the input component value
* is conceptually in the range [0.0, 1.0]. Value 0.0 maps
* to array index 0 and value 1.0 maps to array index length-1.
* Interpolation might be used to generate output values for
* input values that do not map exactly to an index in the
* array. Output values also map linearly to the range [0.0, 1.0].
* Value 0.0 is represented by an array value of 0x0000 and
* value 1.0 by 0xFFFF. In other words, the values are really unsigned
* short
values even though they are returned in a
* short
array.
*
* If the profile has specified the corresponding TRC
* as linear (gamma = 1.0) or as a simple gamma value, this method
* throws an exception. In this case, the {@link #getGamma(int)}
* method should be used to get the gamma value.
*
* @param component The ICC_ProfileRGB
constant that
* represents the component whose TRC you want to retrieve:
* REDCOMPONENT
, GREENCOMPONENT
, or
* BLUECOMPONENT
.
*
* @return a short array representing the TRC.
* @exception ProfileDataException if the profile does not specify
* the corresponding TRC as a table.
*/
public short[] getTRC(int component) {
short[] theTRC;
int theSignature;
switch (component) {
case REDCOMPONENT:
theSignature = ICC_Profile.icSigRedTRCTag;
break;
case GREENCOMPONENT:
theSignature = ICC_Profile.icSigGreenTRCTag;
break;
case BLUECOMPONENT:
theSignature = ICC_Profile.icSigBlueTRCTag;
break;
default:
throw new IllegalArgumentException("Must be Red, Green, or Blue");
}
theTRC = super.getTRC(theSignature);
return theTRC;
}
}