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/12/05 23:11:28 UTC

svn commit: r1643446 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: contentstream/PDFStreamEngine.java rendering/PageDrawer.java

Author: jahewson
Date: Fri Dec  5 22:11:27 2014
New Revision: 1643446

URL: http://svn.apache.org/r1643446
Log:
PDFBOX-2423: Clear soft mask in graphics state to avoid self-application

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java?rev=1643446&r1=1643445&r2=1643446&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java Fri Dec  5 22:11:27 2014
@@ -208,10 +208,21 @@ public class PDFStreamEngine
     }
 
     /**
+     * Processes a soft mask transparency group stream.
+     */
+    protected void processSoftMask(PDFormXObject group) throws IOException
+    {
+        // clear the current soft mask (this mask) to avoid recursion
+        saveGraphicsState();
+        getGraphicsState().setSoftMask(null);
+        processTransparencyGroup(group);
+        restoreGraphicsState();
+    }
+
+    /**
      * Processes a transparency group stream.
      */
-    protected void processTransparencyGroup(PDFormXObject group)
-            throws IOException
+    protected void processTransparencyGroup(PDFormXObject group) throws IOException
     {
         if (currentPage == null)
         {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1643446&r1=1643445&r2=1643446&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Fri Dec  5 22:11:27 2014
@@ -447,7 +447,7 @@ public final class PageDrawer extends PD
      */
     private Raster createSoftMaskRaster(PDSoftMask softMask) throws IOException
     {
-        TransparencyGroup transparencyGroup = new TransparencyGroup(softMask.getGroup());
+        TransparencyGroup transparencyGroup = new TransparencyGroup(softMask.getGroup(), true);
         COSName subtype = softMask.getSubType();
         if (COSName.ALPHA.equals(subtype))
         {
@@ -782,7 +782,7 @@ public final class PageDrawer extends PD
     @Override
     public void showTransparencyGroup(PDFormXObject form) throws IOException
     {
-        TransparencyGroup group = new TransparencyGroup(form);
+        TransparencyGroup group = new TransparencyGroup(form, false);
 
         graphics.setComposite(getGraphicsState().getNonStrokingJavaComposite());
         setClip();
@@ -831,7 +831,7 @@ public final class PageDrawer extends PD
         /**
          * Creates a buffered image for a transparency group result.
          */
-        private TransparencyGroup(PDFormXObject form) throws IOException
+        private TransparencyGroup(PDFormXObject form, boolean isSoftMask) throws IOException
         {
             Graphics2D g2dOriginal = graphics;
             Area lastClipOriginal = lastClip;
@@ -878,7 +878,14 @@ public final class PageDrawer extends PD
             graphics = g;
             try
             {
-                processTransparencyGroup(form);
+                if (isSoftMask)
+                {
+                    processSoftMask(form);
+                }
+                else
+                {
+                    processTransparencyGroup(form);
+                }
             }
             finally 
             {