# HG changeset patch # User lana # Date 1366259428 25200 # Node ID a1e85b27e6ee65b03e1fafb57a0aba3330d05f89 # Parent da9a4c9312816451884aa6db6f18be51a07bff13# Parent e75bf5e0d18c011caaf1f85838d060b05ce6f670 Merge diff -r da9a4c931281 -r a1e85b27e6ee jdk/make/sun/cmm/Makefile --- a/jdk/make/sun/cmm/Makefile Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/make/sun/cmm/Makefile Wed Apr 17 21:30:28 2013 -0700 @@ -27,8 +27,9 @@ PRODUCT = sun include $(BUILDDIR)/common/Defs.gmk +SUBDIRS += lcms + ifdef OPENJDK - SUBDIRS += lcms ICCPROFILE_SRC_DIR = $(SHARE_SRC)/lib/cmm/lcms else # !OPENJDK SUBDIRS += kcms diff -r da9a4c931281 -r a1e85b27e6ee jdk/make/sun/cmm/kcms/Makefile --- a/jdk/make/sun/cmm/kcms/Makefile Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/make/sun/cmm/kcms/Makefile Wed Apr 17 21:30:28 2013 -0700 @@ -57,7 +57,7 @@ SERVICEDIR = $(CLASSBINDIR)/META-INF/services FILES_copy = \ - $(SERVICEDIR)/sun.java2d.cmm.PCMM + $(SERVICEDIR)/sun.java2d.cmm.CMMServiceProvider build: copy-files diff -r da9a4c931281 -r a1e85b27e6ee jdk/make/sun/cmm/lcms/Makefile --- a/jdk/make/sun/cmm/lcms/Makefile Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/make/sun/cmm/lcms/Makefile Wed Apr 17 21:30:28 2013 -0700 @@ -58,7 +58,7 @@ SERVICEDIR = $(CLASSBINDIR)/META-INF/services FILES_copy = \ - $(SERVICEDIR)/sun.java2d.cmm.PCMM + $(SERVICEDIR)/sun.java2d.cmm.CMMServiceProvider build: copy-files diff -r da9a4c931281 -r a1e85b27e6ee jdk/makefiles/CompileNativeLibraries.gmk --- a/jdk/makefiles/CompileNativeLibraries.gmk Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/makefiles/CompileNativeLibraries.gmk Wed Apr 17 21:30:28 2013 -0700 @@ -1213,7 +1213,6 @@ ########################################################################################## -ifdef OPENJDK # TODO: Update awt lib path when awt is converted $(eval $(call SetupNativeCompilation,BUILD_LIBLCMS,\ LIBRARY:=lcms,\ @@ -1246,7 +1245,6 @@ BUILD_LIBRARIES += $(BUILD_LIBLCMS) $(BUILD_LIBLCMS) : $(BUILD_LIBAWT) -endif ########################################################################################## diff -r da9a4c931281 -r a1e85b27e6ee jdk/makefiles/CopyIntoClasses.gmk --- a/jdk/makefiles/CopyIntoClasses.gmk Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/makefiles/CopyIntoClasses.gmk Wed Apr 17 21:30:28 2013 -0700 @@ -185,10 +185,10 @@ ifdef OPENJDK SRC_SERVICES_FILES:=$(filter-out %sun/dc/META-INF/services/sun.java2d.pipe.RenderingEngine,$(SRC_SERVICES_FILES)) - SRC_SERVICES_FILES:=$(filter-out %sun/java2d/cmm/kcms/META-INF/services/sun.java2d.cmm.PCMM,$(SRC_SERVICES_FILES)) + SRC_SERVICES_FILES:=$(filter-out %sun/java2d/cmm/kcms/META-INF/services/sun.java2d.cmm.CMMServiceProvider,$(SRC_SERVICES_FILES)) else SRC_SERVICES_FILES:=$(filter-out %sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine,$(SRC_SERVICES_FILES)) - SRC_SERVICES_FILES:=$(filter-out %sun/java2d/cmm/lcms/META-INF/services/sun.java2d.cmm.PCMM,$(SRC_SERVICES_FILES)) + SRC_SERVICES_FILES:=$(filter-out %sun/java2d/cmm/lcms/META-INF/services/sun.java2d.cmm.CMMServiceProvider,$(SRC_SERVICES_FILES)) endif # The number of services files are relatively few. If the increase in numbers, then diff -r da9a4c931281 -r a1e85b27e6ee jdk/src/share/classes/sun/java2d/cmm/CMMServiceProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/java2d/cmm/CMMServiceProvider.java Wed Apr 17 21:30:28 2013 -0700 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.java2d.cmm; + +public abstract class CMMServiceProvider { + public final PCMM getColorManagementModule() { + if (CMSManager.canCreateModule()) { + return getModule(); + } + return null; + } + + protected abstract PCMM getModule(); +} diff -r da9a4c931281 -r a1e85b27e6ee jdk/src/share/classes/sun/java2d/cmm/CMSManager.java --- a/jdk/src/share/classes/sun/java2d/cmm/CMSManager.java Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/src/share/classes/sun/java2d/cmm/CMSManager.java Wed Apr 17 21:30:28 2013 -0700 @@ -52,26 +52,29 @@ return cmmImpl; } - cmmImpl = (PCMM)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - String cmmClass = System.getProperty( - "sun.java2d.cmm", "sun.java2d.cmm.kcms.CMM"); + CMMServiceProvider spi = AccessController.doPrivileged( + new PrivilegedAction() { + public CMMServiceProvider run() { + String cmmClass = System.getProperty( + "sun.java2d.cmm", "sun.java2d.cmm.lcms.LcmsServiceProvider"); - ServiceLoader cmmLoader - = ServiceLoader.loadInstalled(PCMM.class); + ServiceLoader cmmLoader + = ServiceLoader.loadInstalled(CMMServiceProvider.class); - PCMM service = null; + CMMServiceProvider spi = null; - for (PCMM cmm : cmmLoader) { - service = cmm; + for (CMMServiceProvider cmm : cmmLoader) { + spi = cmm; if (cmm.getClass().getName().equals(cmmClass)) { break; } } - return service; + return spi; } }); + cmmImpl = spi.getColorManagementModule(); + if (cmmImpl == null) { throw new CMMException("Cannot initialize Color Management System."+ "No CM module found"); @@ -86,6 +89,10 @@ return cmmImpl; } + static synchronized boolean canCreateModule() { + return (cmmImpl == null); + } + /* CMM trace routines */ public static class CMMTracer implements PCMM { diff -r da9a4c931281 -r a1e85b27e6ee jdk/src/share/classes/sun/java2d/cmm/lcms/LCMS.java --- a/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMS.java Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMS.java Wed Apr 17 21:30:28 2013 -0700 @@ -148,22 +148,32 @@ public static native void initLCMS(Class Trans, Class IL, Class Pf); - /* the class initializer which loads the CMM */ - static { + private LCMS() {}; + + private static LCMS theLcms = null; + + static synchronized PCMM getModule() { + if (theLcms != null) { + return theLcms; + } + java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - /* We need to load awt here because of usage trace and - * disposer frameworks - */ - System.loadLibrary("awt"); - System.loadLibrary("lcms"); - return null; - } - } - ); + new java.security.PrivilegedAction() { + public Object run() { + /* We need to load awt here because of usage trace and + * disposer frameworks + */ + System.loadLibrary("awt"); + System.loadLibrary("lcms"); + return null; + } + }); initLCMS(LCMSTransform.class, LCMSImageLayout.class, ICC_Profile.class); + + theLcms = new LCMS(); + + return theLcms; } private static class TagData { diff -r da9a4c931281 -r a1e85b27e6ee jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java --- a/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java Wed Jul 05 18:50:42 2017 +0200 +++ b/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java Wed Apr 17 21:30:28 2013 -0700 @@ -163,13 +163,15 @@ public void colorConvert(BufferedImage src, BufferedImage dst) { LCMSImageLayout srcIL, dstIL; - dstIL = LCMSImageLayout.createImageLayout(dst); + if (!dst.getColorModel().hasAlpha()) { + dstIL = LCMSImageLayout.createImageLayout(dst); - if (dstIL != null) { - srcIL = LCMSImageLayout.createImageLayout(src); - if (srcIL != null) { - doTransform(srcIL, dstIL); - return; + if (dstIL != null) { + srcIL = LCMSImageLayout.createImageLayout(src); + if (srcIL != null) { + doTransform(srcIL, dstIL); + return; + } } } diff -r da9a4c931281 -r a1e85b27e6ee jdk/src/share/classes/sun/java2d/cmm/lcms/LcmsServiceProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/java2d/cmm/lcms/LcmsServiceProvider.java Wed Apr 17 21:30:28 2013 -0700 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.java2d.cmm.lcms; + +import sun.java2d.cmm.CMMServiceProvider; +import sun.java2d.cmm.PCMM; + +public final class LcmsServiceProvider extends CMMServiceProvider { + @Override + protected PCMM getModule() { + return LCMS.getModule(); + } +} diff -r da9a4c931281 -r a1e85b27e6ee jdk/src/share/classes/sun/java2d/cmm/lcms/META-INF/services/sun.java2d.cmm.CMMServiceProvider --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/java2d/cmm/lcms/META-INF/services/sun.java2d.cmm.CMMServiceProvider Wed Apr 17 21:30:28 2013 -0700 @@ -0,0 +1,2 @@ +# Little CMS color management module +sun.java2d.cmm.lcms.LcmsServiceProvider diff -r da9a4c931281 -r a1e85b27e6ee jdk/src/share/classes/sun/java2d/cmm/lcms/META-INF/services/sun.java2d.cmm.PCMM --- a/jdk/src/share/classes/sun/java2d/cmm/lcms/META-INF/services/sun.java2d.cmm.PCMM Wed Jul 05 18:50:42 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -# Little CMS color management module -sun.java2d.cmm.lcms.LCMS diff -r da9a4c931281 -r a1e85b27e6ee jdk/test/sun/java2d/cmm/ColorConvertOp/AlphaTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/java2d/cmm/ColorConvertOp/AlphaTest.java Wed Apr 17 21:30:28 2013 -0700 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8005930 + * @summary Thest verifies that color conversion does not distort + * alpha channel in the destination image. + * + * @run main AlphaTest + */ + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorConvertOp; + +public class AlphaTest { + public static void main(String[] args) { + ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); + + ColorConvertOp op = new ColorConvertOp(cs, null); + // create source image filled with an opaque color + BufferedImage src = createSrc(); + int srcAlpha = getAlpha(src); + + System.out.printf("Src alpha: 0x%02x\n", srcAlpha); + + // create clear (transparent black) destination image + BufferedImage dst = createDst(); + int dstAlpha = getAlpha(dst); + System.out.printf("Dst alpha: 0x%02x\n", dstAlpha); + + + dst = op.filter(src, dst); + dstAlpha = getAlpha(dst); + // we expect that destination image is opaque + // i.e. alpha is transferred from source to + // the destination + System.out.printf("Result alpha: 0x%02x\n", dstAlpha); + + if (srcAlpha != dstAlpha) { + throw new RuntimeException("Test failed!"); + } + System.out.println("Test passed"); + } + + private static BufferedImage createSrc() { + BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + + Graphics2D g = img.createGraphics(); + g.setColor(Color.red); + g.fillRect(0, 0, w, h); + g.dispose(); + + return img; + } + + private static BufferedImage createDst() { + BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + + Graphics2D g = img.createGraphics(); + g.setComposite(AlphaComposite.Clear); + g.fillRect(0, 0, w, h); + g.dispose(); + + return img; + } + + private static int getAlpha(BufferedImage img) { + int argb = img.getRGB(w / 2, h / 2); + return 0xff & (argb >> 24); + } + + private static final int w = 100; + private static final int h = 100; +}