FileDocCategorySizeDatePackage
TIFFLZWDecoder.javaAPI DocApache Poi 3.0.15548Mon Jun 18 19:04:44 BST 2007org.apache.poi.hdgf.other_lzw

TIFFLZWDecoder

public class TIFFLZWDecoder extends Object
A class for performing LZW decoding.
version
$Id$

Fields Summary
byte[]
stringTable
byte[]
data
byte[]
uncompData
int
tableIndex
int
bitsToGet
int
bytePointer
int
bitPointer
int
dstIndex
int
w
int
h
int
predictor
int
samplesPerPixel
int
nextData
int
nextBits
int[]
andTable
Constructors Summary
public TIFFLZWDecoder()


   
 
Methods Summary
public voidaddStringToTable(byte[] oldString, byte newString)
Add a new string to the string table.

     int length = 0;
     if(oldString != null)
    	 length = oldString.length;
     byte[] string = new byte[length + 1];
     if(oldString != null)
    	 System.arraycopy(oldString, 0, string, 0, length);
     string[length] = newString;

     // Add this new String to the table
     stringTable[tableIndex++] = string;

     if (tableIndex == 511) {
         bitsToGet = 10;
     } else if (tableIndex == 1023) {
         bitsToGet = 11;
     } else if (tableIndex == 2047) {
         bitsToGet = 12;
     }
 
public voidaddStringToTable(byte[] string)
Add a new string to the string table.


     // Add this new String to the table
     stringTable[tableIndex++] = string;

     if (tableIndex == 511) {
         bitsToGet = 10;
     } else if (tableIndex == 1023) {
         bitsToGet = 11;
     } else if (tableIndex == 2047) {
         bitsToGet = 12;
     }
 
public byte[]composeString(byte[] oldString, byte newString)
Append newString to the end of oldString.

     int length = oldString.length;
     byte[] string = new byte[length + 1];
     System.arraycopy(oldString, 0, string, 0, length);
     string[length] = newString;

     return string;
 
public byte[]decode(byte[] data, byte[] uncompData)
Method to decode LZW compressed data.

param
data The compressed data.
param
uncompData Array to return the uncompressed data in.
param
h The number of rows the compressed data contains.


     if(data[0] == (byte)0x00 && data[1] == (byte)0x01) {
         throw new UnsupportedOperationException("TIFFLZWDecoder0");
     }

     initializeStringTable();

     this.data = data;
     this.h = h;
     this.uncompData = uncompData;

     // Initialize pointers
     bytePointer = 0;
     bitPointer = 0;
     dstIndex = 0;


     nextData = 0;
     nextBits = 0;

     int code, oldCode = 0;
     byte[] string;

     while ( ((code = getNextCode()) != 257) &&
             dstIndex != uncompData.length) {

         if (code == 256) {

             initializeStringTable();
             code = getNextCode();

             if (code == 257) {
                 break;
             }

             writeString(stringTable[code]);
             oldCode = code;

         } else {

             if (code < tableIndex) {

                 string = stringTable[code];

                 writeString(string);
                 addStringToTable(stringTable[oldCode], string[0]);
                 oldCode = code;

             } else {

                 string = stringTable[oldCode];
                 string = composeString(string, string[0]);
                 writeString(string);
                 addStringToTable(string);
                 oldCode = code;
             }

         }

     }

     return uncompData;
 
public intgetNextCode()

     // Attempt to get the next code. The exception is caught to make
     // this robust to cases wherein the EndOfInformation code has been
     // omitted from a strip. Examples of such cases have been observed
     // in practice.
     try {
         nextData = (nextData << 8) | (data[bytePointer++] & 0xff);
         nextBits += 8;

         if (nextBits < bitsToGet) {
             nextData = (nextData << 8) | (data[bytePointer++] & 0xff);
             nextBits += 8;
         }

         int code =
             (nextData >> (nextBits - bitsToGet)) & andTable[bitsToGet-9];
         nextBits -= bitsToGet;

         return code;
     } catch(ArrayIndexOutOfBoundsException e) {
         // Strip not terminated as expected: return EndOfInformation code.
         return 257;
     }
 
public voidinitializeStringTable()
Initialize the string table.


     stringTable = new byte[4096][];

     for (int i=0; i<256; i++) {
         stringTable[i] = new byte[1];
         stringTable[i][0] = (byte)i;
     }

     tableIndex = 256+2;
     bitsToGet = 9;
 
public voidwriteString(byte[] string)
Write out the string just uncompressed.


     for (int i=0; i<string.length; i++) {
         uncompData[dstIndex++] = string[i];
     }