org.apache.poi.util
Class LZWDecompresser

java.lang.Object
  extended by org.apache.poi.util.LZWDecompresser

public abstract class LZWDecompresser
extends java.lang.Object

This class provides common functionality for the various LZW implementations in the different file formats. It's currently used by HDGF and HMEF. Two good resources on LZW are: http://en.wikipedia.org/wiki/LZW http://marknelson.us/1989/10/01/lzw-data-compression/


Constructor Summary
protected LZWDecompresser(boolean maskMeansCompressed, int codeLengthIncrease, boolean positionIsBigEndian)
           
 
Method Summary
protected abstract  int adjustDictionaryOffset(int offset)
          Adjusts the position offset if needed when looking something up in the dictionary.
 byte[] decompress(java.io.InputStream src)
          Decompresses the given input stream, returning the array of bytes of the decompressed input.
 void decompress(java.io.InputStream src, java.io.OutputStream res)
          Perform a streaming decompression of the input.
static int fromByte(byte b)
          Given a java byte, turn it into an integer between 0 and 255 (i.e.
static byte fromInt(int b)
          Given an integer, turn it into a java byte, handling the wrapping.
protected abstract  int populateDictionary(byte[] dict)
          Populates the dictionary, and returns where in it to begin writing new codes.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

LZWDecompresser

protected LZWDecompresser(boolean maskMeansCompressed,
                          int codeLengthIncrease,
                          boolean positionIsBigEndian)
Method Detail

populateDictionary

protected abstract int populateDictionary(byte[] dict)
Populates the dictionary, and returns where in it to begin writing new codes. Generally, if the dictionary is pre-populated, then new codes should be placed at the end of that block. Equally, if the dictionary is left with all zeros, then usually the new codes can go in at the start.


adjustDictionaryOffset

protected abstract int adjustDictionaryOffset(int offset)
Adjusts the position offset if needed when looking something up in the dictionary.


decompress

public byte[] decompress(java.io.InputStream src)
                  throws java.io.IOException
Decompresses the given input stream, returning the array of bytes of the decompressed input.

Throws:
java.io.IOException

decompress

public void decompress(java.io.InputStream src,
                       java.io.OutputStream res)
                throws java.io.IOException
Perform a streaming decompression of the input. Works by: 1) Reading a flag byte, the 8 bits of which tell you if the following 8 codes are compressed our un-compressed 2) Consider the 8 bits in turn 3) If the bit is set, the next code is un-compressed, so add it to the dictionary and output it 4) If the bit isn't set, then read in the length and start position in the dictionary, and output the bytes there 5) Loop until we've done all 8 bits, then read in the next flag byte

Throws:
java.io.IOException

fromInt

public static byte fromInt(int b)
Given an integer, turn it into a java byte, handling the wrapping. This is a convenience method


fromByte

public static int fromByte(byte b)
Given a java byte, turn it into an integer between 0 and 255 (i.e. handle the unwrapping). This is a convenience method