package org.apache.fop.afp.goca;
import java.awt.Color;
import java.awt.color.ColorSpace;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.xmlgraphics.java2d.color.CIELabColorSpace;
import org.apache.xmlgraphics.java2d.color.ColorUtil;
import org.apache.xmlgraphics.java2d.color.ColorWithAlternatives;
public class GraphicsSetProcessColor extends AbstractGraphicsDrawingOrder {
private static final byte RGB = 0x01;
private static final byte CMYK = 0x04;
private static final byte CIELAB = 0x08;
private final Color color;
private final int componentsSize;
public GraphicsSetProcessColor(Color color) {
if (color instanceof ColorWithAlternatives) {
ColorWithAlternatives cwa = (ColorWithAlternatives)color;
Color alt = cwa.getFirstAlternativeOfType(ColorSpace.TYPE_CMYK);
if (alt != null) {
this.color = alt;
this.componentsSize = 4;
return;
}
}
ColorSpace cs = color.getColorSpace();
int colSpaceType = cs.getType();
if (colSpaceType == ColorSpace.TYPE_CMYK) {
this.color = color;
} else if (cs instanceof CIELabColorSpace) {
this.color = color;
} else {
if (!color.getColorSpace().isCS_sRGB()) {
this.color = ColorUtil.toSRGBColor(color);
} else {
this.color = color;
}
}
this.componentsSize = this.color.getColorSpace().getNumComponents();
}
public int getDataLength() {
return 12 + this.componentsSize;
}
@Override
byte getOrderCode() {
return (byte) 0xB2;
}
public void writeToStream(OutputStream os) throws IOException {
float[] colorComponents = color.getColorComponents(null);
byte colspace;
ColorSpace cs = color.getColorSpace();
int colSpaceType = cs.getType();
ByteArrayOutputStream baout = new ByteArrayOutputStream();
DataOutputStream dout = null;
byte[] colsizes;
if (colSpaceType == ColorSpace.TYPE_CMYK) {
colspace = CMYK;
colsizes = new byte[] {0x08, 0x08, 0x08, 0x08};
for (float colorComponent : colorComponents) {
baout.write(Math.round(colorComponent * 255));
}
} else if (colSpaceType == ColorSpace.TYPE_RGB) {
colspace = RGB;
colsizes = new byte[] {0x08, 0x08, 0x08, 0x00};
for (float colorComponent : colorComponents) {
baout.write(Math.round(colorComponent * 255));
}
} else if (cs instanceof CIELabColorSpace) {
colspace = CIELAB;
colsizes = new byte[] {0x08, 0x08, 0x08, 0x00};
dout = new DataOutputStream(baout);
int l = Math.round(colorComponents[0] * 100f);
int a = Math.round(colorComponents[1] * 255f) - 128;
int b = Math.round(colorComponents[2] * 255f) - 128;
dout.writeByte(l);
dout.writeByte(a);
dout.writeByte(b);
} else {
IOUtils.closeQuietly(baout);
throw new IllegalStateException();
}
int len = getDataLength();
byte[] data = new byte[12];
data[0] = getOrderCode();
data[1] = (byte) (len - 2);
data[2] = 0x00;
data[3] = colspace;
data[4] = 0x00;
data[5] = 0x00;
data[6] = 0x00;
data[7] = 0x00;
data[8] = colsizes[0];
data[9] = colsizes[1];
data[10] = colsizes[2];
data[11] = colsizes[3];
os.write(data);
baout.writeTo(os);
IOUtils.closeQuietly(dout);
IOUtils.closeQuietly(baout);
}
@Override
public String toString() {
return "GraphicsSetProcessColor(col=" + color + ")";
}
}