diff --git a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java index dfaa70f4eb1..a9a83cc525e 100644 --- a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java +++ b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java @@ -48,6 +48,11 @@ final class LCMSImageLayout { public static int CHANNELS_SH(int x) { return x << 3; } + + public static int PREMUL_SH(int x) { + return x << 23; + } + public static final int SWAPFIRST = 1 << 14; public static final int DOSWAP = 1 << 10; public static final int PT_RGB_8 = @@ -60,10 +65,12 @@ final class LCMSImageLayout { EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1); public static final int PT_ARGB_8 = EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1) | SWAPFIRST; + public static final int PT_ARGB_PRE_8 = PT_ARGB_8 | PREMUL_SH(1); public static final int PT_BGR_8 = DOSWAP | CHANNELS_SH(3) | BYTES_SH(1); public static final int PT_ABGR_8 = DOSWAP | EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1); + public static final int PT_ABGR_PRE_8 = PT_ABGR_8 | PREMUL_SH(1); public static final int PT_BGRA_8 = EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1) | DOSWAP | SWAPFIRST; public static final int DT_BYTE = 0; @@ -162,11 +169,12 @@ final class LCMSImageLayout { switch (image.getType()) { case BufferedImage.TYPE_INT_RGB: + case BufferedImage.TYPE_INT_ARGB: l.pixelType = PT_ARGB_8; l.isIntPacked = true; break; - case BufferedImage.TYPE_INT_ARGB: - l.pixelType = PT_ARGB_8; + case BufferedImage.TYPE_INT_ARGB_PRE: + l.pixelType = PT_ARGB_PRE_8; l.isIntPacked = true; break; case BufferedImage.TYPE_INT_BGR: @@ -179,6 +187,9 @@ final class LCMSImageLayout { case BufferedImage.TYPE_4BYTE_ABGR: l.pixelType = PT_ABGR_8; break; + case BufferedImage.TYPE_4BYTE_ABGR_PRE: + l.pixelType = PT_ABGR_PRE_8; + break; case BufferedImage.TYPE_BYTE_GRAY: l.pixelType = PT_GRAY_8; break; @@ -219,6 +230,7 @@ final class LCMSImageLayout { switch (image.getType()) { case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_ARGB: + case BufferedImage.TYPE_INT_ARGB_PRE: case BufferedImage.TYPE_INT_BGR: do { IntegerComponentRaster intRaster = (IntegerComponentRaster) @@ -234,6 +246,7 @@ final class LCMSImageLayout { case BufferedImage.TYPE_3BYTE_BGR: case BufferedImage.TYPE_4BYTE_ABGR: + case BufferedImage.TYPE_4BYTE_ABGR_PRE: do { ByteComponentRaster byteRaster = (ByteComponentRaster) image.getRaster(); diff --git a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java index 4df346e5a90..23a731572f2 100644 --- a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java +++ b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java @@ -139,16 +139,12 @@ final class LCMSTransform implements ColorTransform { } /** - * Returns {@code true} if lcms may supports this format directly. + * Returns {@code true} if lcms may support this format directly. */ private static boolean isLCMSSupport(BufferedImage src, BufferedImage dst) { if (!dst.getColorModel().hasAlpha()) { return true; } - // lcms as of now does not support pre-alpha - if (src.isAlphaPremultiplied() || dst.isAlphaPremultiplied()) { - return false; - } // lcms does not set correct alpha for transparent dst if src is opaque // is it feature or bug? return dst.getColorModel().hasAlpha() == src.getColorModel().hasAlpha(); diff --git a/src/java.desktop/share/native/liblcms/cmspack.c b/src/java.desktop/share/native/liblcms/cmspack.c index e90e45656fc..caa6c471d50 100644 --- a/src/java.desktop/share/native/liblcms/cmspack.c +++ b/src/java.desktop/share/native/liblcms/cmspack.c @@ -159,12 +159,14 @@ cmsUInt8Number* UnrollChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, v = FROM_8_TO_16(*accum); v = Reverse ? REVERSE_FLAVOR_16(v) : v; - if (Premul && alpha_factor > 0) - { - v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); - if (v > 0xffff) v = 0xffff; + if (Premul) { + if (alpha_factor > 0) { + v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); + if (v > 0xffff) v = 0xffff; + } else { + v = 0; + } } - wIn[index] = (cmsUInt16Number) v; accum++; } @@ -227,12 +229,14 @@ cmsUInt8Number* UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, v = Reverse ? REVERSE_FLAVOR_16(v) : v; - if (Premul && alpha_factor > 0) - { - v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); - if (v > 0xffff) v = 0xffff; + if (Premul) { + if (alpha_factor > 0) { + v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); + if (v > 0xffff) v = 0xffff; + } else { + v = 0; + } } - wIn[index] = (cmsUInt16Number) v; accum += Stride; } @@ -1404,8 +1408,12 @@ cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, else v = ptr[i + start]; - if (Premul && alpha_factor > 0) - v /= alpha_factor; + if (Premul) { + if (alpha_factor > 0) + v /= alpha_factor; + else + v = 0; + } v /= maximum; @@ -1472,8 +1480,12 @@ cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start]; - if (Premul && alpha_factor > 0) - v /= alpha_factor; + if (Premul) { + if (alpha_factor > 0) + v /= alpha_factor; + else + v = 0; + } v /= maximum; @@ -1736,11 +1748,13 @@ cmsUInt8Number* PackChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, if (Reverse) v = REVERSE_FLAVOR_16(v); - if (Premul && alpha_factor != 0) - { - v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + if (Premul) { + if (alpha_factor != 0) { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } else { + v = 0; + } } - *output++ = FROM_16_TO_8(v); } @@ -1805,11 +1819,13 @@ cmsUInt8Number* PackChunkyWords(CMSREGISTER _cmsTRANSFORM* info, if (Reverse) v = REVERSE_FLAVOR_16(v); - if (Premul && alpha_factor != 0) - { - v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + if (Premul) { + if (alpha_factor != 0) { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } else { + v = 0; + } } - *(cmsUInt16Number*) output = v; output += sizeof(cmsUInt16Number); @@ -1872,11 +1888,13 @@ cmsUInt8Number* PackPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, if (Reverse) v = REVERSE_FLAVOR_16(v); - if (Premul && alpha_factor != 0) - { - v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + if (Premul) { + if (alpha_factor != 0) { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } else { + v = 0; + } } - *(cmsUInt8Number*)output = FROM_16_TO_8(v); output += Stride; @@ -1932,11 +1950,13 @@ cmsUInt8Number* PackPlanarWords(CMSREGISTER _cmsTRANSFORM* info, if (Reverse) v = REVERSE_FLAVOR_16(v); - if (Premul && alpha_factor != 0) - { - v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + if (Premul) { + if (alpha_factor != 0) { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } else { + v = 0; + } } - *(cmsUInt16Number*) output = v; output += Stride; }