Author: kiwiwings
Date: Mon Feb 29 23:59:49 2016
New Revision: 1732974

URL: http://svn.apache.org/viewvc?rev=1732974&view=rev
Log:
#59056 - Render individual slideshow shapes

Modified:
    poi/site/src/documentation/content/xdocs/status.xml
    poi/trunk/src/java/org/apache/poi/sl/draw/DrawFactory.java
    poi/trunk/src/java/org/apache/poi/sl/usermodel/Shape.java
    poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java
    
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
    
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java

Modified: poi/site/src/documentation/content/xdocs/status.xml
URL: 
http://svn.apache.org/viewvc/poi/site/src/documentation/content/xdocs/status.xml?rev=1732974&r1=1732973&r2=1732974&view=diff
==============================================================================
--- poi/site/src/documentation/content/xdocs/status.xml (original)
+++ poi/site/src/documentation/content/xdocs/status.xml Mon Feb 29 23:59:49 2016
@@ -40,6 +40,7 @@
     </devs>
 
     <release version="3.14-beta2" date="2016-??-??">
+        <action dev="PD" type="add" fixes-bug="59056">Render individual 
slideshow shapes</action>
         <action dev="PD" type="fix" fixes-bug="59074">ExtractorFactory should 
give a more helpful exception on old Excel files too old for 
ExcelExtractor</action>
         <action dev="PD" type="add" fixes-bug="57989">XSSFChart support for 
setting chart titles</action>
         <action dev="PD" type="fix" fixes-bug="59030">Prevent NPE in 
XWPFTableCell's getVerticalAlignment() from Prasad Babu</action>

Modified: poi/trunk/src/java/org/apache/poi/sl/draw/DrawFactory.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/draw/DrawFactory.java?rev=1732974&r1=1732973&r2=1732974&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/sl/draw/DrawFactory.java (original)
+++ poi/trunk/src/java/org/apache/poi/sl/draw/DrawFactory.java Mon Feb 29 
23:59:49 2016
@@ -19,6 +19,8 @@ package org.apache.poi.sl.draw;
 
 import java.awt.Graphics2D;
 import java.awt.font.TextLayout;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
 import java.text.AttributedString;
 import java.util.HashMap;
 import java.util.Map;
@@ -168,7 +170,41 @@ public class DrawFactory {
         return new DrawPaint(shape);
     }
 
+    /**
+     * Convenience method for drawing single shapes.
+     * For drawing whole slides, use {@link Slide#draw(Graphics2D)}
+     *
+     * @param graphics the graphics context to draw to
+     * @param shape the shape
+     * @param bounds the bounds within the graphics context to draw to 
+     */
+    public void drawShape(Graphics2D graphics, Shape<?,?> shape, Rectangle2D 
bounds) {
+        Rectangle2D shapeBounds = shape.getAnchor();
+        if (shapeBounds.isEmpty() || (bounds != null && bounds.isEmpty())) {
+            return;
+        }
 
+        AffineTransform txg = 
(AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);
+        AffineTransform tx = new AffineTransform();
+        try {
+            if (bounds != null) {
+                double scaleX = bounds.getWidth()/shapeBounds.getWidth();
+                double scaleY = bounds.getHeight()/shapeBounds.getHeight();
+                tx.translate(bounds.getCenterX(), bounds.getCenterY());
+                tx.scale(scaleX, scaleY);
+                tx.translate(-shapeBounds.getCenterX(), 
-shapeBounds.getCenterY());
+            }
+            graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, tx);
+            
+            Drawable d = getDrawable(shape);
+            d.applyTransform(graphics);
+            d.draw(graphics);
+        } finally {
+            graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, txg);
+        }
+    }
+    
+    
     /**
      * Replace font families for Windows JVM 6, which contains a font 
rendering error.
      * This is likely to be removed, when POI upgrades to JDK 7

Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/Shape.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/Shape.java?rev=1732974&r1=1732973&r2=1732974&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/sl/usermodel/Shape.java (original)
+++ poi/trunk/src/java/org/apache/poi/sl/usermodel/Shape.java Mon Feb 29 
23:59:49 2016
@@ -17,6 +17,7 @@
 
 package org.apache.poi.sl.usermodel;
 
+import java.awt.Graphics2D;
 import java.awt.geom.Rectangle2D;
 
 public interface Shape<
@@ -24,17 +25,26 @@ public interface Shape<
     P extends TextParagraph<S,P,?>
 > {
        ShapeContainer<S,P> getParent();
-       
+
    /**
     * @return the sheet this shape belongs to
     */
    Sheet<S,P> getSheet();
-   
+
    /**
     * Returns the anchor (the bounding box rectangle) of this shape.
     * All coordinates are expressed in points (72 dpi).
     *
     * @return the anchor of this shape
     */
