Author: yegor
Date: Sun Dec  2 12:24:55 2012
New Revision: 1416165

URL: http://svn.apache.org/viewvc?rev=1416165&view=rev
Log:
Bug 54210 - Fixed rendering text in flipped shapes in PPT2PNG and PPTX2PNG

Modified:
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=1416165&r1=1416164&r2=1416165&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Sun Dec  2 12:24:55 
2012
@@ -34,6 +34,8 @@
 
     <changes>
         <release version="4.0-beta1" date="2013-??-??">
+          <action dev="poi-developers" type="fix">Synchronize table headers 
with parent sheet in XSSF</action>
+          <action dev="poi-developers" type="fix">54210 - Fixed rendering text 
in flipped shapes in PPT2PNG and PPTX2PNG</action>
         </release>
         <release version="3.9" date="2012-12-03">
           <action dev="poi-developers" type="fix">54188 - Avoid NPE in 
PPT2PNG</action>

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java?rev=1416165&r1=1416164&r2=1416165&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java 
Sun Dec  2 12:24:55 2012
@@ -37,6 +37,7 @@ import org.openxmlformats.schemas.presen
 import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
 
 import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
@@ -493,6 +494,36 @@ public abstract class XSLFTextShape exte
         double x = anchor.getX() + getLeftInset();
         double y = anchor.getY();
 
+        // remember the initial transform
+        AffineTransform tx = graphics.getTransform();
+
+        // Transform of text in flipped shapes is special.
+        // At this point the flip and rotation transform is already applied
+        // (see XSLFShape#applyTransform ), but we need to restore it to avoid 
painting "upside down".
+        // See Bugzilla 54210.
+
+        if(getFlipVertical()){
+            graphics.translate(anchor.getX(), anchor.getY() + 
anchor.getHeight());
+            graphics.scale(1, -1);
+            graphics.translate(-anchor.getX(), -anchor.getY());
+
+            // text in vertically flipped shapes is rotated by 180 degrees
+            double centerX = anchor.getX() + anchor.getWidth()/2;
+            double centerY = anchor.getY() + anchor.getHeight()/2;
+            graphics.translate(centerX, centerY);
+            graphics.rotate(Math.toRadians(180));
+            graphics.translate(-centerX, -centerY);
+        }
+
+        // Horizontal flipping applies only to shape outline and not to the 
text in the shape.
+        // Applying flip second time restores the original not-flipped 
transform
+        if(getFlipHorizontal()){
+            graphics.translate(anchor.getX() + anchor.getWidth(), 
anchor.getY());
+            graphics.scale(-1, 1);
+            graphics.translate(-anchor.getX() , -anchor.getY());
+        }
+
+
         // first dry-run to calculate the total height of the text
         double textHeight = getTextHeight();
 
@@ -512,11 +543,14 @@ public abstract class XSLFTextShape exte
         }
 
         drawParagraphs(graphics, x, y);
+
+        // restore the transform
+        graphics.setTransform(tx);
     }
 
 
     /**
-     * pain the paragraphs starting from top left (x,y)
+     * paint the paragraphs starting from top left (x,y)
      *
      * @return  the vertical advance, i.e. the cumulative space occupied by 
the text
      */

Modified: 
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java?rev=1416165&r1=1416164&r2=1416165&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java 
(original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java Sun 
Dec  2 12:24:55 2012
@@ -24,6 +24,7 @@ import java.awt.font.FontRenderContext;
 import java.awt.font.LineBreakMeasurer;
 import java.awt.font.TextAttribute;
 import java.awt.font.TextLayout;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.text.AttributedCharacterIterator;
@@ -94,6 +95,8 @@ public final class TextPainter {
     }
 
     public void paint(Graphics2D graphics){
+        AffineTransform tx = graphics.getTransform();
+
         Rectangle2D anchor = _shape.getLogicalAnchor2D();
         TextElement[] elem = getTextElements((float)anchor.getWidth(), 
graphics.getFontRenderContext());
         if(elem == null) return;
@@ -120,6 +123,32 @@ public final class TextPainter {
                 break;
         }
 
+
+        // Transform of text in flipped shapes is special.
+        // At this point the flip and rotation transform is already applied
+        // (see XSLFShape#applyTransform ), but we need to restore it to avoid 
painting "upside down".
+        // See Bugzilla 54210.
+        if(_shape.getFlipVertical()){
+            graphics.translate(anchor.getX(), anchor.getY() + 
anchor.getHeight());
+            graphics.scale(1, -1);
+            graphics.translate(-anchor.getX(), -anchor.getY());
+
+            // text in vertically flipped shapes is rotated by 180 degrees
+            double centerX = anchor.getX() + anchor.getWidth()/2;
+            double centerY = anchor.getY() + anchor.getHeight()/2;
+            graphics.translate(centerX, centerY);
+            graphics.rotate(Math.toRadians(180));
+            graphics.translate(-centerX, -centerY);
+        }
+
+        // Horizontal flipping applies only to shape outline and not to the 
text in the shape.
+        // Applying flip second time restores the original not-flipped 
transform
+        if(_shape.getFlipHorizontal()){
+            graphics.translate(anchor.getX() + anchor.getWidth(), 
anchor.getY());
+            graphics.scale(-1, 1);
+            graphics.translate(-anchor.getX() , -anchor.getY());
+        }
+
         //finally draw the text fragments
         for (int i = 0; i < elem.length; i++) {
             y0 += elem[i].ascent;
@@ -149,6 +178,8 @@ public final class TextPainter {
             }
             y0 += elem[i].descent;
         }
+
+        graphics.setTransform(tx);
     }
 
     public TextElement[] getTextElements(float textWidth, FontRenderContext 
frc){



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org
For additional commands, e-mail: commits-h...@poi.apache.org

Reply via email to