FOP-2689: PDF rotated at 90 degrees not visible

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1782135 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
index 6b9929e..3e8d5dd 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
@@ -110,24 +110,22 @@
     }
 
     protected static void rotate(int rotation, PDRectangle viewBox, AffineTransform atdoc) {
-        float x = viewBox.getWidth() + viewBox.getLowerLeftX();
-        float y = viewBox.getHeight() + viewBox.getLowerLeftY();
+        float w = viewBox.getWidth();
+        float h = viewBox.getHeight();
+        float x = viewBox.getLowerLeftX();
+        float y = viewBox.getLowerLeftY();
         switch (rotation) {
             case 90:
-                atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
-                atdoc.translate(0, viewBox.getWidth());
-                atdoc.rotate(-Math.PI / 2.0);
-                atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
+                atdoc.rotate(Math.toRadians(rotation + 180), x, y);
+                atdoc.translate(-h, 0);
                 break;
             case 180:
-                atdoc.translate(x, y);
-                atdoc.rotate(-Math.PI);
-                atdoc.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY());
+                atdoc.translate(w, h);
+                atdoc.rotate(Math.toRadians(rotation), x, y);
                 break;
             case 270:
-                atdoc.translate(viewBox.getLowerLeftX(), y);
-                atdoc.rotate(Math.toRadians(270 + 180));
-                atdoc.translate(-x, -y);
+                atdoc.rotate(Math.toRadians(rotation + 180), x, h + y);
+                atdoc.translate(-w, 0);
                 break;
             default:
                 //no additional transformations necessary
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index 54c460d..eda1af7 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -84,7 +84,6 @@
 import junit.framework.Assert;
 
 public class PDFBoxAdapterTestCase {
-    private Rectangle2D r = new Rectangle2D.Double();
     protected static final String CFF1 = "test/resources/2fonts.pdf";
     protected static final String CFF2 = "test/resources/2fonts2.pdf";
     protected static final String CFF3 = "test/resources/simpleh.pdf";
@@ -109,9 +108,14 @@
     private static final String XFORM = "test/resources/xform.pdf";
     private static final String LOOP = "test/resources/loop.pdf";
 
-    private PDFBoxAdapter getPDFBoxAdapter(boolean mergeFonts) {
+    private static PDFPage getPDFPage(PDFDocument doc) {
+        final Rectangle2D r = new Rectangle2D.Double();
+        return new PDFPage(new PDFResources(doc), 0, r, r, r, r);
+    }
+
+    protected static PDFBoxAdapter getPDFBoxAdapter(boolean mergeFonts) {
         PDFDocument doc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(doc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(doc);
         doc.setMergeFontsEnabled(mergeFonts);
         pdfpage.setDocument(doc);
         pdfpage.setObjectNumber(1);
@@ -187,27 +191,9 @@
     }
 
     @Test
-    public void testStream() throws Exception {
-        PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
-        pdfpage.setDocument(pdfdoc);
-        PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
-        PDDocument doc = PDDocument.load(new File(ROTATE));
-        PDPage page = doc.getDocumentCatalog().getPages().get(0);
-        AffineTransform at = new AffineTransform();
-        Rectangle r = new Rectangle(0, 1650, 842000, 595000);
-        String stream = adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
-        Assert.assertEquals(at, new AffineTransform(-0.0, 1.0000000554888686, 1.0000000554888686, 0.0, 0.0,
-                -2.0742416381835938E-5));
-        Assert.assertTrue(stream.contains("/GS0106079 gs"));
-        Assert.assertTrue(stream.contains("/TT0106079 1 Tf"));
-        doc.close();
-    }
-
-    @Test
     public void testTaggedPDFWriter() throws IOException {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
         adapter.setCurrentMCID(5);
@@ -223,7 +209,7 @@
     @Test
     public void testAnnot() throws Exception {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         pdfpage.setObjectNumber(1);
         PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
@@ -258,7 +244,7 @@
     @Test
     public void testLink() throws Exception {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         pdfpage.setObjectNumber(1);
         Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>();
@@ -280,7 +266,7 @@
         PDFDocument pdfdoc = new PDFDocument("");
         pdfdoc.getFilterMap().put(PDFFilterList.DEFAULT_FILTER, Collections.singletonList("null"));
         pdfdoc.setMergeFontsEnabled(true);
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         pdfpage.setObjectNumber(1);
         Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>();
@@ -396,7 +382,7 @@
         PDDocument doc = PDDocument.load(new File(SHADING));
         ImagePDF img = new ImagePDF(imgi, doc);
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         PDFGState g = new PDFGState();
         pdfdoc.assignObjectNumber(g);
@@ -417,7 +403,7 @@
     @Test
     public void testPDFCache() throws IOException {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfdoc.assignObjectNumber(pdfpage);
         pdfpage.setDocument(pdfdoc);
         Map<Object, Object> pdfCache = new HashMap<Object, Object>();
diff --git a/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java b/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
index 700d1fc..874b705 100644
--- a/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
@@ -19,7 +19,11 @@
 
 package org.apache.fop.render.pdf;
 
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
+import java.io.File;
+import java.io.IOException;
 
 import org.junit.Test;
 
@@ -34,6 +38,7 @@
 
 import org.apache.fop.render.pdf.pdfbox.ImageConverterPDF2G2D;
 import org.apache.fop.render.pdf.pdfbox.ImagePDF;
+import org.apache.fop.render.pdf.pdfbox.PDFBoxAdapter;
 import org.apache.fop.render.pdf.pdfbox.PSPDFGraphics2D;
 
 import junit.framework.Assert;
@@ -58,4 +63,27 @@
         ig.getGraphics2DImagePainter().paint(g2d, rect);
         Assert.assertEquals(g2d.getTransform().getShearX(), 0.16339869281045735);
     }
+
+    @Test
+    public void testAngle() throws IOException {
+        Assert.assertEquals(getTransform(90), new AffineTransform(0, 1, 1, 0, 0, 0));
+        Assert.assertEquals(getTransform(270), new AffineTransform(0, -1, -1, 0, 842, 595));
+        AffineTransform at = getTransform(180);
+        Assert.assertEquals((int)at.getTranslateX(), 842);
+        Assert.assertEquals(at.getTranslateY(), 0.0);
+    }
+
+    private AffineTransform getTransform(int angle) throws IOException {
+        PDFBoxAdapter adapter = PDFBoxAdapterTestCase.getPDFBoxAdapter(false);
+        PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.ROTATE));
+        PDPage page = doc.getDocumentCatalog().getPages().get(0);
+        page.setRotation(angle);
+        AffineTransform at = new AffineTransform();
+        Rectangle r = new Rectangle(0, 1650, 842000, 595000);
+        String stream = adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
+        Assert.assertTrue(stream.contains("/GS0106079 gs"));
+        Assert.assertTrue(stream.contains("/TT0106079 1 Tf"));
+        doc.close();
+        return at;
+    }
 }