diff --git a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModel.java b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModel.java index 0f5eb4e4..cabb9684 100644 --- a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModel.java +++ b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModel.java @@ -54,8 +54,8 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel { // Our IndexColorModel delegate private final IndexColorModel icm; + private final int extraSamples; private final int samples; - private final boolean hasAlpha; /** * Creates a {@code DiscreteAlphaIndexColorModel}, delegating color map look-ups @@ -86,33 +86,33 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel { ); this.icm = icm; + this.extraSamples = extraSamples; this.samples = 1 + extraSamples; - this.hasAlpha = hasAlpha; } @Override public int getNumComponents() { - return samples; + return getNumColorComponents() + extraSamples; } @Override - public final int getRed(final int pixel) { + public int getRed(final int pixel) { return icm.getRed(pixel); } @Override - public final int getGreen(final int pixel) { + public int getGreen(final int pixel) { return icm.getGreen(pixel); } @Override - public final int getBlue(final int pixel) { + public int getBlue(final int pixel) { return icm.getBlue(pixel); } @Override - public final int getAlpha(final int pixel) { - return hasAlpha ? (int) ((((float) pixel) / ((1 << getComponentSize(3))-1)) * 255.0f + 0.5f) : 0xff; + public int getAlpha(final int pixel) { + return hasAlpha() ? (int) ((((float) pixel) / ((1 << getComponentSize(3)) - 1)) * 255.0f + 0.5f) : 0xff; } private int getSample(final Object inData, final int index) { @@ -120,15 +120,15 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel { switch (transferType) { case DataBuffer.TYPE_BYTE: - byte bdata[] = (byte[]) inData; + byte[] bdata = (byte[]) inData; pixel = bdata[index] & 0xff; break; case DataBuffer.TYPE_USHORT: - short sdata[] = (short[]) inData; + short[] sdata = (short[]) inData; pixel = sdata[index] & 0xffff; break; case DataBuffer.TYPE_INT: - int idata[] = (int[]) inData; + int[] idata = (int[]) inData; pixel = idata[index]; break; default: @@ -139,27 +139,27 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel { } @Override - public final int getRed(final Object inData) { + public int getRed(final Object inData) { return getRed(getSample(inData, 0)); } @Override - public final int getGreen(final Object inData) { + public int getGreen(final Object inData) { return getGreen(getSample(inData, 0)); } @Override - public final int getBlue(final Object inData) { + public int getBlue(final Object inData) { return getBlue(getSample(inData, 0)); } @Override - public final int getAlpha(final Object inData) { - return hasAlpha ? getAlpha(getSample(inData, 1)) : 0xff; + public int getAlpha(final Object inData) { + return hasAlpha() ? getAlpha(getSample(inData, 1)) : 0xff; } @Override - public final SampleModel createCompatibleSampleModel(final int w, final int h) { + public SampleModel createCompatibleSampleModel(final int w, final int h) { return new PixelInterleavedSampleModel(transferType, w, h, samples, w * samples, createOffsets(samples)); } @@ -174,17 +174,17 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel { } @Override - public final boolean isCompatibleSampleModel(final SampleModel sm) { + public boolean isCompatibleSampleModel(final SampleModel sm) { return sm instanceof PixelInterleavedSampleModel && sm.getNumBands() == samples; } @Override - public final WritableRaster createCompatibleWritableRaster(final int w, final int h) { + public WritableRaster createCompatibleWritableRaster(final int w, final int h) { return Raster.createWritableRaster(createCompatibleSampleModel(w, h), new Point(0, 0)); } @Override - public final boolean isCompatibleRaster(final Raster raster) { + public boolean isCompatibleRaster(final Raster raster) { int size = raster.getSampleModel().getSampleSize(0); return ((raster.getTransferType() == transferType) && (raster.getNumBands() == samples) && ((1 << size) >= icm.getMapSize())); diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModelTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModelTest.java index 325e917e..c067bd2e 100644 --- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModelTest.java +++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/DiscreteAlphaIndexColorModelTest.java @@ -37,7 +37,9 @@ import java.awt.image.*; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; public class DiscreteAlphaIndexColorModelTest { @@ -204,6 +206,25 @@ public class DiscreteAlphaIndexColorModelTest { assertThat(raster.getTransferType(), CoreMatchers.equalTo(DataBuffer.TYPE_BYTE)); } + @Test + public void testNumComponents() { + int[] colors = createIntLut(1 << 8); + IndexColorModel icm = new IndexColorModel(8, colors.length, colors, 0, false, -1, DataBuffer.TYPE_BYTE); + + ColorModel colorModelDiscreteAlpha = new DiscreteAlphaIndexColorModel(icm, 1, true); + ColorModel colorModelDiscreteAlphaExtra = new DiscreteAlphaIndexColorModel(icm, 2, true); + ColorModel colorModelNoAlphaExtra = new DiscreteAlphaIndexColorModel(icm, 42, false); + + assertEquals(3, colorModelDiscreteAlpha.getNumColorComponents()); + assertEquals(4, colorModelDiscreteAlpha.getNumComponents()); + + assertEquals(3, colorModelDiscreteAlphaExtra.getNumColorComponents()); + assertEquals(5, colorModelDiscreteAlphaExtra.getNumComponents()); // Questionable + + assertEquals(3, colorModelNoAlphaExtra.getNumColorComponents()); + assertEquals(45, colorModelNoAlphaExtra.getNumComponents()); // Questionable + } + private static int[] createIntLut(final int count) { int[] lut = new int[count];