6793818: JpegImageReader is too greedy creating color profiles
Reviewed-by: igor, prr
This commit is contained in:
parent
8c2a336349
commit
2726f2a362
@ -737,7 +737,7 @@ public class ICC_Profile implements Serializable {
|
||||
ICC_Profile(ProfileDeferralInfo pdi) {
|
||||
this.deferralInfo = pdi;
|
||||
this.profileActivator = new ProfileActivator() {
|
||||
public void activate() {
|
||||
public void activate() throws ProfileDataException {
|
||||
activateDeferredProfile();
|
||||
}
|
||||
};
|
||||
@ -830,20 +830,16 @@ public class ICC_Profile implements Serializable {
|
||||
case ColorSpace.CS_sRGB:
|
||||
synchronized(ICC_Profile.class) {
|
||||
if (sRGBprofile == null) {
|
||||
try {
|
||||
/*
|
||||
* Deferral is only used for standard profiles.
|
||||
* Enabling the appropriate access privileges is handled
|
||||
* at a lower level.
|
||||
*/
|
||||
sRGBprofile = getDeferredInstance(
|
||||
new ProfileDeferralInfo("sRGB.pf",
|
||||
ColorSpace.TYPE_RGB,
|
||||
3, CLASS_DISPLAY));
|
||||
} catch (IOException e) {
|
||||
throw new IllegalArgumentException(
|
||||
"Can't load standard profile: sRGB.pf");
|
||||
}
|
||||
/*
|
||||
* Deferral is only used for standard profiles.
|
||||
* Enabling the appropriate access privileges is handled
|
||||
* at a lower level.
|
||||
*/
|
||||
ProfileDeferralInfo pInfo =
|
||||
new ProfileDeferralInfo("sRGB.pf",
|
||||
ColorSpace.TYPE_RGB, 3,
|
||||
CLASS_DISPLAY);
|
||||
sRGBprofile = getDeferredInstance(pInfo);
|
||||
}
|
||||
thisProfile = sRGBprofile;
|
||||
}
|
||||
@ -853,7 +849,11 @@ public class ICC_Profile implements Serializable {
|
||||
case ColorSpace.CS_CIEXYZ:
|
||||
synchronized(ICC_Profile.class) {
|
||||
if (XYZprofile == null) {
|
||||
XYZprofile = getStandardProfile("CIEXYZ.pf");
|
||||
ProfileDeferralInfo pInfo =
|
||||
new ProfileDeferralInfo("CIEXYZ.pf",
|
||||
ColorSpace.TYPE_XYZ, 3,
|
||||
CLASS_DISPLAY);
|
||||
XYZprofile = getDeferredInstance(pInfo);
|
||||
}
|
||||
thisProfile = XYZprofile;
|
||||
}
|
||||
@ -863,7 +863,11 @@ public class ICC_Profile implements Serializable {
|
||||
case ColorSpace.CS_PYCC:
|
||||
synchronized(ICC_Profile.class) {
|
||||
if (PYCCprofile == null) {
|
||||
PYCCprofile = getStandardProfile("PYCC.pf");
|
||||
ProfileDeferralInfo pInfo =
|
||||
new ProfileDeferralInfo("PYCC.pf",
|
||||
ColorSpace.TYPE_3CLR, 3,
|
||||
CLASS_DISPLAY);
|
||||
PYCCprofile = getDeferredInstance(pInfo);
|
||||
}
|
||||
thisProfile = PYCCprofile;
|
||||
}
|
||||
@ -873,7 +877,11 @@ public class ICC_Profile implements Serializable {
|
||||
case ColorSpace.CS_GRAY:
|
||||
synchronized(ICC_Profile.class) {
|
||||
if (GRAYprofile == null) {
|
||||
GRAYprofile = getStandardProfile("GRAY.pf");
|
||||
ProfileDeferralInfo pInfo =
|
||||
new ProfileDeferralInfo("GRAY.pf",
|
||||
ColorSpace.TYPE_GRAY, 1,
|
||||
CLASS_DISPLAY);
|
||||
GRAYprofile = getDeferredInstance(pInfo);
|
||||
}
|
||||
thisProfile = GRAYprofile;
|
||||
}
|
||||
@ -883,7 +891,11 @@ public class ICC_Profile implements Serializable {
|
||||
case ColorSpace.CS_LINEAR_RGB:
|
||||
synchronized(ICC_Profile.class) {
|
||||
if (LINEAR_RGBprofile == null) {
|
||||
LINEAR_RGBprofile = getStandardProfile("LINEAR_RGB.pf");
|
||||
ProfileDeferralInfo pInfo =
|
||||
new ProfileDeferralInfo("LINEAR_RGB.pf",
|
||||
ColorSpace.TYPE_RGB, 3,
|
||||
CLASS_DISPLAY);
|
||||
LINEAR_RGBprofile = getDeferredInstance(pInfo);
|
||||
}
|
||||
thisProfile = LINEAR_RGBprofile;
|
||||
}
|
||||
@ -1047,9 +1059,7 @@ public class ICC_Profile implements Serializable {
|
||||
* code will take care of access privileges.
|
||||
* @see activateDeferredProfile()
|
||||
*/
|
||||
static ICC_Profile getDeferredInstance(ProfileDeferralInfo pdi)
|
||||
throws IOException {
|
||||
|
||||
static ICC_Profile getDeferredInstance(ProfileDeferralInfo pdi) {
|
||||
if (!ProfileDeferralMgr.deferring) {
|
||||
return getStandardProfile(pdi.filename);
|
||||
}
|
||||
@ -1063,33 +1073,37 @@ public class ICC_Profile implements Serializable {
|
||||
}
|
||||
|
||||
|
||||
void activateDeferredProfile() {
|
||||
byte profileData[];
|
||||
FileInputStream fis;
|
||||
String fileName = deferralInfo.filename;
|
||||
void activateDeferredProfile() throws ProfileDataException {
|
||||
byte profileData[];
|
||||
FileInputStream fis;
|
||||
String fileName = deferralInfo.filename;
|
||||
|
||||
profileActivator = null;
|
||||
deferralInfo = null;
|
||||
if ((fis = openProfile(fileName)) == null) {
|
||||
throw new IllegalArgumentException("Cannot open file " + fileName);
|
||||
throw new ProfileDataException("Cannot open file " + fileName);
|
||||
}
|
||||
try {
|
||||
profileData = getProfileDataFromStream(fis);
|
||||
fis.close(); /* close the file */
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw new IllegalArgumentException("Invalid ICC Profile Data" +
|
||||
fileName);
|
||||
ProfileDataException pde = new
|
||||
ProfileDataException("Invalid ICC Profile Data" + fileName);
|
||||
pde.initCause(e);
|
||||
throw pde;
|
||||
}
|
||||
if (profileData == null) {
|
||||
throw new IllegalArgumentException("Invalid ICC Profile Data" +
|
||||
throw new ProfileDataException("Invalid ICC Profile Data" +
|
||||
fileName);
|
||||
}
|
||||
try {
|
||||
ID = CMSManager.getModule().loadProfile(profileData);
|
||||
} catch (CMMException c) {
|
||||
throw new IllegalArgumentException("Invalid ICC Profile Data" +
|
||||
fileName);
|
||||
ProfileDataException pde = new
|
||||
ProfileDataException("Invalid ICC Profile Data" + fileName);
|
||||
pde.initCause(c);
|
||||
throw pde;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
package sun.java2d.cmm;
|
||||
|
||||
import java.awt.color.ProfileDataException;
|
||||
|
||||
/**
|
||||
* An interface to allow the ProfileDeferralMgr to activate a
|
||||
@ -35,6 +36,6 @@ public interface ProfileActivator {
|
||||
/**
|
||||
* Activate a previously deferred ICC_Profile object.
|
||||
*/
|
||||
public void activate();
|
||||
public void activate() throws ProfileDataException;
|
||||
|
||||
}
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
package sun.java2d.cmm;
|
||||
|
||||
import java.awt.color.ProfileDataException;
|
||||
import java.util.Vector;
|
||||
|
||||
|
||||
@ -39,7 +40,7 @@ import java.util.Vector;
|
||||
public class ProfileDeferralMgr {
|
||||
|
||||
public static boolean deferring = true;
|
||||
private static Vector aVector;
|
||||
private static Vector<ProfileActivator> aVector;
|
||||
|
||||
/**
|
||||
* Records a ProfileActivator object whose activate method will
|
||||
@ -51,7 +52,7 @@ public class ProfileDeferralMgr {
|
||||
return;
|
||||
}
|
||||
if (aVector == null) {
|
||||
aVector = new Vector(3, 3);
|
||||
aVector = new Vector<ProfileActivator>(3, 3);
|
||||
}
|
||||
aVector.addElement(pa);
|
||||
return;
|
||||
@ -89,8 +90,26 @@ public class ProfileDeferralMgr {
|
||||
return;
|
||||
}
|
||||
n = aVector.size();
|
||||
for (i = 0; i < n; i++) {
|
||||
((ProfileActivator) aVector.get(i)).activate();
|
||||
for (ProfileActivator pa : aVector) {
|
||||
try {
|
||||
pa.activate();
|
||||
} catch (ProfileDataException e) {
|
||||
/*
|
||||
* Ignore profile activation error for now:
|
||||
* such exception is pssible due to absence
|
||||
* or corruption of standard color profile.
|
||||
* As for now we expect all profiles should
|
||||
* be shiped with jre and presence of this
|
||||
* exception is indication of some configuration
|
||||
* problem in jre installation.
|
||||
*
|
||||
* NB: we still are greedy loading deferred profiles
|
||||
* and load them all if any of them is needed.
|
||||
* Therefore broken profile (if any) might be never used.
|
||||
* If there will be attempt to use broken profile then
|
||||
* it will result in CMMException.
|
||||
*/
|
||||
}
|
||||
}
|
||||
aVector.removeAllElements();
|
||||
aVector = null;
|
||||
|
Loading…
Reference in New Issue
Block a user