DiscreteAlphaIndexColorModel num components fix

(cherry picked from commit 190fe87ee96a68568fbc2f057d89304a70494ca9)
This commit is contained in:
Harald Kuhr 2022-08-19 16:38:45 +02:00
parent ce597c437d
commit a5b6cf898d
2 changed files with 42 additions and 21 deletions

View File

@ -54,8 +54,8 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel {
// Our IndexColorModel delegate // Our IndexColorModel delegate
private final IndexColorModel icm; private final IndexColorModel icm;
private final int extraSamples;
private final int samples; private final int samples;
private final boolean hasAlpha;
/** /**
* Creates a {@code DiscreteAlphaIndexColorModel}, delegating color map look-ups * Creates a {@code DiscreteAlphaIndexColorModel}, delegating color map look-ups
@ -86,33 +86,33 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel {
); );
this.icm = icm; this.icm = icm;
this.extraSamples = extraSamples;
this.samples = 1 + extraSamples; this.samples = 1 + extraSamples;
this.hasAlpha = hasAlpha;
} }
@Override @Override
public int getNumComponents() { public int getNumComponents() {
return samples; return getNumColorComponents() + extraSamples;
} }
@Override @Override
public final int getRed(final int pixel) { public int getRed(final int pixel) {
return icm.getRed(pixel); return icm.getRed(pixel);
} }
@Override @Override
public final int getGreen(final int pixel) { public int getGreen(final int pixel) {
return icm.getGreen(pixel); return icm.getGreen(pixel);
} }
@Override @Override
public final int getBlue(final int pixel) { public int getBlue(final int pixel) {
return icm.getBlue(pixel); return icm.getBlue(pixel);
} }
@Override @Override
public final int getAlpha(final int pixel) { public int getAlpha(final int pixel) {
return hasAlpha ? (int) ((((float) pixel) / ((1 << getComponentSize(3))-1)) * 255.0f + 0.5f) : 0xff; return hasAlpha() ? (int) ((((float) pixel) / ((1 << getComponentSize(3)) - 1)) * 255.0f + 0.5f) : 0xff;
} }
private int getSample(final Object inData, final int index) { private int getSample(final Object inData, final int index) {
@ -120,15 +120,15 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel {
switch (transferType) { switch (transferType) {
case DataBuffer.TYPE_BYTE: case DataBuffer.TYPE_BYTE:
byte bdata[] = (byte[]) inData; byte[] bdata = (byte[]) inData;
pixel = bdata[index] & 0xff; pixel = bdata[index] & 0xff;
break; break;
case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_USHORT:
short sdata[] = (short[]) inData; short[] sdata = (short[]) inData;
pixel = sdata[index] & 0xffff; pixel = sdata[index] & 0xffff;
break; break;
case DataBuffer.TYPE_INT: case DataBuffer.TYPE_INT:
int idata[] = (int[]) inData; int[] idata = (int[]) inData;
pixel = idata[index]; pixel = idata[index];
break; break;
default: default:
@ -139,27 +139,27 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel {
} }
@Override @Override
public final int getRed(final Object inData) { public int getRed(final Object inData) {
return getRed(getSample(inData, 0)); return getRed(getSample(inData, 0));
} }
@Override @Override
public final int getGreen(final Object inData) { public int getGreen(final Object inData) {
return getGreen(getSample(inData, 0)); return getGreen(getSample(inData, 0));
} }
@Override @Override
public final int getBlue(final Object inData) { public int getBlue(final Object inData) {
return getBlue(getSample(inData, 0)); return getBlue(getSample(inData, 0));
} }
@Override @Override
public final int getAlpha(final Object inData) { public int getAlpha(final Object inData) {
return hasAlpha ? getAlpha(getSample(inData, 1)) : 0xff; return hasAlpha() ? getAlpha(getSample(inData, 1)) : 0xff;
} }
@Override @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)); return new PixelInterleavedSampleModel(transferType, w, h, samples, w * samples, createOffsets(samples));
} }
@ -174,17 +174,17 @@ public final class DiscreteAlphaIndexColorModel extends ColorModel {
} }
@Override @Override
public final boolean isCompatibleSampleModel(final SampleModel sm) { public boolean isCompatibleSampleModel(final SampleModel sm) {
return sm instanceof PixelInterleavedSampleModel && sm.getNumBands() == samples; return sm instanceof PixelInterleavedSampleModel && sm.getNumBands() == samples;
} }
@Override @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)); return Raster.createWritableRaster(createCompatibleSampleModel(w, h), new Point(0, 0));
} }
@Override @Override
public final boolean isCompatibleRaster(final Raster raster) { public boolean isCompatibleRaster(final Raster raster) {
int size = raster.getSampleModel().getSampleSize(0); int size = raster.getSampleModel().getSampleSize(0);
return ((raster.getTransferType() == transferType) && return ((raster.getTransferType() == transferType) &&
(raster.getNumBands() == samples) && ((1 << size) >= icm.getMapSize())); (raster.getNumBands() == samples) && ((1 << size) >= icm.getMapSize()));

View File

@ -37,7 +37,9 @@ import java.awt.image.*;
import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat; 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 { public class DiscreteAlphaIndexColorModelTest {
@ -204,6 +206,25 @@ public class DiscreteAlphaIndexColorModelTest {
assertThat(raster.getTransferType(), CoreMatchers.equalTo(DataBuffer.TYPE_BYTE)); 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) { private static int[] createIntLut(final int count) {
int[] lut = new int[count]; int[] lut = new int[count];