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 2009/09/13 12:19:38 UTC

svn commit: r814296 - /incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java

Author: lehmi
Date: Sun Sep 13 10:19:38 2009
New Revision: 814296

URL: http://svn.apache.org/viewvc?rev=814296&view=rev
Log:
PDFBOX529: adding page rotation handling to inline image operator. Patch from Andrew Duffy (aduffy at simiolus dot com)

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

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java?rev=814296&r1=814295&r2=814296&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java Sun Sep 13 10:19:38 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.util.operator.pagedrawer;
 
+import java.awt.Dimension;
 import java.awt.Graphics2D;
 import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
@@ -23,6 +24,7 @@
 import java.util.List;
 
 import org.apache.pdfbox.pdfviewer.PageDrawer;
+import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.graphics.xobject.PDInlinedImage;
 import org.apache.pdfbox.util.ImageParameters;
 import org.apache.pdfbox.util.Matrix;
@@ -48,6 +50,8 @@
     public void process(PDFOperator operator, List arguments)  throws IOException
     {
         PageDrawer drawer = (PageDrawer)context;
+        PDPage page = drawer.getPage();
+        Dimension pageSize = drawer.getPageSize();
         Graphics2D graphics = drawer.getGraphics();
         //begin inline image object
         ImageParameters params = operator.getImageParameters();
@@ -56,20 +60,39 @@
         image.setImageData( operator.getImageData() );
         BufferedImage awtImage = image.createImage( context.getColorSpaces() );
 
+        if (awtImage == null) 
+        {
+            logger().warn("BeginInlineImage.process(): createImage returned NULL");
+            return;
+        }
+        int imageWidth = awtImage.getWidth();
+        int imageHeight = awtImage.getHeight();
+        double pageHeight = pageSize.getHeight();
+        
         Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
+        int pageRotation = page.findRotation();
 
-        int width = awtImage.getWidth();
-        int height = awtImage.getHeight();
-
-
+        AffineTransform ctmAT = ctm.createAffineTransform();
+        ctmAT.scale(1f/imageWidth, 1f/imageHeight);
+        Matrix rotationMatrix = new Matrix();
+        rotationMatrix.setFromAffineTransform( ctmAT );
+        if (pageRotation == 0 || pageRotation == 180) 
+        {
+            rotationMatrix.setValue(2,1,(float)pageHeight-ctm.getYPosition()-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());
+        }
+        rotationMatrix.setValue(0, 1, (-1)*rotationMatrix.getValue(0, 1));
+        rotationMatrix.setValue(1, 0, (-1)*rotationMatrix.getValue(1, 0));
         AffineTransform at = new AffineTransform(
-            ctm.getValue(0,0)/width,
-            ctm.getValue(0,1),
-            ctm.getValue(1,0),
-            ctm.getValue(1,1)/height,
-            ctm.getValue(2,0),
-            ctm.getValue(2,1)
-        );
+                rotationMatrix.getValue(0,0),rotationMatrix.getValue(0,1),
+                rotationMatrix.getValue(1,0), rotationMatrix.getValue( 1, 1),
+                rotationMatrix.getValue(2,0),rotationMatrix.getValue(2,1)
+                );
+
         graphics.setClip(context.getGraphicsState().getCurrentClippingPath());
         graphics.drawImage( awtImage, at, null );
     }