diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java index cdb895f9..d5c8a056 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java @@ -179,7 +179,7 @@ final class CCITTFaxDecoderStream extends FilterInputStream { throw new IOException("Sum of run-lengths does not equal scan line width: " + index + " > " + columns); } - decodedLength = (index / 8) + 1; + decodedLength = (index + 7) / 8; } private int decodeRun(short[][] codes, short[][] runLengths, int minCodeSize) throws IOException { diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFBaseline.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFBaseline.java index 1f76d655..2fbd54e5 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFBaseline.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFBaseline.java @@ -55,4 +55,8 @@ interface TIFFBaseline { int EXTRASAMPLE_UNASSOCIATED_ALPHA = 2; int PREDICTOR_NONE = 1; + + int RESOLUTION_UNIT_NONE = 1; + int RESOLUTION_UNIT_DPI = 2; // Default + int RESOLUTION_UNIT_CENTIMETER = 3; } diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFCustom.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFCustom.java index d72b489d..3a03ea31 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFCustom.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFCustom.java @@ -54,9 +54,9 @@ interface TIFFCustom { int PHOTOMETRIC_LOGL = 32844; int PHOTOMETRIC_LOGLUV = 32845; - /** DNG: CFA (Color Filter Array)*/ + /** DNG: CFA (Color Filter Array). */ int PHOTOMETRIC_CFA = 32803; - /** DNG: LinearRaw*/ + /** DNG: LinearRaw. */ int PHOTOMETRIC_LINEAR_RAW = 34892; int SAMPLEFORMAT_COMPLEX_INT = 5; diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFExtension.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFExtension.java index be17c4c4..1c9757d5 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFExtension.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFExtension.java @@ -69,7 +69,8 @@ interface TIFFExtension { int YCBCR_POSITIONING_CENTERED = 1; int YCBCR_POSITIONING_COSITED = 2; - // "Old-style" JPEG (obsolete) + /** Deprecated. For backwards compatibility only ("Old-style" JPEG). */ int JPEG_PROC_BASELINE = 1; + /** Deprecated. For backwards compatibility only ("Old-style" JPEG). */ int JPEG_PROC_LOSSLESS = 14; } diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java index 77cd65fd..3276ad6e 100755 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java @@ -593,7 +593,6 @@ public class TIFFImageReader extends ImageReaderBase { // Read data processImageStarted(imageIndex); - // TODO: Read only tiles that lies within region // General uncompressed/compressed reading for (int y = 0; y < tilesDown; y++) { int col = 0; @@ -699,20 +698,24 @@ public class TIFFImageReader extends ImageReaderBase { int i = y * tilesAcross + x; int colsInTile = Math.min(stripTileWidth, width - col); - imageInput.seek(stripTileOffsets[i]); - ImageInputStream subStream = new SubImageInputStream(imageInput, stripTileByteCounts != null ? (int) stripTileByteCounts[i] : Short.MAX_VALUE); + // Read only tiles that lies within region + if (new Rectangle(col, row, colsInTile, rowsInTile).intersects(srcRegion)) { + imageInput.seek(stripTileOffsets[i]); + ImageInputStream subStream = new SubImageInputStream(imageInput, stripTileByteCounts != null ? (int) stripTileByteCounts[i] : Short.MAX_VALUE); + + try { + jpegReader.setInput(subStream); + jpegParam.setSourceRegion(new Rectangle(0, 0, colsInTile, rowsInTile)); + jpegParam.setDestinationOffset(new Point(col - srcRegion.x, row - srcRegion.y)); + jpegParam.setDestination(destination); + // TODO: This works only if Gray/YCbCr/RGB, not CMYK/LAB/etc... + // In the latter case we will have to use readAsRaster and do color conversion ourselves + jpegReader.read(0, jpegParam); + } + finally { + subStream.close(); + } - try { - jpegReader.setInput(subStream); - jpegParam.setSourceRegion(new Rectangle(0, 0, colsInTile, rowsInTile)); - jpegParam.setDestinationOffset(new Point(col, row)); - jpegParam.setDestination(destination); - // TODO: This works only if Gray/YCbCr/RGB, not CMYK/LAB/etc... - // In the latter case we will have to use readAsRaster and do color conversion ourselves - jpegReader.read(0, jpegParam); - } - finally { - subStream.close(); } if (abortRequested()) { @@ -865,27 +868,30 @@ public class TIFFImageReader extends ImageReaderBase { int colsInTile = Math.min(stripTileWidth, width - col); int i = y * tilesAcross + x; - imageInput.seek(stripTileOffsets[i]); - stream = ImageIO.createImageInputStream(new SequenceInputStream(Collections.enumeration( - Arrays.asList( - createJFIFStream(destRaster, stripTileWidth, stripTileHeight, qTables, dcTables, acTables), - IIOUtil.createStreamAdapter(imageInput, stripTileByteCounts != null ? (int) stripTileByteCounts[i] : Short.MAX_VALUE), - new ByteArrayInputStream(new byte[] {(byte) 0xff, (byte) 0xd9}) // EOI - ) - ))); + // Read only tiles that lies within region + if (new Rectangle(col, row, colsInTile, rowsInTile).intersects(srcRegion)) { + imageInput.seek(stripTileOffsets[i]); + stream = ImageIO.createImageInputStream(new SequenceInputStream(Collections.enumeration( + Arrays.asList( + createJFIFStream(destRaster, stripTileWidth, stripTileHeight, qTables, dcTables, acTables), + IIOUtil.createStreamAdapter(imageInput, stripTileByteCounts != null ? (int) stripTileByteCounts[i] : Short.MAX_VALUE), + new ByteArrayInputStream(new byte[] {(byte) 0xff, (byte) 0xd9}) // EOI + ) + ))); - jpegReader.setInput(stream); + jpegReader.setInput(stream); - try { - jpegParam.setSourceRegion(new Rectangle(0, 0, colsInTile, rowsInTile)); - jpegParam.setDestinationOffset(new Point(col, row)); - jpegParam.setDestination(destination); - // TODO: This works only if Gray/YCbCr/RGB, not CMYK/LAB/etc... - // In the latter case we will have to use readAsRaster and do color conversion ourselves - jpegReader.read(0, jpegParam); - } - finally { - stream.close(); + try { + jpegParam.setSourceRegion(new Rectangle(0, 0, colsInTile, rowsInTile)); + jpegParam.setDestinationOffset(new Point(col - srcRegion.x, row - srcRegion.y)); + jpegParam.setDestination(destination); + // TODO: This works only if Gray/YCbCr/RGB, not CMYK/LAB/etc... + // In the latter case we will have to use readAsRaster and do color conversion ourselves + jpegReader.read(0, jpegParam); + } + finally { + stream.close(); + } } if (abortRequested()) { diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java index 88ff7e55..1d8b6b69 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java @@ -27,9 +27,11 @@ package com.twelvemonkeys.imageio.plugins.tiff;/* */ import com.twelvemonkeys.imageio.util.ImageReaderAbstractTestCase; +import org.junit.Test; import javax.imageio.spi.ImageReaderSpi; import java.awt.*; +import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -60,7 +62,8 @@ public class TIFFImageReaderTest extends ImageReaderAbstractTestCase