Author: lehmi
Date: Sat Nov 10 17:48:07 2012
New Revision: 1407859

URL: http://svn.apache.org/viewvc?rev=1407859&view=rev
Log:
PDFBOX-1443: fixed handling of clipping winding rule as proposed by Dave Smith

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipEvenOddRule.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipNonZeroRule.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/EndPath.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=1407859&r1=1407858&r2=1407859&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java 
Sat Nov 10 17:48:07 2012
@@ -73,6 +73,12 @@ public class PageDrawer extends PDFStrea
     private static final Log LOG = LogFactory.getLog(PageDrawer.class);
 
     private Graphics2D graphics;
+    
+    /**
+     * clipping winding rule used for the clipping path.
+     */
+    private int clippingWindingRule = -1;
+
     /**
      * Size of the page.
      */
@@ -406,27 +412,52 @@ public class PageDrawer extends PDFStrea
      *
      * @param windingRule The winding rule this path will use.
      * 
+     * @deprecated use {@link #setClippingWindingRule(int)} instead
+     * 
      */
     public void setClippingPath(int windingRule)
     {
-        PDGraphicsState graphicsState = getGraphicsState();
-        GeneralPath clippingPath = (GeneralPath)getLinePath().clone();
-        clippingPath.setWindingRule(windingRule);
-        // If there is already set a clipping path, we have to intersect the 
new with the existing one
-        if (graphicsState.getCurrentClippingPath() != null) 
-        {
-            Area currentArea = new 
Area(getGraphicsState().getCurrentClippingPath());
-            Area newArea = new Area(clippingPath);
-            currentArea.intersect(newArea);
-            graphicsState.setCurrentClippingPath(currentArea);
-        }
-        else 
+        setClippingWindingRule(windingRule);
+    }
+    
+    /**
+     * Set the clipping winding rule.
+     *
+     * @param windingRule The winding rule which will be used for clipping.
+     * 
+     */
+    public void setClippingWindingRule(int windingRule)
+    {
+        clippingWindingRule = windingRule;
+    }
+
+    /**
+     * Set the clipping Path.
+     *
+     */
+    public void endPath()
+    {
+        if (clippingWindingRule > -1)
         {
-            graphicsState.setCurrentClippingPath(clippingPath);
+            PDGraphicsState graphicsState = getGraphicsState();
+            GeneralPath clippingPath = (GeneralPath)getLinePath().clone();
+            clippingPath.setWindingRule(clippingWindingRule);
+            // If there is already set a clipping path, we have to intersect 
the new with the existing one
+            if (graphicsState.getCurrentClippingPath() != null) 
+            {
+                Area currentArea = new 
Area(getGraphicsState().getCurrentClippingPath());
+                Area newArea = new Area(clippingPath);
+                currentArea.intersect(newArea);
+                graphicsState.setCurrentClippingPath(currentArea);
+            }
+            else 
+            {
+                graphicsState.setCurrentClippingPath(clippingPath);
+            }
+            clippingWindingRule = -1;
         }
         getLinePath().reset();
     }
-    
     /**
      * Draw the AWT image. Called by Invoke.
      * Moved into PageDrawer so that Invoke doesn't have to reach in here for 
Graphics as that breaks extensibility.

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipEvenOddRule.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipEvenOddRule.java?rev=1407859&r1=1407858&r2=1407859&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipEvenOddRule.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipEvenOddRule.java
 Sat Nov 10 17:48:07 2012
@@ -39,7 +39,7 @@ public class ClipEvenOddRule extends Ope
     /**
      * Log instance.
      */
-    private static final Log log = LogFactory.getLog(ClipEvenOddRule.class);
+    private static final Log LOG = LogFactory.getLog(ClipEvenOddRule.class);
 
     /**
      * process : W* : set clipping path using even odd rule.
@@ -54,11 +54,11 @@ public class ClipEvenOddRule extends Ope
         try 
         {
             PageDrawer drawer = (PageDrawer)context;
-            drawer.setClippingPath(GeneralPath.WIND_EVEN_ODD);
+            drawer.setClippingWindingRule(GeneralPath.WIND_EVEN_ODD);
         } 
         catch (Exception e) 
         {
-            log.warn(e, e);
+            LOG.warn(e, e);
         }
     }
 }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipNonZeroRule.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipNonZeroRule.java?rev=1407859&r1=1407858&r2=1407859&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipNonZeroRule.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/ClipNonZeroRule.java
 Sat Nov 10 17:48:07 2012
@@ -39,7 +39,7 @@ public class ClipNonZeroRule extends Ope
     /**
      * Log instance.
      */
-    private static final Log log = LogFactory.getLog(ClipNonZeroRule.class);
+    private static final Log LOG = LogFactory.getLog(ClipNonZeroRule.class);
 
     /**
      * process : W : Set the clipping path using non zero winding rule.
@@ -54,11 +54,11 @@ public class ClipNonZeroRule extends Ope
         try 
         {
             PageDrawer drawer = (PageDrawer)context;
-            drawer.setClippingPath(GeneralPath.WIND_NON_ZERO);
+            drawer.setClippingWindingRule(GeneralPath.WIND_NON_ZERO);
         } 
         catch (Exception e) 
         {
-            log.warn(e, e);
+            LOG.warn(e, e);
         }
     }
 }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/EndPath.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/EndPath.java?rev=1407859&r1=1407858&r2=1407859&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/EndPath.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/EndPath.java
 Sat Nov 10 17:48:07 2012
@@ -41,6 +41,6 @@ public class EndPath extends OperatorPro
     public void process(PDFOperator operator, List<COSBase> arguments)
     {
         PageDrawer drawer = (PageDrawer)context;
-        drawer.getLinePath().reset();
+        drawer.endPath();
     }
 }


Reply via email to