You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/08/31 03:10:57 UTC

svn commit: r1621550 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java

Author: jahewson
Date: Sun Aug 31 01:10:57 2014
New Revision: 1621550

URL: http://svn.apache.org/r1621550
Log:
PDFBOX-2184: Attempt to workaround JVM bug

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java?rev=1621550&r1=1621549&r2=1621550&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java Sun Aug 31 01:10:57 2014
@@ -52,18 +52,12 @@ public final class PDDeviceCMYK extends 
         }
     }
 
-    private final ICC_ColorSpace awtColorSpace;
     private static final PDColor INITIAL_COLOR = new PDColor(new float[] { 0, 0, 0, 1 });
+    private final ICC_ColorSpace awtColorSpace;
 
     private PDDeviceCMYK() throws IOException
     {
-        awtColorSpace = getAWTColorSpace();
-    }
-
-    // loads the ICC color profile for CMYK
-    private static ICC_ColorSpace getAWTColorSpace() throws IOException
-    {
-        ICC_ColorSpace colorSpace;
+        // loads the ICC color profile for CMYK
         InputStream profile = null;
         try
         {
@@ -76,13 +70,17 @@ public final class PDDeviceCMYK extends 
                 throw new IOException("Default CMYK color profile could not be loaded");
             }
             ICC_Profile iccProfile = ICC_Profile.getInstance(profile);
-            colorSpace = new ICC_ColorSpace(iccProfile);
+            awtColorSpace = new ICC_ColorSpace(iccProfile);
+
+            // there is a JVM bug which results in a CMMException which appears to be a race
+            // condition caused by lazy initialization of the color transform, so we perform
+            // an initial color conversion while we're still in a static context, see PDFBOX-2184
+            awtColorSpace.toRGB(new float[] { 0, 0, 0, 0 });
         }
         finally
         {
             IOUtils.closeQuietly(profile);
         }
-        return colorSpace;
     }
 
     @Override