Methods Summary |
---|
public void | addStringToTable(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 void | addStringToTable(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.
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 int | getNextCode()
// 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 void | initializeStringTable()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 void | writeString(byte[] string)Write out the string just uncompressed.
for (int i=0; i<string.length; i++) {
uncompData[dstIndex++] = string[i];
}
|