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