src/share/classes/sun/java2d/cmm/lcms/LCMS.java
Print this page
*** 23,55 ****
* questions.
*/
package sun.java2d.cmm.lcms;
- import java.awt.color.ColorSpace;
import java.awt.color.ICC_Profile;
! import java.awt.color.CMMException;
import sun.java2d.cmm.ColorTransform;
import sun.java2d.cmm.PCMM;
- import sun.java2d.cmm.lcms.LCMS;
- import sun.java2d.cmm.lcms.LCMSTransform;
public class LCMS implements PCMM {
/* methods invoked from ICC_Profile */
! public native long loadProfile(byte[] data);
! public native void freeProfile(long profileID);
public native synchronized int getProfileSize(long profileID);
public native synchronized void getProfileData(long profileID, byte[] data);
! public native synchronized int getTagSize(long profileID, int tagSignature);
! public native synchronized void getTagData(long profileID, int tagSignature,
! byte[] data);
! public native synchronized void setTagData(long profileID, int tagSignature,
byte[] data);
public static native long getProfileID(ICC_Profile profile);
public static native long createNativeTransform(
--- 23,117 ----
* questions.
*/
package sun.java2d.cmm.lcms;
import java.awt.color.ICC_Profile;
! import java.util.Arrays;
! import java.util.HashMap;
import sun.java2d.cmm.ColorTransform;
import sun.java2d.cmm.PCMM;
public class LCMS implements PCMM {
/* methods invoked from ICC_Profile */
! @Override
! public long loadProfile(byte[] data) {
! long id = loadProfileNative(data);
!
! if (id != 0L) {
! if (profiles == null) {
! profiles = new HashMap<>();
! }
! profiles.put(id, new TagCache(id));
! }
! return id;
! }
!
! private native long loadProfileNative(byte[] data);
!
! @Override
! public void freeProfile(long profileID) {
! TagCache c = profiles.remove(profileID);
! if (c != null) {
! c.clear();
! }
! if (profiles.isEmpty()) {
! profiles = null;
! }
! freeProfileNative(profileID);
! }
! private native void freeProfileNative(long profileID);
public native synchronized int getProfileSize(long profileID);
public native synchronized void getProfileData(long profileID, byte[] data);
! @Override
! public synchronized int getTagSize(long profileID, int tagSignature) {
! TagCache cache = profiles.get(profileID);
!
! if (cache == null) {
! cache = new TagCache(profileID);
! profiles.put(profileID, cache);
! }
!
! TagData t = cache.getTag(tagSignature);
! return t == null ? 0 : t.getSize();
! }
!
! private static native byte[] getTagNative(long profileID, int signature);
!
! @Override
! public synchronized void getTagData(long profileID, int tagSignature,
! byte[] data)
! {
! TagCache cache = profiles.get(profileID);
!
! if (cache == null) {
! cache = new TagCache(profileID);
! profiles.put(profileID, cache);
! }
!
! TagData t = cache.getTag(tagSignature);
! if (t != null) {
! t.copyDataTo(data);
! }
! }
!
! @Override
! public synchronized void setTagData(long profileID, int tagSignature, byte[] data) {
! TagCache cache = profiles.get(profileID);
!
! if (cache != null) {
! cache.clear();
! }
! setTagDataNative(profileID, tagSignature, data);
! }
!
! private native synchronized void setTagDataNative(long profileID, int tagSignature,
byte[] data);
public static native long getProfileID(ICC_Profile profile);
public static native long createNativeTransform(
*** 101,106 ****
--- 163,223 ----
}
);
initLCMS(LCMSTransform.class, LCMSImageLayout.class, ICC_Profile.class);
}
+
+ private static class TagData {
+ private int signature;
+ private byte[] data;
+
+ TagData(int sig, byte[] data) {
+ this.signature = sig;
+ this.data = data;
+ }
+
+ int getSize() {
+ return data.length;
+ }
+
+ byte[] getData() {
+ return Arrays.copyOf(data, data.length);
+ }
+
+ void copyDataTo(byte[] dst) {
+ System.arraycopy(data, 0, dst, 0, data.length);
+ }
+
+ int getSignature() {
+ return signature;
+ }
+ }
+
+ private static class TagCache {
+ private long profileID;
+ private HashMap<Integer, TagData> tags;
+
+ TagCache(long id) {
+ profileID = id;
+
+ tags = new HashMap<>();
+ }
+
+ TagData getTag(int sig) {
+ TagData t = tags.get(sig);
+ if (t == null) {
+ byte[] tagData = getTagNative(profileID, sig);
+ if (tagData != null) {
+ t = new TagData(sig, tagData);
+ tags.put(sig, t);
+ }
+ }
+ return t;
+ }
+
+ void clear() {
+ tags.clear();
+ }
+ }
+
+ private static HashMap<Long, TagCache> profiles;
}