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 2015/07/14 23:54:15 UTC

svn commit: r1691093 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading: AxialShadingContext.java AxialShadingPaint.java RadialShadingContext.java RadialShadingPaint.java

Author: jahewson
Date: Tue Jul 14 21:54:14 2015
New Revision: 1691093

URL: http://svn.apache.org/r1691093
Log:
PDFBOX-2881: Calculate the number of steps using the device bounds

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java?rev=1691093&r1=1691092&r2=1691093&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java Tue Jul 14 21:54:14 2015
@@ -17,9 +17,9 @@
 package org.apache.pdfbox.pdmodel.graphics.shading;
 
 import java.awt.PaintContext;
+import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.NoninvertibleTransformException;
-import java.awt.geom.Point2D;
 import java.awt.image.ColorModel;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
@@ -50,7 +50,7 @@ public class AxialShadingContext extends
     private final double x1x0;
     private final double y1y0;
     private final float d1d0;
-    private double denom;
+    private final double denom;
 
     private final int factor;
     private final int[] colorTable;
@@ -64,10 +64,11 @@ public class AxialShadingContext extends
      * @param colorModel the color model to be used
      * @param xform transformation for user to device space
      * @param matrix the pattern matrix concatenated with that of the parent content stream
-     * @throws java.io.IOException if there is an error getting the color space or doing color conversion.
+     * @param deviceBounds the bounds of the area to paint, in device units
+     * @throws IOException if there is an error getting the color space or doing color conversion.
      */
     public AxialShadingContext(PDShadingType2 shading, ColorModel colorModel, AffineTransform xform,
-                               Matrix matrix) throws IOException
+                               Matrix matrix, Rectangle deviceBounds) throws IOException
     {
         super(shading, colorModel, xform, matrix);
         this.axialShadingType = shading;
@@ -101,7 +102,6 @@ public class AxialShadingContext extends
         y1y0 = coords[3] - coords[1];
         d1d0 = domain[1] - domain[0];
         denom = Math.pow(x1x0, 2) + Math.pow(y1y0, 2);
-        double longestDistance = Math.sqrt(denom);
 
         try
         {
@@ -115,12 +115,11 @@ public class AxialShadingContext extends
             LOG.error(ex, ex);
         }
 
-        // transform the distance to actual pixel space
-        // use transform, because xform.getScaleX() does not return correct scaling on 90° rotated matrix
-        Point2D point = new Point2D.Double(longestDistance, longestDistance);
-        matrix.transform(point);
-        xform.transform(point, point);
-        factor = (int) Math.max(Math.abs(point.getX()), Math.abs(point.getY()));
+        // get the number of steps
+        factor = (int) Math.max(Math.abs(deviceBounds.getWidth()),
+                                Math.abs(deviceBounds.getHeight()));
+        
+        // build the color table for the given number of steps
         colorTable = calcColorTable();
     }
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java?rev=1691093&r1=1691092&r2=1691093&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java Tue Jul 14 21:54:14 2015
@@ -64,7 +64,7 @@ public class AxialShadingPaint implement
     {
         try
         {
-            return new AxialShadingContext(shading, cm, xform, matrix);
+            return new AxialShadingContext(shading, cm, xform, matrix, deviceBounds);
         }
         catch (IOException e)
         {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java?rev=1691093&r1=1691092&r2=1691093&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java Tue Jul 14 21:54:14 2015
@@ -17,9 +17,9 @@
 package org.apache.pdfbox.pdmodel.graphics.shading;
 
 import java.awt.PaintContext;
+import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.NoninvertibleTransformException;
-import java.awt.geom.Point2D;
 import java.awt.image.ColorModel;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
@@ -50,8 +50,6 @@ public class RadialShadingContext extend
     private final double x1x0;
     private final double y1y0;
     private final double r1r0;
-    private final double x1x0pow2;
-    private final double y1y0pow2;
     private final double r0pow2;
     private final float d1d0;
     private final double denom;
@@ -68,10 +66,11 @@ public class RadialShadingContext extend
      * @param colorModel the color model to be used
      * @param xform transformation for user to device space
      * @param matrix the pattern matrix concatenated with that of the parent content stream
-     * @throws java.io.IOException if there is an error getting the color space or doing color conversion.
+     * @param deviceBounds the bounds of the area to paint, in device units
+     * @throws IOException if there is an error getting the color space or doing color conversion.
      */
     public RadialShadingContext(PDShadingType3 shading, ColorModel colorModel,
-                                AffineTransform xform, Matrix matrix)
+                                AffineTransform xform, Matrix matrix, Rectangle deviceBounds)
                                 throws IOException
     {
         super(shading, colorModel, xform, matrix);
@@ -106,12 +105,9 @@ public class RadialShadingContext extend
         x1x0 = coords[3] - coords[0];
         y1y0 = coords[4] - coords[1];
         r1r0 = coords[5] - coords[2];
-        x1x0pow2 = Math.pow(x1x0, 2);
-        y1y0pow2 = Math.pow(y1y0, 2);
         r0pow2 = Math.pow(coords[2], 2);
-        denom = x1x0pow2 + y1y0pow2 - Math.pow(r1r0, 2);
+        denom = Math.pow(x1x0, 2) + Math.pow(y1y0, 2) - Math.pow(r1r0, 2);
         d1d0 = domain[1] - domain[0];
-        double longestDistance = getLongestDistance();
 
         try
         {
@@ -125,38 +121,12 @@ public class RadialShadingContext extend
             LOG.error(ex, ex);
         }
 
-        // transform the distance to actual pixel space
-        // use transform, because xform.getScaleX() does not return correct scaling on 90° rotated matrix
-        Point2D point = new Point2D.Double(longestDistance, longestDistance);
-        matrix.transform(point);
-        xform.transform(point, point);
-        factor = (int) Math.max(Math.abs(point.getX()), Math.abs(point.getY()));
-        colorTable = calcColorTable();
-    }
+        // get the number of steps
+        factor = (int) Math.max(Math.abs(deviceBounds.getWidth()),
+                Math.abs(deviceBounds.getHeight()));
 
-    // get the longest distance of two points which are located on these two circles
-    private double getLongestDistance()
-    {
-        double centerToCenter = Math.sqrt(x1x0pow2 + y1y0pow2);
-        double rmin, rmax;
-        if (coords[2] < coords[5])
-        {
-            rmin = coords[2];
-            rmax = coords[5];
-        }
-        else
-        {
-            rmin = coords[5];
-            rmax = coords[2];
-        }
-        if (centerToCenter + rmin <= rmax)
-        {
-            return 2 * rmax;
-        }
-        else
-        {
-            return rmin + centerToCenter + coords[5];
-        }
+        // build the color table for the given number of steps
+        colorTable = calcColorTable();
     }
 
     /**

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java?rev=1691093&r1=1691092&r2=1691093&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java Tue Jul 14 21:54:14 2015
@@ -65,7 +65,7 @@ public class RadialShadingPaint implemen
     {
         try
         {
-            return new RadialShadingContext(shading, cm, xform, matrix);
+            return new RadialShadingContext(shading, cm, xform, matrix, deviceBounds);
         }
         catch (IOException e)
         {