PDFBOX-4596: adjust transforms for rotation

git-svn-id: https://svn.apache.org/repos/asf/pdfbox/trunk@1863047 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java b/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
index 3057fdc..62c03f1 100644
--- a/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
+++ b/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
@@ -432,8 +432,7 @@
             resources = new PDResources();
             page.setResources(resources);
         }
-        COSName xObjectId = createOverlayXObject(page, layoutPage,
-                layoutPage.overlayContentStream);
+        COSName xObjectId = createOverlayXObject(page, layoutPage, layoutPage.overlayContentStream);
         array.add(createOverlayStream(page, layoutPage, xObjectId));
     }
 
@@ -478,7 +477,25 @@
         xobjForm.setResources(new PDResources(layoutPage.overlayResources));
         xobjForm.setFormType(1);
         xobjForm.setBBox(layoutPage.overlayMediaBox.createRetranslatedRectangle());
-        xobjForm.setMatrix(new AffineTransform());
+        AffineTransform at = new AffineTransform();
+        switch (layoutPage.overlayRotation)
+        {
+            case 90:
+                at.translate(0, layoutPage.overlayMediaBox.getWidth());
+                at.rotate(Math.toRadians(-90));
+                break;
+            case 180:
+                at.translate(layoutPage.overlayMediaBox.getWidth(), layoutPage.overlayMediaBox.getHeight());
+                at.rotate(Math.toRadians(-180));
+                break;
+            case 270:
+                at.translate(layoutPage.overlayMediaBox.getHeight(), 0);
+                at.rotate(Math.toRadians(-270));
+                break;
+            default:
+                break;
+        }
+        xobjForm.setMatrix(at);
         PDResources resources = page.getResources();
         return resources.add(xobjForm, "OL");
     }
@@ -489,7 +506,15 @@
         // create a new content stream that executes the XObject content
         StringBuilder overlayStream = new StringBuilder();
         overlayStream.append("q\nq\n");
-        AffineTransform at = calculateAffineTransform(page, layoutPage.overlayMediaBox);
+        PDRectangle overlayMediaBox = new PDRectangle(layoutPage.overlayMediaBox.getCOSArray());
+        if (layoutPage.overlayRotation == 90 || layoutPage.overlayRotation == 270)
+        {
+            overlayMediaBox.setLowerLeftX(layoutPage.overlayMediaBox.getLowerLeftY());
+            overlayMediaBox.setLowerLeftY(layoutPage.overlayMediaBox.getLowerLeftX());
+            overlayMediaBox.setUpperRightX(layoutPage.overlayMediaBox.getUpperRightY());
+            overlayMediaBox.setUpperRightY(layoutPage.overlayMediaBox.getUpperRightX());
+        }
+        AffineTransform at = calculateAffineTransform(page, overlayMediaBox);
         double[] flatmatrix = new double[6];
         at.getMatrix(flatmatrix);
         for (double v : flatmatrix)
@@ -497,7 +522,13 @@
             overlayStream.append(float2String((float) v));
             overlayStream.append(" ");
         }
-        overlayStream.append(" cm\n/");
+        overlayStream.append(" cm\n");
+
+        // if debugging, insert
+        // 0 0 overlayMediaBox.getHeight() overlayMediaBox.getWidth() re\ns\n
+        // into the content stream
+
+        overlayStream.append(" /");
         overlayStream.append(xObjectId.getName());
         overlayStream.append(" Do Q\nQ\n");
         return createStream(overlayStream.toString());