You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ju...@apache.org on 2009/09/14 11:14:35 UTC
svn commit: r814536 -
/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java
Author: jukka
Date: Mon Sep 14 09:14:34 2009
New Revision: 814536
URL: http://svn.apache.org/viewvc?rev=814536&view=rev
Log:
PDFBOX-511: JVM crash in PDColorSpaceInstance.createColor()
Add an option to explicitly override all colors in ICC color spaces.
Modified:
incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java
Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java?rev=814536&r1=814535&r2=814536&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java Mon Sep 14 09:14:34 2009
@@ -18,6 +18,7 @@
import java.awt.Color;
import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
import java.io.IOException;
import org.apache.pdfbox.exceptions.LoggingObject;
@@ -31,6 +32,37 @@
*/
public class PDColorSpaceInstance extends LoggingObject implements Cloneable
{
+
+ /**
+ * The default color that can be set to replace all colors in
+ * {@link ICC_ColorSpace ICC color spaces}.
+ *
+ * @see #setIccOverrideColor(Color)
+ */
+ private static volatile Color iccOverrideColor =
+ Color.getColor("org.apache.pdfbox.ICC_override_color");
+
+ /**
+ * Sets the default color to replace all colors in
+ * {@link ICC_ColorSpace ICC color spaces}. This will work around
+ * a potential JVM crash caused by broken native ICC color manipulation
+ * code in the Sun class libraries.
+ * <p>
+ * The default override can be specified by setting the color code in
+ * <code>org.apache.pdfbox.ICC_override_color</code> system property
+ * (see {@link Color#getColor(String)}. If this system property is not
+ * specified, then the override is not enabled unless this method is
+ * explicitly called.
+ *
+ * @param color ICC override color,
+ * or <code>null</code> to disable the override
+ * @see <a href="https://issues.apache.org/jira/browse/PDFBOX-511">PDFBOX-511</a>
+ * @since Apache PDFBox 0.8.1
+ */
+ public static void setIccOverrideColor(Color color) {
+ iccOverrideColor = color;
+ }
+
private PDColorSpace colorSpace = new PDDeviceGray();
private COSArray colorSpaceValue = new COSArray();
@@ -62,7 +94,6 @@
*/
public Color createColor() throws IOException
{
- Color retval = null;
float[] components = colorSpaceValue.toFloatArray();
try
{
@@ -72,22 +103,29 @@
//the new Color doesn't maintain exactly the same values
//I think some color conversion needs to take place first
//for now we will just make rgb a special case.
- retval = new Color( components[0], components[1], components[2] );
+ return new Color( components[0], components[1], components[2] );
}
else
{
+ Color override = iccOverrideColor;
ColorSpace cs = colorSpace.createColorSpace();
if (colorSpace.getName().equals(PDSeparation.NAME) && components.length == 1)
{
//Use that component as a single-integer RGB value
- retval = new Color((int)components[0]);
+ return new Color((int)components[0]);
+ }
+ else if (cs instanceof ICC_ColorSpace && override != null)
+ {
+ logger().warn(
+ "Using an ICC override color to avoid a potential"
+ + " JVM crash (see PDFBOX-511)");
+ return override;
}
else
{
- retval = new Color( cs, components, 1f );
+ return new Color( cs, components, 1f );
}
}
- return retval;
}
catch (java.lang.IllegalArgumentException exception)
{