6631559: Registration of ImageIO plugins should not cause loading of jpeg.dlli and cmm.dll
Reviewed-by: igor, prr
This commit is contained in:
parent
55076b2558
commit
2a2bbe2879
@ -1003,7 +1003,7 @@ class JFIFMarkerSegment extends MarkerSegment {
|
||||
3,
|
||||
new int [] {0, 1, 2},
|
||||
null);
|
||||
ColorModel cm = new ComponentColorModel(JPEG.sRGB,
|
||||
ColorModel cm = new ComponentColorModel(JPEG.JCS.sRGB,
|
||||
false,
|
||||
false,
|
||||
ColorModel.OPAQUE,
|
||||
|
@ -208,15 +208,24 @@ public class JPEG {
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -228,31 +228,31 @@ public class JPEGImageReader extends ImageReader {
|
||||
(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 @@ public class JPEGImageReader extends ImageReader {
|
||||
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 @@ public class JPEGImageReader extends ImageReader {
|
||||
}
|
||||
|
||||
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 @@ public class JPEGImageReader extends ImageReader {
|
||||
(!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 @@ public class JPEGImageReader extends ImageReader {
|
||||
}
|
||||
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");
|
||||
}
|
||||
|
@ -39,8 +39,6 @@ public class JPEGImageReaderSpi extends ImageReaderSpi {
|
||||
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 class JPEGImageReaderSpi extends ImageReaderSpi {
|
||||
);
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
|
@ -812,13 +812,13 @@ public class JPEGImageWriter extends ImageWriter {
|
||||
}
|
||||
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 @@ public class JPEGImageWriter extends ImageWriter {
|
||||
}
|
||||
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 @@ public class JPEGImageWriter extends ImageWriter {
|
||||
}
|
||||
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 @@ public class JPEGImageWriter extends ImageWriter {
|
||||
}
|
||||
break;
|
||||
case ColorSpace.TYPE_3CLR:
|
||||
if (cs == JPEG.YCC) {
|
||||
if (cs == JPEG.JCS.YCC) {
|
||||
if (alpha) {
|
||||
retval = JPEG.JCS_YCCA;
|
||||
} else {
|
||||
|
@ -42,8 +42,6 @@ public class JPEGImageWriterSpi extends ImageWriterSpi {
|
||||
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 @@ public class JPEGImageWriterSpi extends ImageWriterSpi {
|
||||
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;
|
||||
}
|
||||
|
@ -490,7 +490,7 @@ public class JPEGMetadata extends IIOMetadata implements Cloneable {
|
||||
}
|
||||
break;
|
||||
case ColorSpace.TYPE_3CLR:
|
||||
if (cs == JPEG.YCC) {
|
||||
if (cs == JPEG.JCS.YCC) {
|
||||
wantJFIF = false;
|
||||
componentIDs[0] = (byte) 'Y';
|
||||
componentIDs[1] = (byte) 'C';
|
||||
|
@ -67,126 +67,13 @@ public class ImageTypeSpecifier {
|
||||
* <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 @@ public class ImageTypeSpecifier {
|
||||
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 @@ public class ImageTypeSpecifier {
|
||||
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 class ImageTypeSpecifier {
|
||||
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!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user