6631559: Registration of ImageIO plugins should not cause loading of jpeg.dlli and cmm.dll
Reviewed-by: igor, prr
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java Thu Jan 29 13:19:34 2009 +0300
@@ -1003,7 +1003,7 @@
3,
new int [] {0, 1, 2},
null);
- ColorModel cm = new ComponentColorModel(JPEG.sRGB,
+ ColorModel cm = new ComponentColorModel(JPEG.JCS.sRGB,
false,
false,
ColorModel.OPAQUE,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEG.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEG.java Thu Jan 29 13:19:34 2009 +0300
@@ -208,15 +208,24 @@
public static final int [] bOffsRGB = { 2, 1, 0 };
- protected static final ColorSpace sRGB =
- ColorSpace.getInstance(ColorSpace.CS_sRGB);
- protected static ColorSpace YCC = null; // Can't be final
+ /* These are kept in the inner class to avoid static initialization
+ * of the CMM class until someone actually needs it.
+ * (e.g. do not init CMM on the request for jpeg mime types)
+ */
+ public static class JCS {
+ public static final ColorSpace sRGB =
+ ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ public static final ColorSpace YCC;
- static {
- try {
- YCC = ColorSpace.getInstance(ColorSpace.CS_PYCC);
- } catch (IllegalArgumentException e) {
- // PYCC.pf may not always be installed
+ static {
+ ColorSpace cs = null;
+ try {
+ cs = ColorSpace.getInstance(ColorSpace.CS_PYCC);
+ } catch (IllegalArgumentException e) {
+ // PYCC.pf may not always be installed
+ } finally {
+ YCC = cs;
+ }
}
}
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java Thu Jan 29 13:19:34 2009 +0300
@@ -228,31 +228,31 @@
(BufferedImage.TYPE_BYTE_GRAY);
defaultTypes[JPEG.JCS_RGB] =
ImageTypeSpecifier.createInterleaved
- (JPEG.sRGB,
+ (JPEG.JCS.sRGB,
JPEG.bOffsRGB,
DataBuffer.TYPE_BYTE,
false,
false);
defaultTypes[JPEG.JCS_RGBA] =
ImageTypeSpecifier.createPacked
- (JPEG.sRGB,
+ (JPEG.JCS.sRGB,
0xff000000,
0x00ff0000,
0x0000ff00,
0x000000ff,
DataBuffer.TYPE_INT,
false);
- if (JPEG.YCC != null) {
+ if (JPEG.JCS.YCC != null) {
defaultTypes[JPEG.JCS_YCC] =
ImageTypeSpecifier.createInterleaved
- (JPEG.YCC,
+ (JPEG.JCS.YCC,
JPEG.bandOffsets[2],
DataBuffer.TYPE_BYTE,
false,
false);
defaultTypes[JPEG.JCS_YCCA] =
ImageTypeSpecifier.createInterleaved
- (JPEG.YCC,
+ (JPEG.JCS.YCC,
JPEG.bandOffsets[3],
DataBuffer.TYPE_BYTE,
true,
@@ -774,7 +774,7 @@
case JPEG.JCS_RGB:
list.add(raw);
list.add(getImageType(JPEG.JCS_GRAYSCALE));
- if (JPEG.YCC != null) {
+ if (JPEG.JCS.YCC != null) {
list.add(getImageType(JPEG.JCS_YCC));
}
break;
@@ -811,7 +811,7 @@
}
list.add(getImageType(JPEG.JCS_GRAYSCALE));
- if (JPEG.YCC != null) { // Might be null if PYCC.pf not installed
+ if (JPEG.JCS.YCC != null) { // Might be null if PYCC.pf not installed
list.add(getImageType(JPEG.JCS_YCC));
}
break;
@@ -893,7 +893,7 @@
(!cs.isCS_sRGB()) &&
(cm.getNumComponents() == numComponents)) {
// Target isn't sRGB, so convert from sRGB to the target
- convert = new ColorConvertOp(JPEG.sRGB, cs, null);
+ convert = new ColorConvertOp(JPEG.JCS.sRGB, cs, null);
} else if (csType != ColorSpace.TYPE_RGB) {
throw new IIOException("Incompatible color conversion");
}
@@ -906,18 +906,18 @@
}
break;
case JPEG.JCS_YCC:
- if (JPEG.YCC == null) { // We can't do YCC at all
+ if (JPEG.JCS.YCC == null) { // We can't do YCC at all
throw new IIOException("Incompatible color conversion");
}
- if ((cs != JPEG.YCC) &&
+ if ((cs != JPEG.JCS.YCC) &&
(cm.getNumComponents() == numComponents)) {
- convert = new ColorConvertOp(JPEG.YCC, cs, null);
+ convert = new ColorConvertOp(JPEG.JCS.YCC, cs, null);
}
break;
case JPEG.JCS_YCCA:
// No conversions available; image must be YCCA
- if ((JPEG.YCC == null) || // We can't do YCC at all
- (cs != JPEG.YCC) ||
+ if ((JPEG.JCS.YCC == null) || // We can't do YCC at all
+ (cs != JPEG.JCS.YCC) ||
(cm.getNumComponents() != numComponents)) {
throw new IIOException("Incompatible color conversion");
}
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java Thu Jan 29 13:19:34 2009 +0300
@@ -39,8 +39,6 @@
private static String [] writerSpiNames =
{"com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi"};
- private boolean registered = false;
-
public JPEGImageReaderSpi() {
super(JPEG.vendor,
JPEG.version,
@@ -61,26 +59,6 @@
);
}
- public void onRegistration(ServiceRegistry registry,
- Class<?> category) {
- if (registered) {
- return;
- }
- try {
- java.security.AccessController.doPrivileged(
- new sun.security.action.LoadLibraryAction("jpeg"));
- // Stuff it all into one lib for first pass
- //java.security.AccessController.doPrivileged(
- //new sun.security.action.LoadLibraryAction("imageioIJG"));
- } catch (Throwable e) { // Fail on any Throwable
- // if it can't be loaded, deregister and return
- registry.deregisterServiceProvider(this);
- return;
- }
-
- registered = true;
- }
-
public String getDescription(Locale locale) {
return "Standard JPEG Image Reader";
}
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java Thu Jan 29 13:19:34 2009 +0300
@@ -812,13 +812,13 @@
}
break;
case ColorSpace.TYPE_3CLR:
- if (cs == JPEG.YCC) {
+ if (cs == JPEG.JCS.YCC) {
if (!alpha) {
if (jfif != null) {
convertTosRGB = true;
convertOp =
new ColorConvertOp(cs,
- JPEG.sRGB,
+ JPEG.JCS.sRGB,
null);
outCsType = JPEG.JCS_YCbCr;
} else if (adobe != null) {
@@ -1494,7 +1494,7 @@
}
break;
case ColorSpace.TYPE_3CLR:
- if (cs == JPEG.YCC) {
+ if (cs == JPEG.JCS.YCC) {
if (alpha) {
retval = JPEG.JCS_YCCA;
} else {
@@ -1533,7 +1533,7 @@
}
break;
case ColorSpace.TYPE_3CLR:
- if (cs == JPEG.YCC) {
+ if (cs == JPEG.JCS.YCC) {
if (alpha) {
retval = JPEG.JCS_YCCA;
} else {
@@ -1579,7 +1579,7 @@
}
break;
case ColorSpace.TYPE_3CLR:
- if (cs == JPEG.YCC) {
+ if (cs == JPEG.JCS.YCC) {
if (alpha) {
retval = JPEG.JCS_YCCA;
} else {
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java Thu Jan 29 13:19:34 2009 +0300
@@ -42,8 +42,6 @@
private static String [] readerSpiNames =
{"com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi"};
- private boolean registered = false;
-
public JPEGImageWriterSpi() {
super(JPEG.vendor,
JPEG.version,
@@ -68,23 +66,6 @@
return "Standard JPEG Image Writer";
}
- public void onRegistration(ServiceRegistry registry,
- Class<?> category) {
- if (registered) {
- return;
- }
- try {
- java.security.AccessController.doPrivileged(
- new sun.security.action.LoadLibraryAction("jpeg"));
- } catch (Throwable e) { // Fail on any Throwable
- // if it can't be loaded, deregister and return
- registry.deregisterServiceProvider(this);
- return;
- }
-
- registered = true;
- }
-
public boolean isFormatLossless() {
return false;
}
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java Thu Jan 29 13:19:34 2009 +0300
@@ -490,7 +490,7 @@
}
break;
case ColorSpace.TYPE_3CLR:
- if (cs == JPEG.YCC) {
+ if (cs == JPEG.JCS.YCC) {
wantJFIF = false;
componentIDs[0] = (byte) 'Y';
componentIDs[1] = (byte) 'C';
--- a/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java Wed Jan 28 09:38:55 2009 -0800
+++ b/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java Thu Jan 29 13:19:34 2009 +0300
@@ -67,126 +67,13 @@
* <code>BufferedImage</code> types.
*/
private static ImageTypeSpecifier[] BISpecifier;
-
+ private static ColorSpace sRGB;
// Initialize the standard specifiers
static {
- ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
BISpecifier =
new ImageTypeSpecifier[BufferedImage.TYPE_BYTE_INDEXED + 1];
-
- BISpecifier[BufferedImage.TYPE_CUSTOM] = null;
-
- BISpecifier[BufferedImage.TYPE_INT_RGB] =
- createPacked(sRGB,
- 0x00ff0000,
- 0x0000ff00,
- 0x000000ff,
- 0x0,
- DataBuffer.TYPE_INT,
- false);
-
- BISpecifier[BufferedImage.TYPE_INT_ARGB] =
- createPacked(sRGB,
- 0x00ff0000,
- 0x0000ff00,
- 0x000000ff,
- 0xff000000,
- DataBuffer.TYPE_INT,
- false);
-
- BISpecifier[BufferedImage.TYPE_INT_ARGB_PRE] =
- createPacked(sRGB,
- 0x00ff0000,
- 0x0000ff00,
- 0x000000ff,
- 0xff000000,
- DataBuffer.TYPE_INT,
- true);
-
- BISpecifier[BufferedImage.TYPE_INT_BGR] =
- createPacked(sRGB,
- 0x000000ff,
- 0x0000ff00,
- 0x00ff0000,
- 0x0,
- DataBuffer.TYPE_INT,
- false);
-
- int[] bOffsRGB = { 2, 1, 0 };
- BISpecifier[BufferedImage.TYPE_3BYTE_BGR] =
- createInterleaved(sRGB,
- bOffsRGB,
- DataBuffer.TYPE_BYTE,
- false,
- false);
-
- int[] bOffsABGR = { 3, 2, 1, 0 };
- BISpecifier[BufferedImage.TYPE_4BYTE_ABGR] =
- createInterleaved(sRGB,
- bOffsABGR,
- DataBuffer.TYPE_BYTE,
- true,
- false);
-
- BISpecifier[BufferedImage.TYPE_4BYTE_ABGR_PRE] =
- createInterleaved(sRGB,
- bOffsABGR,
- DataBuffer.TYPE_BYTE,
- true,
- true);
-
- BISpecifier[BufferedImage.TYPE_USHORT_565_RGB] =
- createPacked(sRGB,
- 0xF800,
- 0x07E0,
- 0x001F,
- 0x0,
- DataBuffer.TYPE_USHORT,
- false);
-
- BISpecifier[BufferedImage.TYPE_USHORT_555_RGB] =
- createPacked(sRGB,
- 0x7C00,
- 0x03E0,
- 0x001F,
- 0x0,
- DataBuffer.TYPE_USHORT,
- false);
-
- BISpecifier[BufferedImage.TYPE_BYTE_GRAY] =
- createGrayscale(8,
- DataBuffer.TYPE_BYTE,
- false);
-
- BISpecifier[BufferedImage.TYPE_USHORT_GRAY] =
- createGrayscale(16,
- DataBuffer.TYPE_USHORT,
- false);
-
- BISpecifier[BufferedImage.TYPE_BYTE_BINARY] =
- createGrayscale(1,
- DataBuffer.TYPE_BYTE,
- false);
-
- BufferedImage bi =
- new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_INDEXED);
- IndexColorModel icm = (IndexColorModel)bi.getColorModel();
- int mapSize = icm.getMapSize();
- byte[] redLUT = new byte[mapSize];
- byte[] greenLUT = new byte[mapSize];
- byte[] blueLUT = new byte[mapSize];
- byte[] alphaLUT = new byte[mapSize];
-
- icm.getReds(redLUT);
- icm.getGreens(greenLUT);
- icm.getBlues(blueLUT);
- icm.getAlphas(alphaLUT);
-
- BISpecifier[BufferedImage.TYPE_BYTE_INDEXED] =
- createIndexed(redLUT, greenLUT, blueLUT, alphaLUT,
- 8,
- DataBuffer.TYPE_BYTE);
}
/**
@@ -1011,7 +898,7 @@
ImageTypeSpecifier createFromBufferedImageType(int bufferedImageType) {
if (bufferedImageType >= BufferedImage.TYPE_INT_RGB &&
bufferedImageType <= BufferedImage.TYPE_BYTE_INDEXED) {
- return BISpecifier[bufferedImageType];
+ return getSpecifier(bufferedImageType);
} else if (bufferedImageType == BufferedImage.TYPE_CUSTOM) {
throw new IllegalArgumentException("Cannot create from TYPE_CUSTOM!");
} else {
@@ -1041,7 +928,7 @@
if (image instanceof BufferedImage) {
int bufferedImageType = ((BufferedImage)image).getType();
if (bufferedImageType != BufferedImage.TYPE_CUSTOM) {
- return BISpecifier[bufferedImageType];
+ return getSpecifier(bufferedImageType);
}
}
@@ -1225,4 +1112,130 @@
public int hashCode() {
return (9 * colorModel.hashCode()) + (14 * sampleModel.hashCode());
}
+
+ private static ImageTypeSpecifier getSpecifier(int type) {
+ if (BISpecifier[type] == null) {
+ BISpecifier[type] = createSpecifier(type);
+ }
+ return BISpecifier[type];
+ }
+
+ private static ImageTypeSpecifier createSpecifier(int type) {
+ switch(type) {
+ case BufferedImage.TYPE_INT_RGB:
+ return createPacked(sRGB,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff,
+ 0x0,
+ DataBuffer.TYPE_INT,
+ false);
+
+ case BufferedImage.TYPE_INT_ARGB:
+ return createPacked(sRGB,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff,
+ 0xff000000,
+ DataBuffer.TYPE_INT,
+ false);
+
+ case BufferedImage.TYPE_INT_ARGB_PRE:
+ return createPacked(sRGB,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff,
+ 0xff000000,
+ DataBuffer.TYPE_INT,
+ true);
+
+ case BufferedImage.TYPE_INT_BGR:
+ return createPacked(sRGB,
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0x0,
+ DataBuffer.TYPE_INT,
+ false);
+
+ case BufferedImage.TYPE_3BYTE_BGR:
+ return createInterleaved(sRGB,
+ new int[] { 2, 1, 0 },
+ DataBuffer.TYPE_BYTE,
+ false,
+ false);
+
+ case BufferedImage.TYPE_4BYTE_ABGR:
+ return createInterleaved(sRGB,
+ new int[] { 3, 2, 1, 0 },
+ DataBuffer.TYPE_BYTE,
+ true,
+ false);
+
+ case BufferedImage.TYPE_4BYTE_ABGR_PRE:
+ return createInterleaved(sRGB,
+ new int[] { 3, 2, 1, 0 },
+ DataBuffer.TYPE_BYTE,
+ true,
+ true);
+
+ case BufferedImage.TYPE_USHORT_565_RGB:
+ return createPacked(sRGB,
+ 0xF800,
+ 0x07E0,
+ 0x001F,
+ 0x0,
+ DataBuffer.TYPE_USHORT,
+ false);
+
+ case BufferedImage.TYPE_USHORT_555_RGB:
+ return createPacked(sRGB,
+ 0x7C00,
+ 0x03E0,
+ 0x001F,
+ 0x0,
+ DataBuffer.TYPE_USHORT,
+ false);
+
+ case BufferedImage.TYPE_BYTE_GRAY:
+ return createGrayscale(8,
+ DataBuffer.TYPE_BYTE,
+ false);
+
+ case BufferedImage.TYPE_USHORT_GRAY:
+ return createGrayscale(16,
+ DataBuffer.TYPE_USHORT,
+ false);
+
+ case BufferedImage.TYPE_BYTE_BINARY:
+ return createGrayscale(1,
+ DataBuffer.TYPE_BYTE,
+ false);
+
+ case BufferedImage.TYPE_BYTE_INDEXED:
+ {
+
+ BufferedImage bi =
+ new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_INDEXED);
+ IndexColorModel icm = (IndexColorModel)bi.getColorModel();
+ int mapSize = icm.getMapSize();
+ byte[] redLUT = new byte[mapSize];
+ byte[] greenLUT = new byte[mapSize];
+ byte[] blueLUT = new byte[mapSize];
+ byte[] alphaLUT = new byte[mapSize];
+
+ icm.getReds(redLUT);
+ icm.getGreens(greenLUT);
+ icm.getBlues(blueLUT);
+ icm.getAlphas(alphaLUT);
+
+ return createIndexed(redLUT, greenLUT, blueLUT, alphaLUT,
+ 8,
+ DataBuffer.TYPE_BYTE);
+ }
+ default:
+ throw new IllegalArgumentException("Invalid BufferedImage type!");
+ }
+ }
+
}