View Javadoc

1   // Copyright 2001-2007, FreeHEP.
2   package org.freehep.graphicsio.swf;
3   
4   import java.awt.Color;
5   import java.awt.Image;
6   import java.awt.image.BufferedImage;
7   import java.awt.image.ImageObserver;
8   import java.awt.image.RenderedImage;
9   import java.awt.image.WritableRaster;
10  import java.io.ByteArrayInputStream;
11  import java.io.IOException;
12  import java.util.Properties;
13  import java.util.zip.InflaterInputStream;
14  
15  import org.freehep.graphicsio.ImageGraphics2D;
16  import org.freehep.graphicsio.ImageConstants;
17  import org.freehep.util.images.ImageUtilities;
18  
19  /**
20   * DefineBitsJPEG3 TAG.
21   * 
22   * @author Mark Donszelmann
23   * @author Charles Loomis
24   * @version $Id: DefineBitsJPEG3.java 10269 2007-01-09 00:32:55Z duns $
25   */
26  public class DefineBitsJPEG3 extends DefineBitsJPEG2 {
27  
28      public DefineBitsJPEG3(int id, Image image, Properties options, Color bkg,
29              ImageObserver observer) {
30          this(id, ImageUtilities.createRenderedImage(image, observer, bkg), bkg,
31                  options);
32      }
33  
34      public DefineBitsJPEG3(int id, RenderedImage image, Color bkg,
35              Properties options) {
36          this();
37          character = id;
38          this.image = image;
39          this.options = options;
40      }
41  
42      public DefineBitsJPEG3() {
43          super(35, 3);
44      }
45  
46      public SWFTag read(int tagID, SWFInputStream swf, int len)
47              throws IOException {
48  
49          DefineBitsJPEG3 tag = new DefineBitsJPEG3();
50          tag.character = swf.readUnsignedShort();
51          swf.getDictionary().put(tag.character, tag);
52          int jpegLen = (int) swf.readUnsignedInt();
53          byte[] data = swf.readByte(jpegLen);
54  
55          ByteArrayInputStream bais = new ByteArrayInputStream(data);
56          BufferedImage bi = ImageGraphics2D.readImage(ImageConstants.JPG.toLowerCase(), bais);
57          if (bais.available() > 0)
58              System.err.println("DefineBitsJPEG3: not all bytes read: "
59                      + bais.available());
60  
61          int width = bi.getWidth();
62          int height = bi.getHeight();
63          InflaterInputStream zip = new InflaterInputStream(swf);
64          byte[] alpha = new byte[width * height];
65          zip.read(alpha);
66  
67          WritableRaster raster = bi.getAlphaRaster();
68          for (int y = 0; y < height; y++) {
69              for (int x = 0; x < width; x++) {
70                  raster.setPixel(x, y, new int[] { alpha[y * width + x] });
71              }
72          }
73  
74          tag.image = bi;
75          return tag;
76      }
77  
78      public void write(int tagID, SWFOutputStream swf) throws IOException {
79  
80          swf.writeUnsignedShort(character);
81          swf.writeUnsignedInt(imageLength);
82          swf.write(getImageBytes());
83      }
84  
85      public int getLength() throws IOException {
86          return getImageBytes().length + 2;
87      }
88  
89      private byte[] imageBytes;
90  
91      private int imageLength;
92  
93      private byte[] getImageBytes() throws IOException {
94          if (imageBytes == null) {
95  
96              // calculate jpg bytes
97              byte[] jpgBytes = ImageGraphics2D.toByteArray(
98                  image, ImageConstants.JPG, null, null);
99              imageLength = jpgBytes.length;
100 
101             // calculate raw bytes
102             byte[] rawBytes = ImageGraphics2D.toByteArray(
103                 image,
104                 ImageConstants.RAW,
105                 ImageConstants.ENCODING_FLATE,
106                 ImageGraphics2D.getRAWProperties(Color.black, ImageConstants.COLOR_MODEL_A));
107 
108             // write jpgBytes and rawBytes into the imageBytes
109             imageBytes = new byte[jpgBytes.length + rawBytes.length];
110             System.arraycopy(jpgBytes, 0, imageBytes, 0, jpgBytes.length);
111             System.arraycopy(rawBytes, 0, imageBytes, jpgBytes.length, rawBytes.length);
112         }
113         return imageBytes;
114     }
115 
116     public String toString() {
117         StringBuffer s = new StringBuffer();
118         s.append(super.toString() + "\n");
119         s.append("  character:   " + character + "\n");
120         s.append("  image:      " + image + "\n");
121         return s.toString();
122     }
123 }