1 /* 2 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.java2d.cmm; 27 28 import java.awt.color.ColorSpace; 29 import java.awt.color.ICC_Profile; 30 import java.awt.color.CMMException; 31 import java.awt.image.BufferedImage; 32 import java.awt.image.Raster; 33 import java.awt.image.WritableRaster; 34 import java.security.AccessController; 35 import java.security.PrivilegedAction; 36 import sun.security.action.GetPropertyAction; 37 import java.util.ServiceLoader; 38 39 public class CMSManager { 40 public static ColorSpace GRAYspace; // These two fields allow access 41 public static ColorSpace LINEAR_RGBspace; // to java.awt.color.ColorSpace 42 // private fields from other 43 // packages. The fields are set 44 // by java.awt.color.ColorSpace 45 // and read by 46 // java.awt.image.ColorModel. 47 48 private static PCMM cmmImpl = null; 49 50 public static synchronized PCMM getModule() { 51 if (cmmImpl != null) { 52 return cmmImpl; 53 } 54 55 CMMServiceProvider spi = AccessController.doPrivileged( 56 new PrivilegedAction<CMMServiceProvider>() { 57 public CMMServiceProvider run() { 58 String cmmClass = System.getProperty( 59 "sun.java2d.cmm", "sun.java2d.cmm.lcms.LcmsServiceProvider"); 60 61 ServiceLoader<CMMServiceProvider> cmmLoader 62 = ServiceLoader.loadInstalled(CMMServiceProvider.class); 63 64 CMMServiceProvider spi = null; 65 66 for (CMMServiceProvider cmm : cmmLoader) { 67 spi = cmm; 68 if (cmm.getClass().getName().equals(cmmClass)) { 69 break; 70 } 71 } 72 return spi; 73 } 74 }); 75 76 cmmImpl = spi.getColorManagementModule(); 77 78 if (cmmImpl == null) { 79 throw new CMMException("Cannot initialize Color Management System."+ 80 "No CM module found"); 81 } 82 83 GetPropertyAction gpa = new GetPropertyAction("sun.java2d.cmm.trace"); 84 String cmmTrace = (String)AccessController.doPrivileged(gpa); 85 if (cmmTrace != null) { 86 cmmImpl = new CMMTracer(cmmImpl); 87 } 88 89 return cmmImpl; 90 } 91 92 static synchronized boolean canCreateModule() { 93 return (cmmImpl == null); 94 } 95 96 /* CMM trace routines */ 97 98 public static class CMMTracer implements PCMM { 99 PCMM tcmm; 100 String cName ; 101 102 public CMMTracer(PCMM tcmm) { 103 this.tcmm = tcmm; 104 cName = tcmm.getClass().getName(); 105 } 106 107 public Profile loadProfile(byte[] data) { 108 System.err.print(cName + ".loadProfile"); 109 Profile p = tcmm.loadProfile(data); 110 System.err.printf("(ID=%s)\n", p.toString()); 111 return p; 112 } 113 114 public void freeProfile(Profile p) { 115 System.err.printf(cName + ".freeProfile(ID=%s)\n", p.toString()); 116 tcmm.freeProfile(p); 117 } 118 119 public int getProfileSize(Profile p) { 120 System.err.print(cName + ".getProfileSize(ID=" + p + ")"); 121 int size = tcmm.getProfileSize(p); 122 System.err.println("=" + size); 123 return size; 124 } 125 126 public void getProfileData(Profile p, byte[] data) { 127 System.err.print(cName + ".getProfileData(ID=" + p + ") "); 128 System.err.println("requested " + data.length + " byte(s)"); 129 tcmm.getProfileData(p, data); 130 } 131 132 public int getTagSize(Profile p, int tagSignature) { 133 System.err.printf(cName + ".getTagSize(ID=%x, TagSig=%s)", 134 p, signatureToString(tagSignature)); 135 int size = tcmm.getTagSize(p, tagSignature); 136 System.err.println("=" + size); 137 return size; 138 } 139 140 public void getTagData(Profile p, int tagSignature, 141 byte[] data) { 142 System.err.printf(cName + ".getTagData(ID=%x, TagSig=%s)", 143 p, signatureToString(tagSignature)); 144 System.err.println(" requested " + data.length + " byte(s)"); 145 tcmm.getTagData(p, tagSignature, data); 146 } 147 148 public void setTagData(Profile p, int tagSignature, 149 byte[] data) { 150 System.err.print(cName + ".setTagData(ID=" + p + 151 ", TagSig=" + tagSignature + ")"); 152 System.err.println(" sending " + data.length + " byte(s)"); 153 tcmm.setTagData(p, tagSignature, data); 154 } 155 156 /* methods for creating ColorTransforms */ 157 public ColorTransform createTransform(ICC_Profile profile, 158 int renderType, 159 int transformType) { 160 System.err.println(cName + ".createTransform(ICC_Profile,int,int)"); 161 return tcmm.createTransform(profile, renderType, transformType); 162 } 163 164 public ColorTransform createTransform(ColorTransform[] transforms) { 165 System.err.println(cName + ".createTransform(ColorTransform[])"); 166 return tcmm.createTransform(transforms); 167 } 168 169 private static String signatureToString(int sig) { 170 return String.format("%c%c%c%c", 171 (char)(0xff & (sig >> 24)), 172 (char)(0xff & (sig >> 16)), 173 (char)(0xff & (sig >> 8)), 174 (char)(0xff & (sig ))); 175 } 176 } 177 }