// Copyright 2001, FreeHEP.
package org.freehep.graphicsio.swf;
import java.awt.Color;
import java.io.IOException;
import org.freehep.util.io.BitOutputStream;
/**
* SWF Color Transform
*
* @author Mark Donszelmann
* @author Charles Loomis
* @version $Id: ColorXform.java 8584 2006-08-10 23:06:37Z duns $
*/
public class ColorXform {
private int rx = 0x0100;
private int gx = 0x0100;
private int bx = 0x0100;
private int ax = 0x0100;
private int rp = 0;
private int gp = 0;
private int bp = 0;
private int ap = 0;
public ColorXform(int rx, int gx, int bx, int ax, int rp, int gp, int bp,
int ap) {
this.rx = rx;
this.gx = gx;
this.bx = bx;
this.ax = ax;
this.rp = rp;
this.gp = gp;
this.bp = bp;
this.ap = ap;
}
/**
* Read a color transform from the stream.
*/
public ColorXform(SWFInputStream swf, boolean hasAlpha) throws IOException {
swf.byteAlign();
boolean add = swf.readBitFlag();
boolean mult = swf.readBitFlag();
int nbits = (int) swf.readUBits(4);
if (mult) {
rx = (int) swf.readSBits(nbits);
gx = (int) swf.readSBits(nbits);
bx = (int) swf.readSBits(nbits);
if (hasAlpha)
ax = (int) swf.readSBits(nbits);
}
if (add) {
rp = (int) swf.readSBits(nbits);
gp = (int) swf.readSBits(nbits);
bp = (int) swf.readSBits(nbits);
if (hasAlpha)
ap = (int) swf.readSBits(nbits);
}
}
public Color transform(Color c) {
int red = (int) Math.max(0, Math.min(((c.getRed() * rx) / 256.0) + rp,
255));
int green = (int) Math.max(0, Math.min(((c.getGreen() * gx) / 256.0)
+ gp, 255));
int blue = (int) Math.max(0, Math.min(
((c.getBlue() * bx) / 256.0) + bp, 255));
int alpha = (int) Math.max(0, Math.min(((c.getAlpha() * ax) / 256.0)
+ ap, 255));
return new Color(red, green, blue, alpha);
}
public void write(SWFOutputStream swf, boolean hasAlpha) throws IOException {
swf.byteAlign();
boolean add = (rp != 0) || (gp != 0) || (bp != 0)
|| (hasAlpha && (ap != 0));
boolean mult = (rx != 1) || (gx != 1) || (bx != 1)
|| (hasAlpha && (ax != 1));
int nbits = 0;
if (mult) {
nbits = Math.max(nbits, BitOutputStream.minBits(rx, true));
nbits = Math.max(nbits, BitOutputStream.minBits(gx, true));
nbits = Math.max(nbits, BitOutputStream.minBits(bx, true));
if (hasAlpha) {
nbits = Math.max(nbits, BitOutputStream.minBits(ax, true));
}
}
if (add) {
nbits = Math.max(nbits, BitOutputStream.minBits(rp, true));
nbits = Math.max(nbits, BitOutputStream.minBits(gp, true));
nbits = Math.max(nbits, BitOutputStream.minBits(bp, true));
if (hasAlpha) {
nbits = Math.max(nbits, BitOutputStream.minBits(ap, true));
}
}
swf.writeBitFlag(add);
swf.writeBitFlag(mult);
swf.writeUBits(nbits, 4);
if (mult) {
swf.writeSBits(rx, nbits);
swf.writeSBits(gx, nbits);
swf.writeSBits(bx, nbits);
if (hasAlpha)
swf.writeSBits(ax, nbits);
}
if (add) {
swf.writeSBits(rp, nbits);
swf.writeSBits(gp, nbits);
swf.writeSBits(bp, nbits);
if (hasAlpha)
swf.writeSBits(ap, nbits);
}
}
public String toString() {
return "CXForm(" + rx + ", " + gx + ", " + bx + ", " + ax + " : " + rp
+ ", " + gp + ", " + bp + ", " + ap + ")";
}
}