\r
package org.apache.poi.xslf.usermodel;\r
\r
-import org.apache.poi.openxml4j.opc.PackagePart;\r
-import org.apache.poi.util.Beta;\r
-\r
-import javax.imageio.ImageIO;\r
import java.awt.Graphics2D;\r
+import java.awt.Insets;\r
+import java.awt.Shape;\r
import java.awt.geom.AffineTransform;\r
import java.awt.geom.Rectangle2D;\r
import java.awt.image.BufferedImage;\r
import java.io.IOException;\r
\r
+import javax.imageio.ImageIO;\r
+\r
+import org.apache.poi.openxml4j.opc.PackagePart;\r
+import org.apache.poi.util.Beta;\r
+\r
/**\r
* For now this class renders only images supported by the javax.imageio.ImageIO\r
* framework. Subclasses can override this class to support other formats, for\r
* \r
* @return true if the picture data was successfully rendered\r
*/\r
- public boolean drawImage(Graphics2D graphics, XSLFPictureData data,\r
- Rectangle2D anchor) {\r
+ public boolean drawImage(Graphics2D graphics, XSLFPictureData data,\r
+ Rectangle2D anchor) {\r
+ return drawImage(graphics, data, anchor, null);\r
+ }\r
+ \r
+ /**\r
+ * Render picture data into the supplied graphics\r
+ * \r
+ * @return true if the picture data was successfully rendered\r
+ */\r
+ public boolean drawImage(Graphics2D graphics, XSLFPictureData data,\r
+ Rectangle2D anchor, Insets clip) {\r
+ boolean isClipped = true;\r
+ if (clip == null) {\r
+ isClipped = false;\r
+ clip = new Insets(0,0,0,0);\r
+ }\r
+ \r
try {\r
BufferedImage img = ImageIO.read(data.getPackagePart().getInputStream());\r
- double sx = anchor.getWidth()/img.getWidth();\r
- double sy = anchor.getHeight()/img.getHeight();\r
- double tx = anchor.getX();\r
- double ty = anchor.getY();\r
+ int iw = img.getWidth();\r
+ int ih = img.getHeight();\r
+\r
+ double aw = anchor.getWidth();\r
+ double ah = anchor.getHeight();\r
+ double ax = anchor.getX();\r
+ double ay = anchor.getY();\r
+ \r
+ double cw = (100000-clip.left-clip.right) / 100000.0;\r
+ double ch = (100000-clip.top-clip.bottom) / 100000.0;\r
+ double sx = aw/(iw*cw);\r
+ double sy = ah/(ih*ch);\r
+ double tx = anchor.getX()-(iw*sx*clip.left/100000.0);\r
+ double ty = anchor.getY()-(ih*sy*clip.top/100000.0);\r
AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ;\r
\r
- graphics.drawRenderedImage(img, at);\r
+ if (isClipped) {\r
+ Shape clipOld = graphics.getClip();\r
+ AffineTransform atClip = new AffineTransform(aw, 0, 0, ah, ax, ay);\r
+ Shape clipNew = atClip.createTransformedShape(new Rectangle2D.Double(0, 0, 1, 1));\r
+ graphics.setClip(clipNew);\r
+ graphics.drawRenderedImage(img, at);\r
+ graphics.setClip(clipOld);\r
+ } else {\r
+ graphics.drawRenderedImage(img, at);\r
+ }\r
\r
return true;\r
} catch (Exception e) {\r
package org.apache.poi.xslf.usermodel;\r
\r
import java.awt.Graphics2D;\r
+import java.awt.Insets;\r
import java.awt.geom.Rectangle2D;\r
import java.awt.image.BufferedImage;\r
import java.io.ByteArrayInputStream;\r
import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeArtExtension;\r
import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeArtExtensionList;\r
import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTRelativeRect;\r
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;\r
import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;\r
import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps;\r
return id;\r
}\r
\r
+ public Insets getBlipClip(){\r
+ CTPicture ct = (CTPicture)getXmlObject();\r
+ CTRelativeRect r = ct.getBlipFill().getSrcRect();\r
+ return (r == null) ? null : new Insets(r.getT(), r.getL(), r.getB(), r.getR());\r
+ }\r
+\r
@Override\r
public void drawContent(Graphics2D graphics) {\r
\r
\r
RenderableShape rShape = new RenderableShape(this);\r
Rectangle2D anchor = rShape.getAnchor(graphics);\r
+ \r
+ Insets insets = getBlipClip();\r
\r
- renderer.drawImage(graphics, data, anchor);\r
+ renderer.drawImage(graphics, data, anchor, insets);\r
}\r
\r
\r
==================================================================== */
package org.apache.poi.xslf;
+import static junit.framework.TestCase.assertEquals;
+import static org.apache.poi.POITestCase.assertContains;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
import java.net.URI;
import java.util.List;
-import org.apache.poi.POITestCase;
+import javax.imageio.ImageIO;
+
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.xslf.usermodel.DrawingParagraph;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
+import org.junit.Ignore;
+import org.junit.Test;
-public class TestXSLFBugs extends POITestCase {
+public class TestXSLFBugs {
+ @Test
@SuppressWarnings("deprecation")
- public void test51187() throws Exception {
+ public void bug51187() throws Exception {
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("51187.pptx");
assertEquals(1, ss.getSlides().length);
/**
* Slide relations with anchors in them
*/
- public void testTIKA705() {
+ @Test
+ public void tika705() {
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("with_japanese.pptx");
// Should have one slide
* slide, eg presentation.xml rID1 -> slide1.xml, but slide1.xml
* rID2 -> slide3.xml
*/
- public void DISABLEDtest54916() throws Exception {
+ @Test
+ @Ignore
+ public void bug54916() throws Exception {
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("OverlappingRelations.pptx");
XSLFSlide slide;
* there is no data available and XSLFPictureShape.getPictureData()
* gives a NPE, see bug #56812
*/
- public void test56812() throws Exception {
+ @Test
+ public void bug56812() throws Exception {
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("56812.pptx");
int internalPictures = 0;
assertEquals(2, internalPictures);
assertEquals(1, externalPictures);
}
+
+ @Test
+ @Ignore("Similar to TestFontRendering it doesn't make sense to compare images because of tiny rendering differences in windows/unix")
+ public void bug54542() throws Exception {
+ XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("54542_cropped_bitmap.pptx");
+
+ Dimension pgsize = ss.getPageSize();
+
+ XSLFSlide slide = ss.getSlides()[0];
+
+ // render it
+ double zoom = 1;
+ AffineTransform at = new AffineTransform();
+ at.setToScale(zoom, zoom);
+
+ BufferedImage imgActual = new BufferedImage((int)Math.ceil(pgsize.width*zoom), (int)Math.ceil(pgsize.height*zoom), BufferedImage.TYPE_3BYTE_BGR);
+ Graphics2D graphics = imgActual.createGraphics();
+ graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+ graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+ graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ graphics.setTransform(at);
+ graphics.setPaint(Color.white);
+ graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
+ slide.draw(graphics);
+
+ ImageIO.write(imgActual, "PNG", new File("bug54542.png"));
+ }
protected String getSlideText(XSLFSlide slide) {
StringBuffer text = new StringBuffer();