-   Rectangle2D getAnchor();   
+   Rectangle2D getAnchor();
+   
+   /**
+    * Convenience method to draw a single shape
+    *
+    * @param graphics the graphics context
+    * @param bounds the rectangle to fit the shape to.
+    *   if null, the bounds of the shape are used.
+    */
+   void draw(Graphics2D graphics, Rectangle2D bounds);
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java?rev=1732974&r1=1732973&r2=1732974&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java Mon 
Feb 29 23:59:49 2016
@@ -19,6 +19,8 @@
 
 package org.apache.poi.xslf.usermodel;
 
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
@@ -27,6 +29,7 @@ import java.util.Comparator;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.sl.draw.DrawFactory;
 import org.apache.poi.sl.draw.DrawPaint;
 import org.apache.poi.sl.usermodel.ColorStyle;
 import org.apache.poi.sl.usermodel.PaintStyle;
@@ -537,4 +540,9 @@ public abstract class XSLFShape implemen
         }
         return (fillProps == null) ? null : selectPaint(fillProps, phClr, 
theme.getPackagePart());
     }
+    
+    @Override
+    public void draw(Graphics2D graphics, Rectangle2D bounds) {
+        DrawFactory.getInstance(graphics).drawShape(graphics, this, bounds);
+    }
 }
\ No newline at end of file

Modified: 
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java?rev=1732974&r1=1732973&r2=1732974&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java 
(original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java 
Mon Feb 29 23:59:49 2016
@@ -38,6 +38,7 @@ import org.apache.poi.hslf.record.ColorS
 import org.apache.poi.hslf.record.HSLFEscherClientDataRecord;
 import org.apache.poi.hslf.record.Record;
 import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.sl.draw.DrawFactory;
 import org.apache.poi.sl.usermodel.FillStyle;
 import org.apache.poi.sl.usermodel.Shape;
 import org.apache.poi.sl.usermodel.ShapeContainer;
@@ -447,8 +448,9 @@ public abstract class HSLFShape implemen
         return getFill().getFillStyle();
     }
 
-    public void draw(Graphics2D graphics){
-        logger.log(POILogger.INFO, "Rendering " + getShapeName());
+    @Override
+    public void draw(Graphics2D graphics, Rectangle2D bounds){
+        DrawFactory.getInstance(graphics).drawShape(graphics, this, bounds);
     }
 
     public AbstractEscherOptRecord getEscherOptRecord() {

Modified: 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java?rev=1732974&r1=1732973&r2=1732974&view=diff
==============================================================================
--- 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java 
(original)
+++ 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java 
Mon Feb 29 23:59:49 2016
@@ -24,6 +24,9 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertTrue;
 
 import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -52,6 +55,7 @@ import org.apache.poi.hslf.record.SlideL
 import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
 import org.apache.poi.hslf.record.TextHeaderAtom;
 import org.apache.poi.hssf.usermodel.DummyGraphics2d;
+import org.apache.poi.sl.draw.DrawFactory;
 import org.apache.poi.sl.draw.DrawPaint;
 import org.apache.poi.sl.draw.DrawTextParagraph;
 import org.apache.poi.sl.usermodel.PaintStyle;
@@ -879,6 +883,26 @@ public final class TestBugs {
         
         ppt.close();
     }
+
+    @Test
+    public void bug59056() throws IOException {
+        HSLFSlideShow ppt = open("54541_cropped_bitmap.ppt");
+        
+        for (HSLFShape shape : ppt.getSlides().get(0).getShapes()) {
+            BufferedImage img = new BufferedImage(500, 300, 
BufferedImage.TYPE_INT_ARGB);
+            Graphics2D graphics = img.createGraphics();
+            Rectangle2D box = new Rectangle2D.Double(50,50,300,100);
+            graphics.setPaint(Color.red);
+            graphics.fill(box);
+            box = new 
Rectangle2D.Double(box.getX()+1,box.getY()+1,box.getWidth()-2,box.getHeight()-2);
+            DrawFactory.getInstance(graphics).drawShape(graphics, shape, box);
+            graphics.dispose();
+            // ImageIO.write(img, "png", new 
File("bla"+shape.getShapeId()+".png"));
+        }
+            
+        ppt.close();
+        
+    }
     
     private static HSLFSlideShow open(String fileName) throws IOException {
         File sample = HSLFTestDataSamples.getSampleFile(fileName);

Modified: 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java?rev=1732974&r1=1732973&r2=1732974&view=diff
==============================================================================
--- 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
 (original)
+++ 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
 Mon Feb 29 23:59:49 2016
@@ -27,6 +27,7 @@ import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -106,13 +107,14 @@ public final class TestPicture {
         HSLFPictureData pd = HSLFPictureData.create(PictureType.PNG);
         
         HSLFPictureShape pict = new HSLFPictureShape(pd); //index to 
non-existing picture data
+        pict.setAnchor(new Rectangle2D.Double(50,50,100,100));
         pict.setSheet(slide);
         HSLFPictureData data = pict.getPictureData();
         assertNull(data);
 
         BufferedImage img = new BufferedImage(100, 100, 
BufferedImage.TYPE_INT_RGB);
         Graphics2D graphics = img.createGraphics();
-        pict.draw(graphics);
+        pict.draw(graphics, null);
         
         ppt.close();
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to