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 2016/12/13 19:25:23 UTC

svn commit: r1774081 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state: PDExtendedGraphicsState.java PDSoftMask.java

Author: tilman
Date: Tue Dec 13 19:25:23 2016
New Revision: 1774081

URL: http://svn.apache.org/viewvc?rev=1774081&view=rev
Log:
PDFBOX-3000: save initial CTM in softmask so that CTM at the moment of ExtGState activation is remembered

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDExtendedGraphicsState.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDExtendedGraphicsState.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDExtendedGraphicsState.java?rev=1774081&r1=1774080&r2=1774081&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDExtendedGraphicsState.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDExtendedGraphicsState.java Tue Dec 13 19:25:23 2016
@@ -143,7 +143,14 @@ public class PDExtendedGraphicsState imp
             }
             else if( key.equals( COSName.SMASK ) ) 
             {
-                gs.setSoftMask(getSoftMask());
+                PDSoftMask softmask = getSoftMask();
+                if (softmask != null)
+                {
+                    // Softmask must know the CTM at the time the ExtGState is activated. Read
+                    // https://bugs.ghostscript.com/show_bug.cgi?id=691157#c7 for a good explanation.
+                    softmask.setInitialTransformationMatrix(gs.getCurrentTransformationMatrix().clone());
+                }
+                gs.setSoftMask(softmask);
             }
             else if( key.equals( COSName.BM ) ) 
             {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java?rev=1774081&r1=1774080&r2=1774081&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java Tue Dec 13 19:25:23 2016
@@ -28,6 +28,7 @@ import org.apache.pdfbox.pdmodel.common.
 import org.apache.pdfbox.pdmodel.common.function.PDFunction;
 import org.apache.pdfbox.pdmodel.graphics.PDXObject;
 import org.apache.pdfbox.pdmodel.graphics.form.PDTransparencyGroup;
+import org.apache.pdfbox.util.Matrix;
 
 /**
  * Soft mask.
@@ -75,6 +76,11 @@ public final class PDSoftMask implements
     private PDFunction transferFunction = null;
 
     /**
+     * To allow a soft mask to know the CTM at the time of activation of the ExtGState.
+     */
+    private Matrix ctm;
+
+    /**
      * Creates a new soft mask.
      *
      * @param dictionary The soft mask dictionary.
@@ -153,4 +159,24 @@ public final class PDSoftMask implements
         }
         return transferFunction;
     }
+
+    /**
+     * Set the CTM that is valid at the time the ExtGState was activated.
+     *
+     * @param ctm
+     */
+    void setInitialTransformationMatrix(Matrix ctm)
+    {
+        this.ctm = ctm;
+    }
+
+    /**
+     * Returns the CTM at the time the ExtGState was activated.
+     *
+     * @return
+     */
+    public Matrix getInitialTransformationMatrix()
+    {
+        return ctm;
+    }
 }