1
2 package org.freehep.graphicsio.swf;
3
4 import java.awt.Color;
5 import java.io.IOException;
6
7 import org.freehep.util.io.BitOutputStream;
8
9
10
11
12
13
14
15
16 public class ColorXform {
17
18 private int rx = 0x0100;
19
20 private int gx = 0x0100;
21
22 private int bx = 0x0100;
23
24 private int ax = 0x0100;
25
26 private int rp = 0;
27
28 private int gp = 0;
29
30 private int bp = 0;
31
32 private int ap = 0;
33
34 public ColorXform(int rx, int gx, int bx, int ax, int rp, int gp, int bp,
35 int ap) {
36 this.rx = rx;
37 this.gx = gx;
38 this.bx = bx;
39 this.ax = ax;
40 this.rp = rp;
41 this.gp = gp;
42 this.bp = bp;
43 this.ap = ap;
44 }
45
46
47
48
49 public ColorXform(SWFInputStream swf, boolean hasAlpha) throws IOException {
50
51 swf.byteAlign();
52
53 boolean add = swf.readBitFlag();
54 boolean mult = swf.readBitFlag();
55 int nbits = (int) swf.readUBits(4);
56
57 if (mult) {
58 rx = (int) swf.readSBits(nbits);
59 gx = (int) swf.readSBits(nbits);
60 bx = (int) swf.readSBits(nbits);
61 if (hasAlpha)
62 ax = (int) swf.readSBits(nbits);
63 }
64
65 if (add) {
66 rp = (int) swf.readSBits(nbits);
67 gp = (int) swf.readSBits(nbits);
68 bp = (int) swf.readSBits(nbits);
69 if (hasAlpha)
70 ap = (int) swf.readSBits(nbits);
71 }
72 }
73
74 public Color transform(Color c) {
75 int red = (int) Math.max(0, Math.min(((c.getRed() * rx) / 256.0) + rp,
76 255));
77 int green = (int) Math.max(0, Math.min(((c.getGreen() * gx) / 256.0)
78 + gp, 255));
79 int blue = (int) Math.max(0, Math.min(
80 ((c.getBlue() * bx) / 256.0) + bp, 255));
81 int alpha = (int) Math.max(0, Math.min(((c.getAlpha() * ax) / 256.0)
82 + ap, 255));
83 return new Color(red, green, blue, alpha);
84 }
85
86 public void write(SWFOutputStream swf, boolean hasAlpha) throws IOException {
87
88 swf.byteAlign();
89
90 boolean add = (rp != 0) || (gp != 0) || (bp != 0)
91 || (hasAlpha && (ap != 0));
92 boolean mult = (rx != 1) || (gx != 1) || (bx != 1)
93 || (hasAlpha && (ax != 1));
94 int nbits = 0;
95 if (mult) {
96 nbits = Math.max(nbits, BitOutputStream.minBits(rx, true));
97 nbits = Math.max(nbits, BitOutputStream.minBits(gx, true));
98 nbits = Math.max(nbits, BitOutputStream.minBits(bx, true));
99 if (hasAlpha) {
100 nbits = Math.max(nbits, BitOutputStream.minBits(ax, true));
101 }
102 }
103 if (add) {
104 nbits = Math.max(nbits, BitOutputStream.minBits(rp, true));
105 nbits = Math.max(nbits, BitOutputStream.minBits(gp, true));
106 nbits = Math.max(nbits, BitOutputStream.minBits(bp, true));
107 if (hasAlpha) {
108 nbits = Math.max(nbits, BitOutputStream.minBits(ap, true));
109 }
110 }
111 swf.writeBitFlag(add);
112 swf.writeBitFlag(mult);
113 swf.writeUBits(nbits, 4);
114
115 if (mult) {
116 swf.writeSBits(rx, nbits);
117 swf.writeSBits(gx, nbits);
118 swf.writeSBits(bx, nbits);
119 if (hasAlpha)
120 swf.writeSBits(ax, nbits);
121 }
122 if (add) {
123 swf.writeSBits(rp, nbits);
124 swf.writeSBits(gp, nbits);
125 swf.writeSBits(bp, nbits);
126 if (hasAlpha)
127 swf.writeSBits(ap, nbits);
128 }
129 }
130
131 public String toString() {
132 return "CXForm(" + rx + ", " + gx + ", " + bx + ", " + ax + " : " + rp
133 + ", " + gp + ", " + bp + ", " + ap + ")";
134 }
135 }