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/02/01 11:58:49 UTC

svn commit: r739736 - in /incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox: pdfviewer/PageDrawer.java util/operator/pagedrawer/AppendRectangleToPath.java util/operator/pagedrawer/Invoke.java

Author: lehmi
Date: Sun Feb  1 10:58:48 2009
New Revision: 739736

URL: http://svn.apache.org/viewvc?rev=739736&view=rev
Log:
PDFBOX-51: we have to take the rotation into acoount whenever the coordinates of a path element are transformed with the current transformation matrix

Modified:
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=739736&r1=739735&r2=739736&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java Sun Feb  1 10:58:48 2009
@@ -206,6 +206,7 @@
     /**
      * Fix the y coordinate based on page rotation.
      *
+     * @deprecated
      * @param x The x coordinate.
      * @param y The y coordinate.
      * @return The updated y coordinate.
@@ -216,6 +217,17 @@
     }
 
     /**
+     * Fix the y coordinate
+     *
+     * @param y The y coordinate.
+     * @return The updated y coordinate.
+     */
+    public double fixY( double y )
+    {
+		return pageSize.getHeight() - y;
+    }
+
+    /**
      * Get the current line path to be drawn.
      *
      * @return The current line path to be drawn.
@@ -314,41 +326,25 @@
     }
 
     //This code generalizes the code Jim Lynch wrote for AppendRectangleToPath
+    /**
+     * use the current transformatrion matrix to transform a single point.
+     * @param x x-coordinate of the point to be transform
+     * @param x y-coordinate of the point to be transform
+     * @return the transformed coordinates as Point2D.Double
+     */
     public java.awt.geom.Point2D.Double TransformedPoint (double x, double y){
-
-        double scaleX = 0.0;
-        double scaleY = 0.0;
-        double transX = 0.0;
-        double transY = 0.0;
-
-        double finalX = x;
-        double finalY = y;
-
-        //Get the transformation matrix
-        Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
-        AffineTransform at = ctm.createAffineTransform();
-
-    	scaleX = at.getScaleX();
-        scaleY = at.getScaleY();
-        transX = at.getTranslateX();
-        transY = at.getTranslateY();
-
-        Point2D Pscale = ScaledPoint (finalX, finalY, scaleX, scaleY);
-        finalX = Pscale.getX();
-        finalY = Pscale.getY();
-
-        finalX += transX;
-      	finalY += transY;
-
-        finalY = fixY( finalX, finalY );
-        finalY -= .6;
-
-        return new java.awt.geom.Point2D.Double(finalX, finalY);
+        double[] position = {x,y}; 
+        getGraphicsState().getCurrentTransformationMatrix().createAffineTransform().transform(position, 0, position, 0, 1);
+        position[1] = fixY(position[1]);
+        return new Point2D.Double(position[0],position[1]);
     }
 
     //Use ScaledPoint rather than TransformedPoint in situations where most of the translation
     //need not be repeated.
     //Consider, for example, the second coordinate of a rectangle.
+    /**
+     * @deprecated
+     */
     public java.awt.geom.Point2D.Double ScaledPoint (double x, double y, double scaleX, double scaleY){
 
         double finalX = 0.0;
@@ -366,6 +362,9 @@
         return new java.awt.geom.Point2D.Double(finalX, finalY);
     }
 
