1 /* 2 * Copyright (c) 2006, 2014, 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 38 public class CMSManager { 39 public static ColorSpace GRAYspace; // These two fields allow access 40 public static ColorSpace LINEAR_RGBspace; // to java.awt.color.ColorSpace 41 // private fields from other 42 // packages. The fields are set 43 // by java.awt.color.ColorSpace 44 // and read by 45 // java.awt.image.ColorModel. 46 47 private static PCMM cmmImpl = null; 48 49 public static synchronized PCMM getModule() { 50 if (cmmImpl != null) { 51 return cmmImpl; 52 } 53 54 GetPropertyAction gpa = new GetPropertyAction("sun.java2d.cmm"); 55 String cmmProviderClass = AccessController.doPrivileged(gpa); 56 CMMServiceProvider provider = null; 57 if (cmmProviderClass != null) { 58 try { 59 Class<?> cls = Class.forName(cmmProviderClass); 60 provider = (CMMServiceProvider)cls.newInstance(); 61 } catch (ReflectiveOperationException e) { 62 } 63 } 64 if (provider == null) { 65 provider = new sun.java2d.cmm.lcms.LcmsServiceProvider(); 66 } 67 68 cmmImpl = provider.getColorManagementModule(); 69 70 if (cmmImpl == null) { 71 throw new CMMException("Cannot initialize Color Management System."+ 72 "No CM module found"); 73 } 74 75 gpa = new GetPropertyAction("sun.java2d.cmm.trace"); 76 String cmmTrace = AccessController.doPrivileged(gpa); 77 if (cmmTrace != null) { 78 cmmImpl = new CMMTracer(cmmImpl); 79 } 80 81 return cmmImpl; 82 } 83 84 static synchronized boolean canCreateModule() { 85 return (cmmImpl == null); 86 } 87 88 /* CMM trace routines */ 89 90 public static class CMMTracer implements PCMM { 91 PCMM tcmm; 92 String cName ; 93 94 public CMMTracer(PCMM tcmm) { 95 this.tcmm = tcmm; 96 cName = tcmm.getClass().getName(); 97 } 98 99 public Profile loadProfile(byte[] data) { 100 System.err.print(cName + ".loadProfile"); 101 Profile p = tcmm.loadProfile(data); 102 System.err.printf("(ID=%s)\n", p.toString()); 103 return p; 104 } 105 106 public void freeProfile(Profile p) { 107 System.err.printf(cName + ".freeProfile(ID=%s)\n", p.toString()); 108 tcmm.freeProfile(p); 109 } 110 111 public int getProfileSize(Profile p) { 112 System.err.print(cName + ".getProfileSize(ID=" + p + ")"); 113 int size = tcmm.getProfileSize(p); 114 System.err.println("=" + size); 115 return size; 116 } 117 118 public void getProfileData(Profile p, byte[] data) { 119 System.err.print(cName + ".getProfileData(ID=" + p + ") "); 120 System.err.println("requested " + data.length + " byte(s)"); 121 tcmm.getProfileData(p, data); 122 } 123 124 public int getTagSize(Profile p, int tagSignature) { 125 System.err.printf(cName + ".getTagSize(ID=%x, TagSig=%s)", 126 p, signatureToString(tagSignature)); 127 int size = tcmm.getTagSize(p, tagSignature); 128 System.err.println("=" + size); 129 return size; 130 } 131 132 public void getTagData(Profile p, int tagSignature, 133 byte[] data) { 134 System.err.printf(cName + ".getTagData(ID=%x, TagSig=%s)", 135 p, signatureToString(tagSignature)); 136 System.err.println(" requested " + data.length + " byte(s)"); 137 tcmm.getTagData(p, tagSignature, data); 138 } 139 140 public void setTagData(Profile p, int tagSignature, 141 byte[] data) { 142 System.err.print(cName + ".setTagData(ID=" + p + 143 ", TagSig=" + tagSignature + ")"); 144 System.err.println(" sending " + data.length + " byte(s)"); 145 tcmm.setTagData(p, tagSignature, data); 146 } 147 148 /* methods for creating ColorTransforms */ 149 public ColorTransform createTransform(ICC_Profile profile, 150 int renderType, 151 int transformType) { 152 System.err.println(cName + ".createTransform(ICC_Profile,int,int)"); 153 return tcmm.createTransform(profile, renderType, transformType); 154 } 155 156 public ColorTransform createTransform(ColorTransform[] transforms) { 157 System.err.println(cName + ".createTransform(ColorTransform[])"); 158 return tcmm.createTransform(transforms); 159 } 160 161 private static String signatureToString(int sig) { 162 return String.format("%c%c%c%c", 163 (char)(0xff & (sig >> 24)), 164 (char)(0xff & (sig >> 16)), 165 (char)(0xff & (sig >> 8)), 166 (char)(0xff & (sig ))); 167 } 168 } 169 }