From cdb2d72f8bcb6038a949ce79e7354f17c27acb6c Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Wed, 3 Jan 2018 18:05:19 +0100 Subject: [PATCH] #400 Fixed AIOOBE reading index color w/bitplanes for uneven widths. --- .../imageio/plugins/pcx/PCXImageReader.java | 9 +++++---- .../imageio/plugins/pcx/PCXImageReaderTest.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/imageio/imageio-pcx/src/main/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReader.java b/imageio/imageio-pcx/src/main/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReader.java index 604e012a..77b81fef 100755 --- a/imageio/imageio-pcx/src/main/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReader.java +++ b/imageio/imageio-pcx/src/main/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReader.java @@ -185,16 +185,16 @@ public final class PCXImageReader extends ImageReaderBase { if (rawType.getColorModel() instanceof IndexColorModel && header.getChannels() > 1) { // Bit planes! // Create raster from a default 8 bit layout - WritableRaster rowRaster = GRAYSCALE.createBufferedImage(header.getWidth(), 1).getRaster(); + int planeWidth = header.getBytesPerLine(); + int rowWidth = planeWidth * 8; // bitsPerPixel == 1 + WritableRaster rowRaster = GRAYSCALE.createBufferedImage(rowWidth, 1).getRaster(); // Clip to source region Raster clippedRow = clipRowToRect(rowRaster, srcRegion, param != null ? param.getSourceBands() : null, param != null ? param.getSourceXSubsampling() : 1); - int planeWidth = header.getBytesPerLine(); - byte[] planeData = new byte[planeWidth * 8]; - + byte[] planeData = new byte[rowWidth]; byte[] rowDataByte = ((DataBufferByte) rowRaster.getDataBuffer()).getData(); for (int y = 0; y < height; y++) { @@ -351,6 +351,7 @@ public final class PCXImageReader extends ImageReaderBase { if (header == null) { imageInput.setByteOrder(ByteOrder.LITTLE_ENDIAN); header = PCXHeader.read(imageInput); +// System.err.println("header: " + header); imageInput.flushBefore(imageInput.getStreamPosition()); } diff --git a/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java b/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java index 078e6a05..f662f4db 100755 --- a/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java +++ b/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java @@ -50,7 +50,7 @@ public class PCXImageReaderTest extends ImageReaderAbstractTest protected List getTestData() { return Arrays.asList( new TestData(getClassLoaderResource("/pcx/MARBLES.PCX"), new Dimension(1419, 1001)), // RLE encoded RGB -// new TestData(getClassLoaderResource("/pcx/GMARBLES.PCX"), new Dimension(1419, 1001)) // RLE encoded gray (seems to be damanged, missing the last few scan lines) +// new TestData(getClassLoaderResource("/pcx/GMARBLES.PCX"), new Dimension(1419, 1001)) // RLE encoded gray (seems to be damaged, missing the last few scan lines) new TestData(getClassLoaderResource("/pcx/lena.pcx"), new Dimension(512, 512)), // RLE encoded RGB new TestData(getClassLoaderResource("/pcx/lena2.pcx"), new Dimension(512, 512)), // RLE encoded, 256 color indexed (8 bps/1 channel) new TestData(getClassLoaderResource("/pcx/lena3.pcx"), new Dimension(512, 512)), // RLE encoded, 16 color indexed (4 bps/1 channel)