+    /**
+     * @deprecated
+     */
     public java.awt.geom.Point2D.Double ScaledPoint (double x, double y){
 
         double scaleX = 0.0;

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java?rev=739736&r1=739735&r2=739736&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java Sun Feb  1 10:58:48 2009
@@ -16,9 +16,6 @@
  */
 package org.apache.pdfbox.util.operator.pagedrawer;
 
-import java.awt.Point;
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.util.List;
@@ -26,7 +23,6 @@
 
 import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.pdfviewer.PageDrawer;
-import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.util.PDFOperator;
 import org.apache.pdfbox.util.operator.OperatorProcessor;
 
@@ -54,33 +50,32 @@
         COSNumber w = (COSNumber)arguments.get( 2 );
         COSNumber h = (COSNumber)arguments.get( 3 );
 
-        double finalX = x.floatValue();
-        double finalY = y.floatValue();
-        double finalW = w.floatValue();
-        double finalH = h.floatValue();
-
-        Point2D Ppos = drawer.TransformedPoint(finalX, finalY);
-        Point2D Psize = drawer.ScaledPoint(finalW, finalH);
-
-        finalY = Ppos.getY() - Psize.getY();
-
-
-        if(finalY < 0)
+        double x1 = x.floatValue();
+        double y1 = y.floatValue();
+        // create a pair of coordinates for the transformation 
+        double x2 = w.floatValue()+x1;
+        double y2 = h.floatValue()+y1;
+
+        Point2D startCoords = drawer.TransformedPoint(x1,y1);
+        Point2D endCoords = drawer.TransformedPoint(x2,y2);
+
+        double width = endCoords.getX()-startCoords.getX();
+        double height =  endCoords.getY()-startCoords.getY();
+        double xStart = startCoords.getX();
+        double yStart = startCoords.getY();
+        // we have to calculate the width and height from the two pairs of coordinates
+        // if the endCoords are above the startCoords we have to switch them
+        if (width < 0) 
         {
-        	finalY = 0;
+        	xStart += width;
+        	width = -width;
         }
-
-
-        //logger().info("Rectangle coords: " + Ppos.getX() + "," +  finalY + "," +  Psize.getX() + "," +  Psize.getY() );
-        Rectangle2D rect = new Rectangle2D.Double(Ppos.getX(), finalY, Psize.getX(), Psize.getY());
-
+        if (height < 0) {
+        	yStart += height;
+        	height = -height;
+        }
+        Rectangle2D rect = new Rectangle2D.Double(xStart, yStart, width, height);
         drawer.getLinePath().reset();
-
-        //System.out.println( "Bounds before=" + drawer.getLinePath().getBounds() );
         drawer.getLinePath().append( rect, false );
-        //graphics.drawRect((int)x.doubleValue(), (int)(pageSize.getHeight() - y.doubleValue()),
-        //                  (int)w.doubleValue(),(int)h.doubleValue() );
-        //System.out.println( "<re x=\"" + x.getValue() + "\" y=\"" + y.getValue() + "\" width=\"" +
-        //                                 width.getValue() + "\" height=\"" + height.getValue() + "\" >" );
     }
 }

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java?rev=739736&r1=739735&r2=739736&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java Sun Feb  1 10:58:48 2009
@@ -68,27 +68,33 @@
                 if (awtImage == null) {
                     return;//TODO PKOCH
                 }
-                Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
+                int imageWidth = awtImage.getWidth();
+                int imageHeight = awtImage.getHeight();
+                double pageHeight = pageSize.getHeight();
 
-                int width = awtImage.getWidth();
-                int height = awtImage.getHeight();
+                Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
+                int pageRotation = page.findRotation();
 
-                Matrix scalingParams = ctm.extractScaling();
-                Matrix scalingMatrix = Matrix.getScaleInstance(1f/width,1f/height);
-                scalingParams = scalingParams.multiply( scalingMatrix );
-
-                Matrix translationParams = ctm.extractTranslating();
-                Matrix translationMatrix = null;
-                translationParams.setValue(2,1, -translationParams.getValue( 2,1 ));
-                translationMatrix = Matrix.getTranslatingInstance(0, (float)pageSize.getHeight()-height*scalingParams.getYScale() );
-                translationParams = translationParams.multiply( translationMatrix );
+                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(
-                        scalingParams.getValue( 0,0), 0,
-                        0, scalingParams.getValue( 1, 1),
-                        translationParams.getValue(2,0), translationParams.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.drawImage( awtImage, at, null );
             }
             catch( Exception e )