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

svn commit: r1614959 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java

Author: tilman
Date: Thu Jul 31 18:57:46 2014
New Revision: 1614959

URL: http://svn.apache.org/r1614959
Log:
PDFBOX-1915: implemented BBox clipping by Shaola Ren as part of GSoC2014

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.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=1614959&r1=1614958&r2=1614959&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 Thu Jul 31 18:57:46 2014
@@ -31,6 +31,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBoolean;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.common.function.PDFunction;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.util.Matrix;
@@ -62,6 +63,8 @@ public class AxialShadingContext impleme
     private double y1y0;
     private float d1d0;
     private double denom;
+    private final PDRectangle bboxRect;
+    private float[] bboxTab = new float[4];
     
     private final double axialLength;
     private final int[] colorTable;
@@ -79,6 +82,21 @@ public class AxialShadingContext impleme
     {
         this.shading = shading;
         coords = this.shading.getCoords().toFloatArray();
+        
+        bboxRect = shading.getBBox();
+        if (bboxRect != null)
+        {
+            bboxTab[0] = bboxRect.getLowerLeftX();
+            bboxTab[1] = bboxRect.getLowerLeftY();
+            bboxTab[2] = bboxRect.getUpperRightX();
+            bboxTab[3] = bboxRect.getUpperRightY();
+            if (ctm != null)
+            {
+                // transform the coords using the given matrix
+                ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
+            }
+            xform.transform(bboxTab, 0, bboxTab, 0, 2);
+        }        
 
         if (ctm != null)
         {
@@ -214,11 +232,29 @@ public class AxialShadingContext impleme
         int[] data = new int[w * h * 4];
         for (int j = 0; j < h; j++)
         {
+            double currentY = y + j;
+            if (bboxRect != null)
+            {
+                if (currentY < bboxTab[3] || currentY > bboxTab[1])
+                {
+                    continue;
+                }
+            }
+            
             for (int i = 0; i < w; i++)
             {
+                double currentX = x + i;
+                if (bboxRect != null)
+                {
+                    if (currentX < bboxTab[0] || currentX > bboxTab[2])
+                    {
+                        continue;
+                    }
+                }
+                
                 useBackground = false;
-                double inputValue = x1x0 * (x + i - coords[0]);
-                inputValue += y1y0 * (y + j - coords[1]);
+                double inputValue = x1x0 * (currentX - coords[0]);
+                inputValue += y1y0 * (currentY - coords[1]);
                 // TODO this happens if start == end, see PDFBOX-1442
                 if (denom == 0)
                 {