home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161b.iso / handson / archive / Issue159 / files / java / ex2 / GIFImage.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-10-03  |  2.8 KB  |  136 lines

  1. import java.io.PrintStream;
  2.  
  3. public class GIFImage implements Animation {
  4.    int Width;
  5.    int Height;
  6.    boolean interlace = false;
  7.    boolean looping = true;
  8.    GIFGraphics[] graphics = new GIFGraphics[500];
  9.    int frameCount;
  10.    LZWCompressor compressor;
  11.    private int fps = 10;
  12.  
  13.    GIFImage(int var1, int var2) {
  14.       this.Width = var1;
  15.       this.Height = var2;
  16.       this.frameCount = 0;
  17.    }
  18.  
  19.    public void setFPS(int var1) {
  20.       this.fps = var1;
  21.    }
  22.  
  23.    public int getFPS() {
  24.       return this.fps;
  25.    }
  26.  
  27.    public int addImage(GIFGraphics var1) {
  28.       this.graphics[this.frameCount] = var1;
  29.       return this.frameCount++;
  30.    }
  31.  
  32.    public void serializeTo(PrintStream var1) {
  33.       this.encodeGIF(var1, 0, 0, 8);
  34.    }
  35.  
  36.    void encodeGIF(PrintStream var1, int var2, int var3, int var4) {
  37.       int var5;
  38.       if (var4 <= 1) {
  39.          var5 = 2;
  40.       } else {
  41.          var5 = var4;
  42.       }
  43.  
  44.       this.serializeHeader(var1, var3);
  45.       this.serializeLogicalScreen(var1, var2, var4, var5);
  46.       this.serializeData(var1, var3, var5);
  47.       this.serializeTrailer(var1);
  48.    }
  49.  
  50.    private void serializeHeader(PrintStream var1, int var2) {
  51.       var1.print((var2 < 0 ? "GIF87a" : "GIF89a").substring(0, 6));
  52.    }
  53.  
  54.    private void serializeLogicalScreen(PrintStream var1, int var2, int var3, int var4) {
  55.       int var7 = 1 << var3;
  56.       this.putWord(var1, this.Width);
  57.       this.putWord(var1, this.Height);
  58.       int var5 = 128;
  59.       var5 |= var3 - 1 << 5;
  60.       var5 |= var3 - 1;
  61.       var1.write(var5);
  62.       var1.write(var2);
  63.       var1.write(0);
  64.       this.serializeGlobalColourTable(var1, var7);
  65.    }
  66.  
  67.    private void serializeGlobalColourTable(PrintStream var1, int var2) {
  68.       for(int var3 = 0; var3 < var2; ++var3) {
  69.          var1.write((byte)GIFGraphics.Red[var3]);
  70.          var1.write((byte)GIFGraphics.Green[var3]);
  71.          var1.write((byte)GIFGraphics.Blue[var3]);
  72.       }
  73.  
  74.    }
  75.  
  76.    private void serializeData(PrintStream var1, int var2, int var3) {
  77.       LZWCompressor var4 = new LZWCompressor(var1, this.interlace);
  78.       if (this.looping) {
  79.          var1.write(33);
  80.          var1.write(255);
  81.          var1.write(11);
  82.          var1.print("NETSCAPE2.0");
  83.          var1.write(3);
  84.          var1.write(1);
  85.          this.putWord(var1, 0);
  86.          var1.write(0);
  87.       }
  88.  
  89.       for(int var5 = 0; var5 < this.frameCount; ++var5) {
  90.          this.serializeFrame(var1, var4, false, 100 / this.getFPS(), var2, var3, var5);
  91.       }
  92.  
  93.    }
  94.  
  95.    private void serializeFrame(PrintStream var1, LZWCompressor var2, boolean var3, int var4, int var5, int var6, int var7) {
  96.       if (var5 >= 0) {
  97.          var1.write(33);
  98.          var1.write(249);
  99.          var1.write(4);
  100.          if (var3) {
  101.             var1.write(9);
  102.          } else {
  103.             var1.write(1);
  104.          }
  105.  
  106.          this.putWord(var1, var4);
  107.          var1.write(var5);
  108.          var1.write(0);
  109.       }
  110.  
  111.       var1.write(44);
  112.       this.putWord(var1, this.graphics[var7].left);
  113.       this.putWord(var1, this.graphics[var7].top);
  114.       this.putWord(var1, this.graphics[var7].width);
  115.       this.putWord(var1, this.graphics[var7].height);
  116.       if (this.interlace) {
  117.          var1.write(64);
  118.       } else {
  119.          var1.write(0);
  120.       }
  121.  
  122.       var2.compress(var6 + 1, this.graphics[var7].width, this.graphics[var7].height, this.graphics[var7].getPixels());
  123.       var1.write(0);
  124.    }
  125.  
  126.    private void serializeTrailer(PrintStream var1) {
  127.       var1.write(59);
  128.       var1.flush();
  129.    }
  130.  
  131.    void putWord(PrintStream var1, int var2) {
  132.       var1.write((byte)(var2 & 255));
  133.       var1.write((byte)(var2 >> 8 & 255));
  134.    }
  135. }
  136.