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]