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 )