Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Gif Encoder

/*   *  * Part of the InfoGlue Content Management Platform (www.infoglue.org)  *  *   *  *  Copyright (C)  *   * This program is free software; you can redistribute it and/or modify it under  * the terms of the GNU General Public License version 2, as published by the  * Free Software Foundation. See the file LICENSE.html for more information.  *   * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.  *   * You should have received a copy of the GNU General Public License along with  * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple  * Place, Suite 330 / Boston, MA 02111-1307 / USA.  *  *   */ import java.awt.Color; import java.awt.image.BufferedImage; import java.io.*; import java.util.*; public class GifEncoder {     String b;     int g;     int a;     int h;     int f;     int c[];     int i[];     int e[];     TreeSet d;     private void a(int ai[], int j, DataOutputStream dataoutputstream) throws Exception     {         try         {             boolean flag2 = false;             int l;             int j3 = (1 << (l = j + 1)) - 1;             int i2 = (1 << j) + 2;             byte abyte0[] = new byte[255];             int ai1[] = new int[4096];             int ai2[] = new int[4096];             int ai3[] = new int[4096];             int ai4[] = new int[i2];             int k;             for(k = 0; k < i2; k++)             {                 ai4[k] = 0xffffffff | k;                 ai3[k] = -1;             }             for(; k < 4096; k++)             {                 ai3[k] = -1;             }             System.arraycopy(ai3, 0, ai1, 0, 4096);             System.arraycopy(ai3, 0, ai2, 0, 4096);             System.arraycopy(ai4, 0, ai1, 0, i2);             int j1 = ai[0];             k = 1;             boolean flag1 = false;             int j2 = 0;             int k2 = (1 << l) - 1;             boolean flag = true;             int i3 = 0;             int i1 = 0;             j2 |= 1 << j + i3;             for(i3 += l; i3 >= 8;)             {                 try                 {                     abyte0[i1++] = (byte)j2;                 }                 catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception)                 {                     dataoutputstream.writeByte(255);                     dataoutputstream.write(abyte0);                     abyte0[i1 = 0] = (byte)j2;                     i1++;                 }                 i3 -= 8;                 j2 >>= 8;             }             try             {                 do                 {                     int k1;                     int l1 = j1 << 16 | (k1 = ai[k++]);                     int k3;                     for(k3 = j1; ai1[k3] != l1 && ai2[k3] >= 0; k3 = ai2[k3]) { }                     if(ai1[k3] != l1)                     {                         j2 |= j1 << i3;                         for(i3 += l; i3 >= 8;)                         {                             try                             {                                 abyte0[i1++] = (byte)j2;                             }                             catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception1)                             {                                 dataoutputstream.writeByte(255);                                 dataoutputstream.write(abyte0);                                 abyte0[i1 = 0] = (byte)j2;                                 i1++;                             }                             i3 -= 8;                             j2 >>= 8;                         }                         if(i2 > j3)                         {                             l++;                             j3 = (j3 << 1) + 1;                         }                         try                         {                             ai2[k3] = i2;                             ai1[i2++] = j1 << 16 | k1;                             j1 = k1;                         }                         catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception2)                         {                             j1 = k1;                             l--;                             j2 |= 1 << j + i3;                             for(i3 += l; i3 >= 8;)                             {                                 try                                 {                                     abyte0[i1++] = (byte)j2;                                 }                                 catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception5)                                 {                                     dataoutputstream.writeByte(255);                                     dataoutputstream.write(abyte0);                                     abyte0[i1 = 0] = (byte)j2;                                     i1++;                                 }                                 i3 -= 8;                                 j2 >>= 8;                             }                             j3 = (1 << (l = j + 1)) - 1;                             i2 = (1 << j) + 2;                             int l2 = (1 << l) - 1;                             System.arraycopy(ai3, 0, ai1, 0, 4096);                             System.arraycopy(ai3, 0, ai2, 0, 4096);                             System.arraycopy(ai4, 0, ai1, 0, i2);                         }                     }                     else                     {                         j1 = k3;                     }                 }                 while(true);             }             catch(Exception exception)             {                 j2 |= j1 << i3;             }             for(i3 += l; i3 >= 8;)             {                 try                 {                     abyte0[i1++] = (byte)j2;                 }                 catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception3)                 {                     dataoutputstream.writeByte(255);                     dataoutputstream.write(abyte0);                     abyte0[i1 = 0] = (byte)j2;                     i1++;                 }                 i3 -= 8;                 j2 >>= 8;             }             j2 |= (1 << j) + 1 << i3;             for(i3 += l; i3 > 0;)             {                 try                 {                     abyte0[i1++] = (byte)j2;                 }                 catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception4)                 {                     dataoutputstream.writeByte(255);                     dataoutputstream.write(abyte0);                     abyte0[i1 = 0] = (byte)j2;                     i1++;                 }                 i3 -= 8;                 j2 >>= 8;             }             dataoutputstream.writeByte(i1);             dataoutputstream.write(abyte0, 0, i1);             dataoutputstream.writeByte(0);             return;         }         catch(Exception e) { }     }     public void addTransparentColor(Color color)     {         try         {             if(f < 256)             {                 c[f++] = color.getRGB();             }             return;         }         catch(Exception e) { }     }     public void setTransparentColors(Vector vector)     {         try         {             Iterator iterator = vector.iterator();             while(iterator.hasNext())              {                 Color color = (Color)iterator.next();                 addTransparentColor(color);             }             return;         }         catch(Exception e) { }     }     public void encode(BufferedImage bufferedimage, DataOutputStream dataoutputstream, Hashtable hashtable) throws Exception     {         try         {             a = bufferedimage.getWidth();             g = bufferedimage.getHeight();             e = bufferedimage.getRGB(0, 0, a, g, null, 0, a);             int i4 = 0;             b = hashtable.get("encoding").toString();             if(b.equals("websafe"))             {                 int ai[] = new int[256];                 i = new int[256];                 h = 8;                 int k1 = 0;                 int j;                 int j1 = j = 0;                 for(; j <= 255; j += 51)                 {                     for(int l = 0; l <= 255; l += 51)                     {                         for(int i1 = 0; i1 <= 255;)                         {                             i[j1] = (j << 16) + (l << 8) + i1;                             ai[k1++] = j1;                             i1 += 51;                             j1++;                         }                     }                 }                 if(f > 0)                 {                     int j4 = c[0];                     int l1 = ((c[0] >> 16 & 0xff) + 25) / 51;                     int k2 = ((c[0] >> 8 & 0xff) + 25) / 51;                     int j3 = ((c[0] & 0xff) + 25) / 51;                     i4 = l1 * 36 + k2 * 6 + j3;                     for(j = 1; j < f; j++)                     {                         int i2 = ((c[j] >> 16 & 0xff) + 25) / 51;                         int l2 = ((c[j] >> 8 & 0xff) + 25) / 51;                         int k3 = ((c[j] & 0xff) + 25) / 51;                         ai[i2 * 36 + l2 * 6 + k3] = i4;                     }                 }                 j = 0;                 try                 {                     do                     {                         int i5 = e[j];                         int j2 = ((i5 >> 16 & 0xff) + 25) / 51;                         int i3 = ((i5 >> 8 & 0xff) + 25) / 51;                         int l3 = ((i5 & 0xff) + 25) / 51;                         e[j++] = ai[j2 * 36 + i3 * 6 + l3];                     }                     while(true);                 }                 catch(Exception exception1) { }             }             /*else             if(b.equals("optimized"))             {                 try                 {                     int k4 = Integer.parseInt(hashtable.get("colors").toString());                     for(h = 1; k4 - 1 >> h > 0; h++) { }                     i = new int[1 << h];                     CSelectiveQuant cselectivequant = new CSelectiveQuant();                     for(int j5 = 0; j5 < e.length; j5++)                     {                         cselectivequant.addPixel(e[j5]);                     }                     boolean flag = f > 0;                     int k5 = flag ? 1 : 0;                     int ai1[] = cselectivequant.createPalette(k4 - k5);                     for(int l5 = 0; l5 < i.length; l5++)                     {                         try                         {                             i[l5] = ai1[l5 - k5];                         }                         catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception)                         {                             i[l5] = 0;                         }                     }                     if(flag)                     {                         i4 = 0;                         for(int i6 = 0; i6 < f; i6++)                         {                             cselectivequant.setIndex(c[i6], -1);                         }                     }                     for(int j6 = 0; j6 < e.length; j6++)                     {                         e[j6] = cselectivequant.getIndex(e[j6]) + k5;                     }                 }                 catch(NumberFormatException numberformatexception)                 {                     CmsLogger.logInfo("Parameter: 'colors' is malformated...");                     return;                 }             }             */             dataoutputstream.write("GIF89a".getBytes());             dataoutputstream.writeByte(a);             dataoutputstream.writeByte(a >> 8);             dataoutputstream.writeByte(g);             dataoutputstream.writeByte(g >> 8);             dataoutputstream.writeByte(0xf0 | h - 1);             dataoutputstream.writeByte(0);             dataoutputstream.writeByte(0);             int k = 0;             try             {                 do                 {                     int l4 = i[k++];                     dataoutputstream.writeByte(l4 >> 16 & 0xff);                     dataoutputstream.writeByte(l4 >> 8 & 0xff);                     dataoutputstream.writeByte(l4 & 0xff);                 }                 while(true);             }             catch(Exception exception) { }             if(f > 0)             {                 dataoutputstream.writeByte(33);                 dataoutputstream.writeByte(249);                 dataoutputstream.writeByte(4);                 dataoutputstream.writeByte(1);                 dataoutputstream.writeByte(0);                 dataoutputstream.writeByte(0);                 dataoutputstream.writeByte(i4);                 dataoutputstream.writeByte(0);             }             dataoutputstream.writeByte(44);             dataoutputstream.writeByte(0);             dataoutputstream.writeByte(0);             dataoutputstream.writeByte(0);             dataoutputstream.writeByte(0);             dataoutputstream.writeByte(a);             dataoutputstream.writeByte(a >> 8);             dataoutputstream.writeByte(g);             dataoutputstream.writeByte(g >> 8);             dataoutputstream.writeByte(0);             dataoutputstream.writeByte(h);             a(e, h, dataoutputstream);             dataoutputstream.writeByte(59);             dataoutputstream.flush();             return;         }         catch(Exception e) { }     }     public GifEncoder()     {         f = 0;         c = new int[256];     } }