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 12:24:35 UTC

svn commit: r814563 - in /incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox: pdfviewer/PageDrawer.java pdmodel/graphics/color/PDColorState.java

Author: jukka
Date: Mon Sep 14 10:24:35 2009
New Revision: 814563

URL: http://svn.apache.org/viewvc?rev=814563&view=rev
Log:
PDFBOX-511: JVM crash in PDColorSpaceInstance.createColor()

Refactoring to reduce the number createColor() calls:

Cache the Java AWT color value

Modified:
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=814563&r1=814562&r2=814563&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java Mon Sep 14 10:24:35 2009
@@ -132,12 +132,12 @@
         {
             if( this.getGraphicsState().getTextState().getRenderingMode() == PDTextState.RENDERING_MODE_FILL_TEXT )
             {
-                graphics.setColor( this.getGraphicsState().getNonStrokingColor().createColor() );
+                graphics.setColor( this.getGraphicsState().getNonStrokingColor().getJavaColor() );
             }
             else if( this.getGraphicsState().getTextState().getRenderingMode() 
                         == PDTextState.RENDERING_MODE_STROKE_TEXT )
             {
-                graphics.setColor( this.getGraphicsState().getStrokingColor().createColor() );
+                graphics.setColor( this.getGraphicsState().getStrokingColor().getJavaColor() );
             }
             else
             {
@@ -145,7 +145,7 @@
                 logger().warn("Unsupported RenderingMode "+this.getGraphicsState().getTextState().getRenderingMode()
                             +" in PageDrawer.processTextPosition()"
                             + "Using RenderingMode "+PDTextState.RENDERING_MODE_FILL_TEXT+" instead");
-                graphics.setColor( this.getGraphicsState().getNonStrokingColor().createColor() );
+                graphics.setColor( this.getGraphicsState().getNonStrokingColor().getJavaColor() );
             }
             PDFont font = text.getFont();
 
@@ -247,7 +247,7 @@
      */
     public void fillPath(int windingRule) throws IOException
     {
-        graphics.setColor( getGraphicsState().getNonStrokingColor().createColor() );
+        graphics.setColor( getGraphicsState().getNonStrokingColor().getJavaColor() );
         getLinePath().setWindingRule(windingRule);
         graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF );
         graphics.setClip(getGraphicsState().getCurrentClippingPath());
@@ -274,7 +274,7 @@
      */
     public void strokePath() throws IOException
     {
-        graphics.setColor( getGraphicsState().getStrokingColor().createColor() ); 
+        graphics.setColor( getGraphicsState().getStrokingColor().getJavaColor() ); 
         graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF );
         graphics.setClip(getGraphicsState().getCurrentClippingPath());
         GeneralPath path = getLinePath();

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java?rev=814563&r1=814562&r2=814563&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java Mon Sep 14 10:24:35 2009
@@ -67,6 +67,14 @@
     private COSArray colorSpaceValue = new COSArray();
 
     /**
+     * Cached Java AWT color based on the current color space and value.
+     * The value is cleared whenever the color space or value is set.
+     *
+     * @see #getJavaColor()
+     */
+    private Color color = null;
+
+    /**
      * Default constructor.
      *
      */
@@ -88,11 +96,24 @@
     }
 
     /**
+     * Returns the Java AWT color based on the current color space and value.
+     *
+     * @return current Java AWT color
+     * @throws IOException if the current color can not be created
+     */
+    public Color getJavaColor() throws IOException {
+        if (color == null) {
+            color = createColor();
+        }
+        return color;
+    }
+
+    /**
      * Create the current color from the colorspace and values.
      * @return The current awt color.
      * @throws IOException If there is an error creating the color.
      */
-    public Color createColor() throws IOException
+    private Color createColor() throws IOException
     {
         float[] components = colorSpaceValue.toFloatArray();
         try
@@ -178,6 +199,8 @@
     public void setColorSpace(PDColorSpace value)
     {
         colorSpace = value;
+        // Clear color cache
+        color = null;
     }
 
     /**
@@ -208,5 +231,7 @@
     public void setColorSpaceValue(float[] value)
     {
         colorSpaceValue.setFloatArray( value );
+        // Clear color cache
+        color = null;
     }
 }