View Javadoc

1   // Copyright 2001, FreeHEP.
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   * SWF Color Transform
11   * 
12   * @author Mark Donszelmann
13   * @author Charles Loomis
14   * @version $Id: ColorXform.java 8584 2006-08-10 23:06:37Z duns $
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       * Read a color transform from the stream.
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 }