package org.libtiff.jai.codecimpl; import java.awt.Rectangle; import org.libtiff.jai.codec.XTIFF; import org.libtiff.jai.codec.XTIFFField; import org.libtiff.jai.codec.XTIFFTileCodec; import org.libtiff.jai.codec.XTIFFTileCodecImpl; /** * This codec encapsulates all the logic for the TIFF "lzw" decoding codec * algorithm. */ public class XTIFFFaxTileCodec extends XTIFFTileCodecImpl { private XTIFFFaxDecoder decoder = null; // Fax compression related variables long tiffT4Options; long tiffT6Options; int fillOrder; /** * Public constructor */ public XTIFFFaxTileCodec() {} /** * Creation method */ public XTIFFTileCodec create() { return new XTIFFFaxTileCodec(); } public boolean canEncode() { return false; } /** * Registration method */ public void register() { register(XTIFF.COMPRESSION_FAX_G3_1D); register(XTIFF.COMPRESSION_FAX_G3_2D); register(XTIFF.COMPRESSION_FAX_G4_2D); } /** * The initialization method particular to Fax decoding. */ public void initializeDecoding() { XTIFFField fillOrderField = directory.getField(XTIFF.TIFFTAG_FILL_ORDER); if (fillOrderField != null) { fillOrder = fillOrderField.getAsInt(0); } else { // Default Fill Order fillOrder = 1; } // Fax T.4 compression options if (compression == 3) { XTIFFField t4OptionsField = directory.getField(XTIFF.TIFFTAG_T4_OPTIONS); if (t4OptionsField != null) { tiffT4Options = t4OptionsField.getAsLong(0); } else { // Use default value tiffT4Options = 0; } } // Fax T.6 compression options if (compression == 4) { XTIFFField t6OptionsField = directory.getField(XTIFF.TIFFTAG_T6_OPTIONS); if (t6OptionsField != null) { tiffT6Options = t6OptionsField.getAsLong(0); } else { // Use default value tiffT6Options = 0; } } decoder = new XTIFFFaxDecoder(fillOrder, tileWidth, tileLength); } /** * Decode a rectangle of pixels */ public void decodeTilePixels(byte[] input, Rectangle newRect, byte[] bdata) { if (compression == XTIFF.COMPRESSION_FAX_G3_1D) { decoder.decode1D(bdata, input, newRect.x, newRect.height); } else if (compression == XTIFF.COMPRESSION_FAX_G3_2D) { decoder.decode2D(bdata, input, newRect.x, newRect.height, tiffT4Options); } else if (compression == XTIFF.COMPRESSION_FAX_G4_2D) { decoder.decodeT6(bdata, input, newRect.x, newRect.height, tiffT6Options); } } /** * Decode a rectangle of pixels */ public void decodeTilePixels(byte[] input, Rectangle newRect, short[] sdata) { // not used for fax. } }