]> source.dussan.org Git - poi.git/commitdiff
Close resources in Common SL rendering classes and minimize memory consumption by...
authorAndreas Beeker <kiwiwings@apache.org>
Mon, 16 May 2016 10:09:22 +0000 (10:09 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Mon, 16 May 2016 10:09:22 +0000 (10:09 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1744007 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/sl/draw/BitmapImageRenderer.java
src/java/org/apache/poi/sl/draw/DrawPaint.java
src/java/org/apache/poi/sl/draw/DrawSimpleShape.java
src/java/org/apache/poi/sl/draw/ImageRenderer.java
src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java
src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfSLImageRenderer.java

index 5099246e60c6740bda03025e1a4fda8d028e82bd..73e45d5dba03c902f58327bff41cc08dd4edf0b2 100644 (file)
@@ -24,6 +24,7 @@ import java.awt.Insets;
 import java.awt.Shape;\r
 import java.awt.geom.AffineTransform;\r
 import java.awt.geom.Rectangle2D;\r
+import java.awt.image.AffineTransformOp;\r
 import java.awt.image.BufferedImage;\r
 import java.awt.image.RescaleOp;\r
 import java.io.ByteArrayInputStream;\r
@@ -69,14 +70,25 @@ public class BitmapImageRenderer implements ImageRenderer {
         return bi;\r
     }\r
 \r
-\r
-    /**\r
-     * @return the buffered image\r
-     */\r
+    @Override\r
     public BufferedImage getImage() {\r
         return img;\r
     }\r
 \r
+    @Override\r
+    public BufferedImage getImage(Dimension dim) {\r
+        double w_old = img.getWidth();\r
+        double h_old = img.getHeight();\r
+        BufferedImage scaled = new BufferedImage((int)w_old, (int)h_old, BufferedImage.TYPE_INT_ARGB);\r
+        double w_new = dim.getWidth();\r
+        double h_new = dim.getHeight();\r
+        AffineTransform at = new AffineTransform();\r
+        at.scale(w_new/w_old, h_new/h_old);\r
+        AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);\r
+        scaleOp.filter(img, scaled);\r
+        return scaled;\r
+    }\r
+\r
     @Override\r
     public Dimension getDimension() {\r
         return (img == null)\r
index 7362a0e4a5f2f2164c669335441fab9ca7c9ce7f..2bebffc2036a1110b82f2f45b70b8b001342a21d 100644 (file)
@@ -18,6 +18,7 @@
 package org.apache.poi.sl.draw;\r
 \r
 import java.awt.Color;\r
+import java.awt.Dimension;\r
 import java.awt.Graphics2D;\r
 import java.awt.LinearGradientPaint;\r
 import java.awt.MultipleGradientPaint.ColorSpaceType;\r
@@ -153,12 +154,20 @@ public class DrawPaint {
             renderer.setAlpha(alpha/100000.f);\r
         }\r
         \r
-        BufferedImage image = renderer.getImage();\r
+        Rectangle2D textAnchor = shape.getAnchor();\r
+        BufferedImage image;\r
+        if ("image/x-wmf".equals(fill.getContentType())) {\r
+            // don't rely on wmf dimensions, use dimension of anchor\r
+            // TODO: check pixels vs. points for image dimension \r
+            image = renderer.getImage(new Dimension((int)textAnchor.getWidth(), (int)textAnchor.getHeight()));\r
+        } else {\r
+            image = renderer.getImage();\r
+        }\r
+\r
         if(image == null) {\r
             LOG.log(POILogger.ERROR, "Can't load image data");\r
             return null;\r
         }\r
-        Rectangle2D textAnchor = shape.getAnchor();\r
         Paint paint = new java.awt.TexturePaint(image, textAnchor);\r
 \r
         return paint;\r
index 720699666033bde68ecfb72305bfb9e75aa25535..748b691dba489dfb293e3016fe6d0ebf48bac7b0 100644 (file)
@@ -408,6 +408,9 @@ public class DrawSimpleShape extends DrawShape {
 \r
                     presets.put(cusName, new CustomGeometry(cusGeom));\r
                 }\r
+                \r
+                staxFiltRd.close();\r
+                staxReader.close();\r
             } catch (Exception e) {\r
                 throw new RuntimeException("Unable to load preset geometries.", e);\r
             } finally {\r
index fed5d078cc12c9739a8a66522c1a49ff881141cb..6b8c49a143059b7341dcc7a72b8234a86cb4ed73 100644 (file)
  */\r
 package org.apache.poi.sl.draw;\r
 \r
-import java.awt.*;\r
-import java.awt.geom.AffineTransform;\r
+import java.awt.Dimension;\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.awt.image.RescaleOp;\r
-import java.io.*;\r
-\r
-import javax.imageio.ImageIO;\r
-\r
-import org.apache.poi.util.POILogFactory;\r
-import org.apache.poi.util.POILogger;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
 \r
 /**\r
  * Classes can implement this interfaces to support other formats, for\r
@@ -109,6 +105,14 @@ public interface ImageRenderer {
      * @return the image as buffered image\r
      */\r
     BufferedImage getImage();\r
+\r
+    /**\r
+     * @param dim the dimension in pixels of the returned image\r
+     * @return the image as buffered image\r
+     * \r
+     * @since POI 3.15-beta2\r
+     */\r
+    BufferedImage getImage(Dimension dim);\r
     \r
     /**\r
      * Render picture data into the supplied graphics\r
index 7fb12eac8d331b876384b5729522d4a0a0b01fce..83d944bf2240a8a3295d6ef368faf5009564a715 100644 (file)
@@ -160,6 +160,9 @@ public class PPTX2PNG {
                     File outfile = new File(outdir, outname);\r
                     ImageIO.write(img, format, outfile);\r
                 }\r
+                \r
+                graphics.dispose();\r
+                img.flush();\r
             }\r
         } finally {\r
             ss.close();\r
index ad6cacbdc5d1bb9646fc62e1a6ac7432d189dd94..ab69ea6d53115332394a10fd94040ecbbdb56daf 100644 (file)
@@ -72,18 +72,22 @@ public class HwmfSLImageRenderer implements ImageRenderer {
 \r
     @Override\r
     public BufferedImage getImage() {\r
+        return getImage(getDimension());\r
+    }\r
+\r
+    @Override\r
+    public BufferedImage getImage(Dimension dim) {\r
         if (image == null) {\r
             return new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); \r
         }\r
         \r
-        Dimension dim = getDimension();\r
         BufferedImage bufImg = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), BufferedImage.TYPE_INT_ARGB);\r
         Graphics2D g = bufImg.createGraphics();\r
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
         g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);\r
         g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);\r
         g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);\r
-        image.draw(g);\r
+        image.draw(g, new Rectangle2D.Double(0,0,dim.getWidth(),dim.getHeight()));\r
         g.dispose();\r
         \r
         if (alpha != 0) {\r
@@ -97,7 +101,7 @@ public class HwmfSLImageRenderer implements ImageRenderer {
         \r
         return bufImg;\r
     }\r
-\r
+    \r
     @Override\r
     public boolean drawImage(Graphics2D graphics, Rectangle2D anchor) {\r
         return drawImage(graphics, anchor, null);\r