Package org.libtiff.jai.codecimpl

Source Code of org.libtiff.jai.codecimpl.XTIFFLZWTileCodec

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;
import org.libtiff.jai.util.JaiI18N;

import com.sun.media.jai.codecimpl.TIFFLZWDecoder;

/**
* This codec encapsulates all the logic for the TIFF "lzw" decoding codec
* algorithm.
*/
public class XTIFFLZWTileCodec extends XTIFFTileCodecImpl {

    private TIFFLZWDecoder lzwDecoder = null;

    // LZW compression related variable
    int predictor;
    int samplesPerPixel;

    /**
     * Public constructor
     */
    public XTIFFLZWTileCodec() {}

    /**
     * Creation method
     */
    public XTIFFTileCodec create() {
        return new XTIFFLZWTileCodec();
    }

    // public boolean canEncode() {return true;}

    /**
     * Registration method
     */
    public void register() {
        register(XTIFF.COMPRESSION_LZW);
    }

    /**
     * The initialization method particular to LZW decoding.
     */
    public void initializeDecoding() {
        // Get the number of samples per pixel
        XTIFFField sfield = directory.getField(XTIFF.TIFFTAG_SAMPLES_PER_PIXEL);
        if (sfield == null) {
            samplesPerPixel = 1;
        } else {
            samplesPerPixel = (int) sfield.getAsLong(0);
        }
        XTIFFField predictorField = directory.getField(XTIFF.TIFFTAG_PREDICTOR);

        if (predictorField == null) {
            predictor = 1;
        } else {
            predictor = predictorField.getAsInt(0);
            if (predictor != 1 && predictor != 2) {
                throw new RuntimeException(JaiI18N.getString("XTIFFImageDecoder16"));
            }
            if (predictor == 2 && bitsPerSample[0] != 8) {
                throw new RuntimeException(bitsPerSample[0]
                        + JaiI18N.getString("XTIFFImageDecoder17"));
            }
        }
        lzwDecoder = new TIFFLZWDecoder(tileWidth, predictor, samplesPerPixel);
    }

    /**
     * Decode a rectangle of pixels
     */
    public void decodeTilePixels(byte[] input, Rectangle newRect, byte[] bdata) {
        lzwDecoder.decode(input, bdata, newRect.height);
    }

    /**
     * Decode a rectangle of pixels
     */
    public void decodeTilePixels(byte[] input, Rectangle newRect, short[] sdata) {

        // Since unitsInThisTile is the number of shorts,
        // but we do our decompression in terms of bytes, we
        // need to multiply unitsInThisTile by 2 in order to
        // figure out how many bytes we'll get after
        // decompression.
        byte byteArray[] = new byte[unitsInThisTile * 2];
        lzwDecoder.decode(input, byteArray, newRect.height);
        unpackShorts(byteArray, sdata, unitsInThisTile);
    }
}
TOP

Related Classes of org.libtiff.jai.codecimpl.XTIFFLZWTileCodec

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.