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)
         {