diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/LZWDecoder.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/LZWDecoder.java index 0d76ab1f..bf573fa9 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/LZWDecoder.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/LZWDecoder.java @@ -35,12 +35,14 @@ import java.io.IOException; import java.io.InputStream; /** - * Implements Lempel-Ziv & Welch (LZW) decompression. + * Lempel–Ziv–Welch (LZW) decompression. LZW is a universal loss-less data compression algorithm + * created by Abraham Lempel, Jacob Ziv, and Terry Welch. * Inspired by libTiff's LZW decompression. * * @author Harald Kuhr * @author last modified by $Author: haraldk$ * @version $Id: LZWDecoder.java,v 1.0 08.05.12 21:11 haraldk Exp$ + * @see LZW (Wikipedia) */ abstract class LZWDecoder implements Decoder { /** Clear: Re-initialize tables. */ @@ -51,6 +53,8 @@ abstract class LZWDecoder implements Decoder { private static final int MIN_BITS = 9; private static final int MAX_BITS = 12; + private static final int TABLE_SIZE = 1 << MAX_BITS; + private final boolean compatibilityMode; private final String[] table; @@ -68,7 +72,7 @@ abstract class LZWDecoder implements Decoder { protected LZWDecoder(final boolean compatibilityMode) { this.compatibilityMode = compatibilityMode; - table = new String[compatibilityMode ? 4096 + 1024 : 4096]; // libTiff adds 1024 "for compatibility"... + table = new String[compatibilityMode ? TABLE_SIZE + 1024 : TABLE_SIZE]; // libTiff adds 1024 "for compatibility"... // First 258 entries of table is always fixed for (int i = 0; i < 256; i++) { diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/YCbCrUpsamplerStream.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/YCbCrUpsamplerStream.java index e18bd152..dc193438 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/YCbCrUpsamplerStream.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/YCbCrUpsamplerStream.java @@ -28,6 +28,8 @@ package com.twelvemonkeys.imageio.plugins.tiff; +import com.twelvemonkeys.lang.Validate; + import java.awt.image.DataBufferByte; import java.awt.image.Raster; import java.io.EOFException; @@ -64,8 +66,8 @@ final class YCbCrUpsamplerStream extends FilterInputStream { int bufferLength; int bufferPos; - public YCbCrUpsamplerStream(InputStream stream, int[] chromaSub, int yCbCrPos, int columns, double[] coefficients) { - super(stream); + public YCbCrUpsamplerStream(final InputStream stream, final int[] chromaSub, final int yCbCrPos, final int columns, final double[] coefficients) { + super(Validate.notNull(stream, "stream")); this.horizChromaSub = chromaSub[0]; this.vertChromaSub = chromaSub[1]; @@ -94,7 +96,7 @@ final class YCbCrUpsamplerStream extends FilterInputStream { int read; // This *SHOULD* read an entire row of units into the buffer, otherwise decodeRows will throw EOFException - while (pos < buffer.length && (read = super.read(buffer, pos, buffer.length - pos)) > 0) { + while (pos < buffer.length && (read = in.read(buffer, pos, buffer.length - pos)) > 0) { pos += read; } @@ -168,7 +170,7 @@ final class YCbCrUpsamplerStream extends FilterInputStream { } } - return decodedRows[decodedPos++]; + return decodedRows[decodedPos++] & 0xff; } @Override