package java.awt.color;
import gnu.java.awt.color.ProfileHeader;
import gnu.java.awt.color.TagEntry;
import java.io.FileInputStream;
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.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Enumeration;
import java.util.Hashtable;
public class ICC_Profile implements Serializable
{
private static final long serialVersionUID = -3938515861990936766L;
public static final int CLASS_INPUT = 0;
public static final int CLASS_DISPLAY = 1;
public static final int CLASS_OUTPUT = 2;
public static final int CLASS_DEVICELINK = 3;
public static final int CLASS_COLORSPACECONVERSION = 4;
public static final int CLASS_ABSTRACT = 5;
public static final int CLASS_NAMEDCOLOR = 6;
public static final int icSigInputClass = 0x73636e72; public static final int icSigDisplayClass = 0x6d6e7472; public static final int icSigOutputClass = 0x70727472; public static final int icSigLinkClass = 0x6c696e6b; public static final int icSigColorSpaceClass = 0x73706163; public static final int icSigAbstractClass = 0x61627374; public static final int icSigNamedColorClass = 0x6e6d636c;
public static final int icSigXYZData = 0x58595A20; public static final int icSigLabData = 0x4C616220; public static final int icSigLuvData = 0x4C757620; public static final int icSigYCbCrData = 0x59436272; public static final int icSigYxyData = 0x59787920; public static final int icSigRgbData = 0x52474220; public static final int icSigGrayData = 0x47524159; public static final int icSigHsvData = 0x48535620; public static final int icSigHlsData = 0x484C5320; public static final int icSigCmykData = 0x434D594B; public static final int icSigCmyData = 0x434D5920; public static final int icSigSpace2CLR = 0x32434C52; public static final int icSigSpace3CLR = 0x33434C52; public static final int icSigSpace4CLR = 0x34434C52; public static final int icSigSpace5CLR = 0x35434C52; public static final int icSigSpace6CLR = 0x36434C52; public static final int icSigSpace7CLR = 0x37434C52; public static final int icSigSpace8CLR = 0x38434C52; public static final int icSigSpace9CLR = 0x39434C52; public static final int icSigSpaceACLR = 0x41434C52; public static final int icSigSpaceBCLR = 0x42434C52; public static final int icSigSpaceCCLR = 0x43434C52; public static final int icSigSpaceDCLR = 0x44434C52; public static final int icSigSpaceECLR = 0x45434C52; public static final int icSigSpaceFCLR = 0x46434C52;
public static final int icPerceptual = 0;
public static final int icRelativeColorimetric = 1;
public static final int icSaturation = 2;
public static final int icAbsoluteColorimetric = 3;
public static final int icSigAToB0Tag = 0x41324230; public static final int icSigAToB1Tag = 0x41324231; public static final int icSigAToB2Tag = 0x41324232; public static final int icSigBlueColorantTag = 0x6258595A; public static final int icSigBlueTRCTag = 0x62545243; public static final int icSigBToA0Tag = 0x42324130; public static final int icSigBToA1Tag = 0x42324131; public static final int icSigBToA2Tag = 0x42324132; public static final int icSigCalibrationDateTimeTag = 0x63616C74; public static final int icSigCharTargetTag = 0x74617267; public static final int icSigCopyrightTag = 0x63707274; public static final int icSigCrdInfoTag = 0x63726469; public static final int icSigDeviceMfgDescTag = 0x646D6E64; public static final int icSigDeviceModelDescTag = 0x646D6464; public static final int icSigDeviceSettingsTag = 0x64657673; public static final int icSigGamutTag = 0x67616D74; public static final int icSigGrayTRCTag = 0x6b545243; public static final int icSigGreenColorantTag = 0x6758595A; public static final int icSigGreenTRCTag = 0x67545243; public static final int icSigLuminanceTag = 0x6C756d69; public static final int icSigMeasurementTag = 0x6D656173; public static final int icSigMediaBlackPointTag = 0x626B7074; public static final int icSigMediaWhitePointTag = 0x77747074; public static final int icSigNamedColor2Tag = 0x6E636C32; public static final int icSigOutputResponseTag = 0x72657370; public static final int icSigPreview0Tag = 0x70726530; public static final int icSigPreview1Tag = 0x70726531; public static final int icSigPreview2Tag = 0x70726532; public static final int icSigProfileDescriptionTag = 0x64657363; public static final int icSigProfileSequenceDescTag = 0x70736571; public static final int icSigPs2CRD0Tag = 0x70736430; public static final int icSigPs2CRD1Tag = 0x70736431; public static final int icSigPs2CRD2Tag = 0x70736432; public static final int icSigPs2CRD3Tag = 0x70736433; public static final int icSigPs2CSATag = 0x70733273; public static final int icSigPs2RenderingIntentTag = 0x70733269; public static final int icSigRedColorantTag = 0x7258595A; public static final int icSigRedTRCTag = 0x72545243; public static final int icSigScreeningDescTag = 0x73637264; public static final int icSigScreeningTag = 0x7363726E; public static final int icSigTechnologyTag = 0x74656368; public static final int icSigUcrBgTag = 0x62666420; public static final int icSigViewingCondDescTag = 0x76756564; public static final int icSigViewingConditionsTag = 0x76696577; public static final int icSigChromaticityTag = 0x6368726D;
public static final int icSigHead = 0x68656164;
public static final int icHdrSize = 0;
public static final int icHdrCmmId = 4;
public static final int icHdrVersion = 8;
public static final int icHdrDeviceClass = 12;
public static final int icHdrColorSpace = 16;
public static final int icHdrPcs = 20;
public static final int icHdrDate = 24;
public static final int icHdrMagic = 36;
public static final int icHdrPlatform = 40;
public static final int icHdrFlags = 44;
public static final int icHdrManufacturer = 48;
public static final int icHdrModel = 52;
public static final int icHdrAttributes = 56;
public static final int icHdrRenderingIntent = 64;
public static final int icHdrIlluminant = 68;
public static final int icHdrCreator = 80;
public static final int icTagType = 0;
public static final int icTagReserved = 4;
public static final int icCurveCount = 8;
public static final int icCurveData = 12;
public static final int icXYZNumberX = 8;
private static final int tagTableOffset = 128;
private static final int iccProfileSerializedDataVersion = 1;
private static final String copyrightNotice = "Generated by GNU Classpath.";
private static final int TRC_POINTS = 1024;
private static final float[] D50 = { 0.96422f, 1.00f, 0.82521f };
private transient int profileID;
private transient ProfileHeader header;
private transient Hashtable tagTable;
ICC_Profile(int profileID)
{
header = null;
tagTable = null;
createProfile(profileID);
}
ICC_Profile(ProfileHeader h, Hashtable tags) throws IllegalArgumentException
{
header = h;
tagTable = tags;
profileID = -1; }
ICC_Profile(byte[] data) throws IllegalArgumentException
{
header = new ProfileHeader(data);
header.verifyHeader(data.length);
tagTable = createTagTable(data);
profileID = -1; }
protected void finalize()
{
}
public static ICC_Profile getInstance(byte[] data)
{
ProfileHeader header = new ProfileHeader(data);
header.verifyHeader(data.length);
Hashtable tags = createTagTable(data);
if (isRGBProfile(header, tags))
return new ICC_ProfileRGB(data);
if (isGrayProfile(header, tags))
return new ICC_ProfileGray(data);
return new ICC_Profile(header, tags);
}
public static ICC_Profile getInstance(int cspace)
{
if (cspace == ColorSpace.CS_sRGB || cspace == ColorSpace.CS_LINEAR_RGB)
return new ICC_ProfileRGB(cspace);
if (cspace == ColorSpace.CS_GRAY)
return new ICC_ProfileGray(cspace);
return new ICC_Profile(cspace);
}
public static ICC_Profile getInstance(String filename)
throws IOException
{
return getInstance(new FileInputStream(filename));
}
public static ICC_Profile getInstance(InputStream in)
throws IOException
{
byte[] headerData = new byte[ProfileHeader.HEADERSIZE];
if (in.read(headerData) != ProfileHeader.HEADERSIZE)
throw new IllegalArgumentException("Invalid profile header");
ProfileHeader header = new ProfileHeader(headerData);
header.verifyHeader(-1);
byte[] data = new byte[header.getSize()];
System.arraycopy(headerData, 0, data, 0, ProfileHeader.HEADERSIZE);
if (in.read(data, ProfileHeader.HEADERSIZE,
header.getSize() - ProfileHeader.HEADERSIZE) != header.getSize()
- ProfileHeader.HEADERSIZE)
throw new IOException("Incorrect profile size");
return getInstance(data);
}
public int getMajorVersion()
{
return header.getMajorVersion();
}
public int getMinorVersion()
{
return header.getMinorVersion();
}
public int getProfileClass()
{
return header.getProfileClass();
}
public int getColorSpaceType()
{
return header.getColorSpace();
}
public int getPCSType()
{
return header.getProfileColorSpace();
}
public void write(String filename) throws IOException
{
FileOutputStream out = new FileOutputStream(filename);
write(out);
out.flush();
out.close();
}
public void write(OutputStream out) throws IOException
{
out.write(getData());
}
public byte[] getData()
{
int size = getSize();
byte[] data = new byte[size];
System.arraycopy(header.getData(size), 0, data, 0, ProfileHeader.HEADERSIZE);
byte[] tt = getTagTable();
System.arraycopy(tt, 0, data, ProfileHeader.HEADERSIZE, tt.length);
Enumeration e = tagTable.elements();
while (e.hasMoreElements())
{
TagEntry tag = (TagEntry) e.nextElement();
System.arraycopy(tag.getData(), 0,
data, tag.getOffset(), tag.getSize());
}
return data;
}
public byte[] getData(int tagSignature)
{
if (tagSignature == icSigHead)
return header.getData(getSize());
TagEntry t = (TagEntry) tagTable.get(TagEntry.tagHashKey(tagSignature));
if (t == null)
return null;
return t.getData();
}
public void setData(int tagSignature, byte[] data)
{
profileID = -1;
if (tagSignature == icSigHead)
header = new ProfileHeader(data);
else
{
TagEntry t = new TagEntry(tagSignature, data);
tagTable.put(t.hashKey(), t);
}
}
public int getNumComponents()
{
int[] lookup =
{
ColorSpace.TYPE_RGB, 3, ColorSpace.TYPE_CMY, 3,
ColorSpace.TYPE_CMYK, 4, ColorSpace.TYPE_GRAY, 1,
ColorSpace.TYPE_YCbCr, 3, ColorSpace.TYPE_XYZ, 3,
ColorSpace.TYPE_Lab, 3, ColorSpace.TYPE_HSV, 3,
ColorSpace.TYPE_2CLR, 2, ColorSpace.TYPE_Luv, 3,
ColorSpace.TYPE_Yxy, 3, ColorSpace.TYPE_HLS, 3,
ColorSpace.TYPE_3CLR, 3, ColorSpace.TYPE_4CLR, 4,
ColorSpace.TYPE_5CLR, 5, ColorSpace.TYPE_6CLR, 6,
ColorSpace.TYPE_7CLR, 7, ColorSpace.TYPE_8CLR, 8,
ColorSpace.TYPE_9CLR, 9, ColorSpace.TYPE_ACLR, 10,
ColorSpace.TYPE_BCLR, 11, ColorSpace.TYPE_CCLR, 12,
ColorSpace.TYPE_DCLR, 13, ColorSpace.TYPE_ECLR, 14,
ColorSpace.TYPE_FCLR, 15
};
for (int i = 0; i < lookup.length; i += 2)
if (header.getColorSpace() == lookup[i])
return lookup[i + 1];
return 3; }
protected Object readResolve() throws ObjectStreamException
{
if (isRGBProfile(header, tagTable))
return new ICC_ProfileRGB(getData());
if (isGrayProfile(header, tagTable))
return new ICC_ProfileGray(getData());
return this;
}
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException
{
s.defaultReadObject();
String predef = (String) s.readObject();
byte[] data = (byte[]) s.readObject();
if (data != null)
{
header = new ProfileHeader(data);
tagTable = createTagTable(data);
profileID = -1; }
if (predef != null)
{
predef = predef.intern();
if (predef.equals("CS_sRGB"))
createProfile(ColorSpace.CS_sRGB);
if (predef.equals("CS_LINEAR_RGB"))
createProfile(ColorSpace.CS_LINEAR_RGB);
if (predef.equals("CS_CIEXYZ"))
createProfile(ColorSpace.CS_CIEXYZ);
if (predef.equals("CS_GRAY"))
createProfile(ColorSpace.CS_GRAY);
if (predef.equals("CS_PYCC"))
createProfile(ColorSpace.CS_PYCC);
}
}
private void writeObject(ObjectOutputStream s) throws IOException
{
s.defaultWriteObject();
if (profileID == ColorSpace.CS_sRGB)
s.writeObject("CS_sRGB");
else if (profileID == ColorSpace.CS_LINEAR_RGB)
s.writeObject("CS_LINEAR_RGB");
else if (profileID == ColorSpace.CS_CIEXYZ)
s.writeObject("CS_CIEXYZ");
else if (profileID == ColorSpace.CS_GRAY)
s.writeObject("CS_GRAY");
else if (profileID == ColorSpace.CS_PYCC)
s.writeObject("CS_PYCC");
else
{
s.writeObject(null); s.writeObject(getData()); return;
}
s.writeObject(null); }
private static Hashtable createTagTable(byte[] data)
throws IllegalArgumentException
{
ByteBuffer buf = ByteBuffer.wrap(data);
int nTags = buf.getInt(tagTableOffset);
Hashtable tagTable = new Hashtable();
for (int i = 0; i < nTags; i++)
{
TagEntry te = new TagEntry(buf.getInt(tagTableOffset
+ i * TagEntry.entrySize + 4),
buf.getInt(tagTableOffset
+ i * TagEntry.entrySize + 8),
buf.getInt(tagTableOffset
+ i * TagEntry.entrySize + 12),
data);
if (tagTable.put(te.hashKey(), te) != null)
throw new IllegalArgumentException("Duplicate tag in profile:" + te);
}
return tagTable;
}
private int getSize()
{
int totalSize = ProfileHeader.HEADERSIZE;
int tagTableSize = 4 + tagTable.size() * TagEntry.entrySize; if ((tagTableSize & 0x0003) != 0)
tagTableSize += 4 - (tagTableSize & 0x0003); totalSize += tagTableSize;
Enumeration e = tagTable.elements();
while (e.hasMoreElements())
{ int tagSize = ((TagEntry) e.nextElement()).getSize();
if ((tagSize & 0x0003) != 0)
tagSize += 4 - (tagSize & 0x0003); totalSize += tagSize;
}
return totalSize;
}
private byte[] getTagTable()
{
int tagTableSize = 4 + tagTable.size() * TagEntry.entrySize;
if ((tagTableSize & 0x0003) != 0)
tagTableSize += 4 - (tagTableSize & 0x0003);
int offset = 4;
int tagOffset = ProfileHeader.HEADERSIZE + tagTableSize;
ByteBuffer buf = ByteBuffer.allocate(tagTableSize);
buf.putInt(tagTable.size());
Enumeration e = tagTable.elements();
while (e.hasMoreElements())
{
TagEntry tag = (TagEntry) e.nextElement();
buf.putInt(offset, tag.getSignature());
buf.putInt(offset + 4, tagOffset);
buf.putInt(offset + 8, tag.getSize());
tag.setOffset(tagOffset);
int tagSize = tag.getSize();
if ((tagSize & 0x0003) != 0)
tagSize += 4 - (tagSize & 0x0003); tagOffset += tagSize;
offset += 12;
}
return buf.array();
}
private static boolean isRGBProfile(ProfileHeader header, Hashtable tags)
{
if (header.getColorSpace() != ColorSpace.TYPE_RGB)
return false;
if (tags.get(TagEntry.tagHashKey(icSigRedColorantTag)) == null)
return false;
if (tags.get(TagEntry.tagHashKey(icSigGreenColorantTag)) == null)
return false;
if (tags.get(TagEntry.tagHashKey(icSigBlueColorantTag)) == null)
return false;
if (tags.get(TagEntry.tagHashKey(icSigRedTRCTag)) == null)
return false;
if (tags.get(TagEntry.tagHashKey(icSigGreenTRCTag)) == null)
return false;
if (tags.get(TagEntry.tagHashKey(icSigBlueTRCTag)) == null)
return false;
return (tags.get(TagEntry.tagHashKey(icSigMediaWhitePointTag)) != null);
}
private static boolean isGrayProfile(ProfileHeader header, Hashtable tags)
{
if (header.getColorSpace() != ColorSpace.TYPE_GRAY)
return false;
if (tags.get(TagEntry.tagHashKey(icSigGrayTRCTag)) == null)
return false;
return (tags.get(TagEntry.tagHashKey(icSigMediaWhitePointTag)) != null);
}
short[] getCurve(int signature)
{
byte[] data = getData(signature);
short[] curve;
if (data == null)
return null;
ByteBuffer buf = ByteBuffer.wrap(data);
if (buf.getInt(0) != 0x63757276) return null;
int count = buf.getInt(8);
if (count == 0)
{
curve = new short[1];
curve[0] = 0x0100; return curve;
}
if (count == 1)
{
curve = new short[1];
curve[0] = buf.getShort(12); return curve;
}
curve = new short[count];
for (int i = 0; i < count; i++)
curve[i] = buf.getShort(12 + i * 2);
return curve;
}
float[] getXYZData(int signature)
{
byte[] data = getData(signature);
if (data == null)
return null;
ByteBuffer buf = ByteBuffer.wrap(data);
if (buf.getInt(0) != icSigXYZData) return null;
float[] point = new float[3];
point[0] = ((float) buf.getInt(8)) / 65536f;
point[1] = ((float) buf.getInt(12)) / 65536f;
point[2] = ((float) buf.getInt(16)) / 65536f;
return point;
}
int isPredefined()
{
return profileID;
}
private byte[] makeXYZData(float[] values)
{
ByteBuffer buf = ByteBuffer.allocate(20);
buf.putInt(0, icSigXYZData); buf.putInt(4, 0);
buf.putInt(8, (int) (values[0] * 65536.0));
buf.putInt(12, (int) (values[1] * 65536.0));
buf.putInt(16, (int) (values[2] * 65536.0));
return buf.array();
}
private byte[] makeTextTag(String text)
{
int length = text.length();
ByteBuffer buf = ByteBuffer.allocate(8 + length + 1);
byte[] data;
try
{
data = text.getBytes("US-ASCII");
}
catch (UnsupportedEncodingException e)
{
data = new byte[length]; }
buf.putInt(0, (int) 0x74657874); buf.putInt(4, 0);
for (int i = 0; i < length; i++)
buf.put(8 + i, data[i]);
buf.put(8 + length, (byte) 0); return buf.array();
}
private byte[] makeDescTag(String text)
{
int length = text.length();
ByteBuffer buf = ByteBuffer.allocate(90 + length + 1);
buf.putInt(0, (int) 0x64657363); buf.putInt(4, 0); buf.putInt(8, length + 1); byte[] data;
try
{
data = text.getBytes("US-ASCII");
}
catch (UnsupportedEncodingException e)
{
data = new byte[length]; }
for (int i = 0; i < length; i++)
buf.put(12 + i, data[i]);
buf.put(12 + length, (byte) 0);
for (int i = 0; i < 39; i++)
buf.putShort(13 + length + (i * 2), (short) 0);
return buf.array();
}
private byte[] makeTRC()
{
ByteBuffer buf = ByteBuffer.allocate(12);
buf.putInt(0, 0x63757276); buf.putInt(4, 0); buf.putInt(8, 0);
return buf.array();
}
private byte[] makeTRC(float gamma)
{
short gammaValue = (short) (gamma * 256f);
ByteBuffer buf = ByteBuffer.allocate(14);
buf.putInt(0, 0x63757276); buf.putInt(4, 0); buf.putInt(8, 1);
buf.putShort(12, gammaValue); return buf.array();
}
private byte[] makeTRC(float[] trc)
{
ByteBuffer buf = ByteBuffer.allocate(12 + 2 * trc.length);
buf.putInt(0, 0x63757276); buf.putInt(4, 0); buf.putInt(8, trc.length);
for (int i = 0; i < trc.length; i++)
buf.putShort(12 + i * 2, (short) (trc[i] * 65535f));
return buf.array();
}
private byte[] makeIdentityClut()
{
final int nIn = 3;
final int nOut = 3;
final int nInEntries = 256;
final int nOutEntries = 256;
final int gridpoints = 16;
final int clutSize = 2 * nOut * gridpoints * gridpoints * gridpoints;
final int totalSize = clutSize + 2 * nInEntries * nIn
+ 2 * nOutEntries * nOut + 52;
ByteBuffer buf = ByteBuffer.allocate(totalSize);
buf.putInt(0, 0x6D667432); buf.putInt(4, 0); buf.put(8, (byte) nIn); buf.put(9, (byte) nOut); buf.put(10, (byte) gridpoints); buf.put(11, (byte) 0);
buf.putInt(12, 65536); buf.putInt(16, 0);
buf.putInt(20, 0);
buf.putInt(24, 0);
buf.putInt(28, 65536);
buf.putInt(32, 0);
buf.putInt(36, 0);
buf.putInt(40, 0);
buf.putInt(44, 65536);
buf.putShort(48, (short) nInEntries); buf.putShort(50, (short) nOutEntries);
for (int channel = 0; channel < 3; channel++)
for (int i = 0; i < nInEntries; i++)
{
short n = (short) ((i << 8) | i); buf.putShort(52 + (channel * nInEntries + i) * 2, n);
}
int clutOffset = 52 + nInEntries * nIn * 2;
for (int x = 0; x < gridpoints; x++)
for (int y = 0; y < gridpoints; y++)
for (int z = 0; z < gridpoints; z++)
{
int offset = clutOffset + z * 2 * nOut + y * gridpoints * 2 * nOut
+ x * gridpoints * gridpoints * 2 * nOut;
double xf = ((double) x) / ((double) gridpoints - 1.0);
double yf = ((double) y) / ((double) gridpoints - 1.0);
double zf = ((double) z) / ((double) gridpoints - 1.0);
buf.putShort(offset, (short) (xf * 65535.0));
buf.putShort(offset + 2, (short) (yf * 65535.0));
buf.putShort(offset + 4, (short) (zf * 65535.0));
}
for (int channel = 0; channel < 3; channel++)
for (int i = 0; i < nOutEntries; i++)
{
short n = (short) ((i << 8) | i); buf.putShort(clutOffset + clutSize + (channel * nOutEntries + i) * 2,
n);
}
return buf.array();
}
private void createProfile(int colorSpace) throws IllegalArgumentException
{
this.profileID = colorSpace;
header = new ProfileHeader();
tagTable = new Hashtable();
switch (colorSpace)
{
case ColorSpace.CS_sRGB:
createRGBProfile();
return;
case ColorSpace.CS_LINEAR_RGB:
createLinearRGBProfile();
return;
case ColorSpace.CS_CIEXYZ:
createCIEProfile();
return;
case ColorSpace.CS_GRAY:
createGrayProfile();
return;
case ColorSpace.CS_PYCC:
createPyccProfile();
return;
default:
throw new IllegalArgumentException("Not a predefined color space!");
}
}
private void createRGBProfile()
{
header.setColorSpace( ColorSpace.TYPE_RGB );
header.setProfileColorSpace( ColorSpace.TYPE_XYZ );
ICC_ColorSpace cs = new ICC_ColorSpace(this);
float[] r = { 1f, 0f, 0f };
float[] g = { 0f, 1f, 0f };
float[] b = { 0f, 0f, 1f };
float[] black = { 0f, 0f, 0f };
float[] white = D50;
r = cs.toCIEXYZ(r);
g = cs.toCIEXYZ(g);
b = cs.toCIEXYZ(b);
cs = new ICC_ColorSpace(getInstance(ICC_ColorSpace.CS_LINEAR_RGB));
float[] points = new float[TRC_POINTS];
float[] in = new float[3];
for (int i = 0; i < TRC_POINTS; i++)
{
in[0] = in[1] = in[2] = ((float) i) / ((float) TRC_POINTS - 1);
in = cs.fromRGB(in);
points[i] = in[0];
}
setData(icSigRedColorantTag, makeXYZData(r));
setData(icSigGreenColorantTag, makeXYZData(g));
setData(icSigBlueColorantTag, makeXYZData(b));
setData(icSigMediaWhitePointTag, makeXYZData(white));
setData(icSigMediaBlackPointTag, makeXYZData(black));
setData(icSigRedTRCTag, makeTRC(points));
setData(icSigGreenTRCTag, makeTRC(points));
setData(icSigBlueTRCTag, makeTRC(points));
setData(icSigCopyrightTag, makeTextTag(copyrightNotice));
setData(icSigProfileDescriptionTag, makeDescTag("Generic sRGB"));
this.profileID = ColorSpace.CS_sRGB;
}
private void createLinearRGBProfile()
{
header.setColorSpace(ColorSpace.TYPE_RGB);
header.setProfileColorSpace(ColorSpace.TYPE_XYZ);
ICC_ColorSpace cs = new ICC_ColorSpace(this);
float[] r = { 1f, 0f, 0f };
float[] g = { 0f, 1f, 0f };
float[] b = { 0f, 0f, 1f };
float[] black = { 0f, 0f, 0f };
float[] white = D50;
r = cs.toCIEXYZ(r);
g = cs.toCIEXYZ(g);
b = cs.toCIEXYZ(b);
setData(icSigRedColorantTag, makeXYZData(r));
setData(icSigGreenColorantTag, makeXYZData(g));
setData(icSigBlueColorantTag, makeXYZData(b));
setData(icSigMediaWhitePointTag, makeXYZData(white));
setData(icSigMediaBlackPointTag, makeXYZData(black));
setData(icSigRedTRCTag, makeTRC());
setData(icSigGreenTRCTag, makeTRC());
setData(icSigBlueTRCTag, makeTRC());
setData(icSigCopyrightTag, makeTextTag(copyrightNotice));
setData(icSigProfileDescriptionTag, makeDescTag("Linear RGB"));
this.profileID = ColorSpace.CS_LINEAR_RGB;
}
private void createCIEProfile()
{
header.setColorSpace( ColorSpace.TYPE_XYZ );
header.setProfileColorSpace( ColorSpace.TYPE_XYZ );
header.setProfileClass( CLASS_COLORSPACECONVERSION );
ICC_ColorSpace cs = new ICC_ColorSpace(this);
float[] white = D50;
setData(icSigMediaWhitePointTag, makeXYZData(white));
setData(icSigAToB0Tag, makeIdentityClut());
setData(icSigBToA0Tag, makeIdentityClut());
setData(icSigCopyrightTag, makeTextTag(copyrightNotice));
setData(icSigProfileDescriptionTag, makeDescTag("CIE XYZ identity profile"));
this.profileID = ColorSpace.CS_CIEXYZ;
}
private void createGrayProfile()
{
header.setColorSpace(ColorSpace.TYPE_GRAY);
header.setProfileColorSpace(ColorSpace.TYPE_XYZ);
float[] white = D50;
setData(icSigMediaWhitePointTag, makeXYZData(white));
setData(icSigGrayTRCTag, makeTRC(1.0f));
setData(icSigCopyrightTag, makeTextTag(copyrightNotice));
setData(icSigProfileDescriptionTag, makeDescTag("Linear grayscale"));
this.profileID = ColorSpace.CS_GRAY;
}
private void createPyccProfile()
{
header.setColorSpace(ColorSpace.TYPE_3CLR);
header.setProfileColorSpace(ColorSpace.TYPE_XYZ);
setData(icSigCopyrightTag, makeTextTag(copyrightNotice));
setData(icSigProfileDescriptionTag, makeDescTag("Photo YCC"));
this.profileID = ColorSpace.CS_PYCC;
}
}