From de34ac7ede5f7e7b4429a5bd6a5726f5fece5cd7 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Fri, 30 Mar 2012 16:53:04 +0200 Subject: [PATCH] Now with source region/subsampling support also for multipalette. --- .../iff/AbstractMultipaletteChunk.java | 23 +++++++++++++++---- .../imageio/plugins/iff/IFFImageReader.java | 5 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/AbstractMultipaletteChunk.java b/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/AbstractMultipaletteChunk.java index 29cec373..372589c0 100644 --- a/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/AbstractMultipaletteChunk.java +++ b/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/AbstractMultipaletteChunk.java @@ -63,6 +63,7 @@ abstract class AbstractMultiPaletteChunk extends IFFChunk implements MultiPalett protected MutableIndexColorModel.PaletteChange[] initialChanges; protected MutableIndexColorModel.PaletteChange[][] changes; + protected int lastRow; protected WeakReference originalPalette; protected MutableIndexColorModel mutablePalette; @@ -105,7 +106,7 @@ abstract class AbstractMultiPaletteChunk extends IFFChunk implements MultiPalett public ColorModel getColorModel(final IndexColorModel colorModel, final int rowIndex, final boolean laced) { - if (mutablePalette == null || originalPalette != null && originalPalette.get() != colorModel) { + if (rowIndex < lastRow || mutablePalette == null || originalPalette != null && originalPalette.get() != colorModel) { originalPalette = new WeakReference(colorModel); mutablePalette = new MutableIndexColorModel(colorModel); @@ -114,9 +115,23 @@ abstract class AbstractMultiPaletteChunk extends IFFChunk implements MultiPalett } } - int row = laced && skipLaced() ? rowIndex / 2 : rowIndex; - if (row < changes.length && changes[row] != null) { - mutablePalette.adjustColorMap(changes[row]); + for (int i = lastRow + 1; i <= rowIndex; i++) { + int row; + + if (laced && skipLaced()) { + if (i % 2 != 0) { + continue; + } + + row = i / 2; + } + else { + row = i; + } + + if (row < changes.length && changes[row] != null) { + mutablePalette.adjustColorMap(changes[row]); + } } return mutablePalette; diff --git a/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/IFFImageReader.java b/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/IFFImageReader.java index dc9446a0..ad0b033c 100755 --- a/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/IFFImageReader.java +++ b/imageio/imageio-iff/src/main/java/com/twelvemonkeys/imageio/plugins/iff/IFFImageReader.java @@ -705,11 +705,10 @@ public class IFFImageReader extends ImageReaderBase { } } - private void multiPaletteToRGB(final int srcY, final byte[] indexed, final IndexColorModel colorModel, final byte[] dest, final int destOffset) { + private void multiPaletteToRGB(final int row, final byte[] indexed, final IndexColorModel colorModel, final byte[] dest, final int destOffset) { final int width = header.width; - // TODO: Assure we have applied color change for all rows up until rowIndex, in case of source region/subsampling - ColorModel palette = paletteChange.getColorModel(colorModel, srcY, isLaced()); + ColorModel palette = paletteChange.getColorModel(colorModel, row, isLaced()); for (int x = 0; x < width; x++) { int pixel = indexed[x] & 0xff;