package org.libtiff.jai.codecimpl; import org.libtiff.jai.codec.XTIFFTileCodecImpl; import org.libtiff.jai.codec.XTIFFTileCodec; import org.libtiff.jai.codec.XTIFFEncodeParam; import org.libtiff.jai.codec.XTIFFField; import org.libtiff.jai.codec.XTIFF; import java.awt.Rectangle; /** * This codec encapsulates all the logic for the default TIFF * "uncompressed" bit-packing codec algorithm. */ public class XTIFFUncompTileCodec extends XTIFFTileCodecImpl { public XTIFFUncompTileCodec() { } public XTIFFTileCodec create() { return new XTIFFUncompTileCodec(); } public boolean canEncode() {return true;} public void register() { register(XTIFF.COMPRESSION_NONE); } /** * encode the tile into bpixels and return the byte size * (uncompressed packing algorithm). The padding has already * been done, so we may safely assume that pixels is exactly * rows by cols by numBands ints. */ public int encodeTilePixels(int[] pixels,Rectangle rect, byte[] bpixels) { int rows=(int)rect.getHeight(); int cols=(int)rect.getWidth(); int index, remainder; int pixel = 0; int k = 0; int rowBytes=0; switch(sampleSize[0]) { case 1: index = 0; rowBytes=(cols+7)/8; // For each of the rows in a tile for (int i=0; i<rows; i++) { // Write out the number of pixels exactly // divisible by 8 (bits per byte) for (int j=0; j<cols/8; j++) { pixel = (pixels[index++] << 7) | (pixels[index++] << 6) | (pixels[index++] << 5) | (pixels[index++] << 4) | (pixels[index++] << 3) | (pixels[index++] << 2) | (pixels[index++] << 1) | pixels[index++]; bpixels[k++] = (byte)pixel; } // Write out the pixels remaining after division by 8 if (cols%8 > 0) { pixel = 0; for (int j=0; j<cols%8; j++) { pixel |= (pixels[index++] << (7 - j)); } bpixels[k++] = (byte)pixel; } } //row loop break; case 4: index = 0; rowBytes=(cols+3)/4; // For each of the rows in a strip for (int i=0; i<rows; i++) { // Write out the number of pixels that will fit into an // even number of nibbles. for (int j=0; j<cols/2; j++) { pixel = (pixels[index++] << 4) | pixels[index++]; bpixels[k++] = (byte)pixel; } // Last pixel for odd-length lines if ((cols % 2) == 1) { pixel = pixels[index++] << 4; bpixels[k++] = (byte)pixel; } } break; case 8: index = 0; rowBytes = cols*numBands; for (int i=0; i<rows; i++) { for (int j = 0; j < cols*numBands; j++) { bpixels[k++] = (byte)pixels[index++]; } } break; case 16: index = 0; rowBytes = cols*2; int l = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { short value = (short)pixels[index++]; bpixels[l++] = (byte)((value & 0xff00) >> 8); bpixels[l++] = (byte)(value & 0x00ff); } } break; } return rows * rowBytes; } /** * Decompress data packed bytes into packed bytes */ public void decodeTilePixels(byte[] input,Rectangle rect,byte[] bpixels) { for(int i=0;i<unitsInThisTile;i++) { bpixels[i] = input[i]; } } /** * Decompress data packed bytes into short */ public void decodeTilePixels(byte[] input,Rectangle rect,short[] spixels) { unpackShorts(input,spixels,unitsInThisTile); } }