You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2010/06/23 20:16:16 UTC

svn commit: r957289 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer: BeginInlineImage.java Invoke.java

Author: lehmi
Date: Wed Jun 23 18:16:15 2010
New Revision: 957289

URL: http://svn.apache.org/viewvc?rev=957289&view=rev
Log:
PDFBOX-758: fixed rotation algo if the rotation angle isn't a multiple of 90 degrees.

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java?rev=957289&r1=957288&r2=957289&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java Wed Jun 23 18:16:15 2010
@@ -79,15 +79,21 @@ public class BeginInlineImage extends Op
         ctmAT.scale(1f/imageWidth, 1f/imageHeight);
         Matrix rotationMatrix = new Matrix();
         rotationMatrix.setFromAffineTransform( ctmAT );
+        // calculate the inverse rotation angle
+        // scaleX = m00 = cos
+        // shearX = m01 = -sin
+        // tan = sin/cos
+        double angle = Math.atan(ctmAT.getShearX()/ctmAT.getScaleX());
+        Matrix translationMatrix = null;
         if (pageRotation == 0 || pageRotation == 180) 
         {
-            rotationMatrix.setValue(2,1,(float)pageHeight-ctm.getYPosition()-ctm.getYScale());
+            translationMatrix = Matrix.getTranslatingInstance((float)(Math.sin(angle)*ctm.getXScale()), (float)(pageHeight-2*ctm.getYPosition()-Math.cos(angle)*ctm.getYScale())); 
         }
         else if (pageRotation == 90 || pageRotation == 270) 
         {
-            rotationMatrix.setValue(2,0,(float)ctm.getXPosition()-ctm.getYScale());
-            rotationMatrix.setValue(2,1,(float)pageHeight-ctm.getYPosition());
+            translationMatrix = Matrix.getTranslatingInstance((float)(Math.sin(angle)*ctm.getYScale()), (float)(pageHeight-2*ctm.getYPosition())); 
         }
+        rotationMatrix = rotationMatrix.multiply(translationMatrix);
         rotationMatrix.setValue(0, 1, (-1)*rotationMatrix.getValue(0, 1));
         rotationMatrix.setValue(1, 0, (-1)*rotationMatrix.getValue(1, 0));
         AffineTransform at = new AffineTransform(

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java?rev=957289&r1=957288&r2=957289&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java Wed Jun 23 18:16:15 2010
@@ -81,7 +81,7 @@ public class Invoke extends OperatorProc
                 int imageHeight = awtImage.getHeight();
                 double pageHeight = drawer.getPageSize().getHeight();
 
-                log.info("imageWidth: " + imageWidth + "\t\timageHeight: " + imageHeight);
+                log.debug("imageWidth: " + imageWidth + "\t\timageHeight: " + imageHeight);
         
                 Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
                 int pageRotation = page.findRotation();
@@ -90,21 +90,27 @@ public class Invoke extends OperatorProc
                 ctmAT.scale(1f/imageWidth, 1f/imageHeight);
                 Matrix rotationMatrix = new Matrix();
                 rotationMatrix.setFromAffineTransform( ctmAT );
+                // calculate the inverse rotation angle
+                // scaleX = m00 = cos
+                // shearX = m01 = -sin
+                // tan = sin/cos
+                double angle = Math.atan(ctmAT.getShearX()/ctmAT.getScaleX());
+                Matrix translationMatrix = null;
                 if (pageRotation == 0 || pageRotation == 180) 
                 {
-                    rotationMatrix.setValue(2,1,(float)pageHeight-ctm.getYPosition()-ctm.getYScale());
+                    translationMatrix = Matrix.getTranslatingInstance((float)(Math.sin(angle)*ctm.getXScale()), (float)(pageHeight-2*ctm.getYPosition()-Math.cos(angle)*ctm.getYScale())); 
                 }
                 else if (pageRotation == 90 || pageRotation == 270) 
                 {
-                    rotationMatrix.setValue(2,0,(float)ctm.getXPosition()-ctm.getYScale());
-                    rotationMatrix.setValue(2,1,(float)pageHeight-ctm.getYPosition());
+                    translationMatrix = Matrix.getTranslatingInstance((float)(Math.sin(angle)*ctm.getYScale()), (float)(pageHeight-2*ctm.getYPosition())); 
                 }
+                rotationMatrix = rotationMatrix.multiply(translationMatrix);
                 rotationMatrix.setValue(0, 1, (-1)*rotationMatrix.getValue(0, 1));
                 rotationMatrix.setValue(1, 0, (-1)*rotationMatrix.getValue(1, 0));
 
                 AffineTransform at = new AffineTransform(
                         rotationMatrix.getValue(0,0),rotationMatrix.getValue(0,1),
-                        rotationMatrix.getValue(1,0), rotationMatrix.getValue( 1, 1),
+                        rotationMatrix.getValue(1,0),rotationMatrix.getValue(1,1),
                         rotationMatrix.getValue(2,0),rotationMatrix.getValue(2,1)
                     );