mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-03 11:35:29 -04:00
DiscreteAlphaIndexColorModel num components fix
(cherry picked from commit 190fe87ee96a68568fbc2f057d89304a70494ca9)
This commit is contained in:
parent
ce597c437d
commit
a5b6cf898d
@ -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()));
|
||||||
|
@ -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];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user