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)
);