colorModelTest(harness, -1, cspace);
}
private void colorModelTest(TestHarness harness, int cspace, int cspace2)
{
ColorSpace cs;
ColorSpace cs2;
ColorConvertOp op;
if (cspace == -1)
{
cs2 = ColorSpace.getInstance(cspace2);
op = new ColorConvertOp(cs2, null);
}
else
{
cs = ColorSpace.getInstance(cspace);
cs2 = ColorSpace.getInstance(cspace2);
op = new ColorConvertOp(cs, cs2, null);
}
int[] types = {BufferedImage.TYPE_INT_RGB,
BufferedImage.TYPE_INT_ARGB,
BufferedImage.TYPE_INT_ARGB_PRE,
BufferedImage.TYPE_3BYTE_BGR,
BufferedImage.TYPE_4BYTE_ABGR,
BufferedImage.TYPE_4BYTE_ABGR_PRE,
BufferedImage.TYPE_USHORT_565_RGB,
BufferedImage.TYPE_USHORT_555_RGB,
BufferedImage.TYPE_BYTE_GRAY,
BufferedImage.TYPE_USHORT_GRAY};
// Skipped types that are not implemented yet:
// TYPE_CUSTOM, TYPE_INT_BGR, TYPE_BYTE_BINARY, TYPE_BYTE_INDEXED
for (int i = 0; i < types.length; i++)
{
int type = types[i];
if (cspace == -1)
harness.checkPoint("colorspace " + cspace2 + ", type: " + type);
else
harness.checkPoint("src colorspace " + cspace + ", dest colorspace " + cspace2 + ", type: " + type);
BufferedImage img = new BufferedImage(25, 40, type);
BufferedImage dest = op.createCompatibleDestImage(img, null);
dest = op.createCompatibleDestImage(img, null);
// Standard check of common properties
harness.check(dest.isAlphaPremultiplied(), img.isAlphaPremultiplied());
harness.check(dest.getSampleModel() instanceof PixelInterleavedSampleModel);
harness.check(dest.getColorModel() instanceof ComponentColorModel);
harness.check(dest.getColorModel().isCompatibleSampleModel(dest.getSampleModel()));
harness.check(dest.getColorModel().getTransferType(), DataBuffer.TYPE_BYTE);
harness.check(dest.getColorModel().getColorSpace().getType(), cs2.getType());
harness.check(dest.getColorModel().hasAlpha(), img.getColorModel().hasAlpha());
harness.check(dest.getColorModel().getTransparency(), img.getColorModel().getTransparency());
harness.check(dest.getColorModel().getPixelSize(),
DataBuffer.getDataTypeSize(DataBuffer.TYPE_BYTE)
* dest.getRaster().getNumDataElements());
harness.check(dest.getRaster().getNumDataElements(),
dest.getColorModel().getNumComponents());
harness.check(dest.getRaster().getNumBands(),
dest.getRaster().getNumDataElements());
harness.check(dest.getSampleModel().getTransferType(),
DataBuffer.TYPE_BYTE);
// This ensures that we have the same defaults as the reference implementation
switch (type)
{
// Images with an extra alpha component
case BufferedImage.TYPE_INT_ARGB:
case BufferedImage.TYPE_INT_ARGB_PRE:
case BufferedImage.TYPE_4BYTE_ABGR:
case BufferedImage.TYPE_4BYTE_ABGR_PRE:
if (cspace2 == ColorSpace.CS_GRAY)
{
harness.check(dest.getColorModel().getNumComponents(), 2);
}
else
{
harness.check(dest.getColorModel().getNumComponents(), 4);
}
harness.check(dest.getColorModel().getNumColorComponents(),
dest.getColorModel().getNumComponents() - 1);
harness.check(dest.getColorModel().getTransparency(), ColorModel.TRANSLUCENT);
harness.check(dest.getColorModel().hasAlpha(), true);
harness.check(dest.getColorModel().isAlphaPremultiplied(),
(type == BufferedImage.TYPE_INT_ARGB_PRE
|| type == BufferedImage.TYPE_4BYTE_ABGR_PRE));
harness.check(dest.getType(), BufferedImage.TYPE_CUSTOM);
break;
case BufferedImage.TYPE_INT_RGB:
case BufferedImage.TYPE_3BYTE_BGR:
case BufferedImage.TYPE_USHORT_565_RGB:
case BufferedImage.TYPE_USHORT_555_RGB:
case BufferedImage.TYPE_BYTE_GRAY:
case BufferedImage.TYPE_USHORT_GRAY:
if (cs2.getType() == ColorSpace.TYPE_GRAY)
{
// This fails, but due to a limitation in BufferedImage.
// Somehow, Sun is able to modify a BufferedImage after creating
// it based on a pre-defined type, without it being considered
// a custom type...