FOP-2715: Optimise PDFWriter writing out floats

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1799314 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
index 2ca66ef..34ffb72 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
@@ -21,6 +21,7 @@
 import java.text.DecimalFormatSymbols;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -39,6 +40,8 @@
 
 
 public class PDFWriter {
+    private DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US));
+    private Map<Float, String> floatCache = new HashMap<Float, String>();
     protected StringBuilder s = new StringBuilder();
     protected UniqueName key;
     private int currentMCID;
@@ -88,8 +91,14 @@
             s.append(" ");
         } else if (c instanceof COSFloat) {
             float f = ((COSFloat) c).floatValue();
-            s.append(new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US)).format(f));
+            if (!floatCache.containsKey(f)) {
+                addCache(f);
+            }
+            s.append(floatCache.get(f));
             s.append(" ");
+            if (floatCache.size() > 1024) {
+                floatCache.clear();
+            }
         } else if (c instanceof COSName) {
             COSName cn = (COSName)c;
             s.append("/" + key.getName(cn));
@@ -127,6 +136,11 @@
         }
     }
 
+    protected void addCache(float f) {
+        String formatted = df.format(f);
+        floatCache.put(f, formatted);
+    }
+
     private void updateMCID(Map.Entry<COSName, COSBase> cn, Collection<COSBase> dictArgs) {
         COSBase cosMCID = cn.getValue();
         assert cosMCID instanceof COSInteger;
diff --git a/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java
index 004f369..3e47daa 100644
--- a/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java
@@ -39,4 +39,26 @@
         Assert.assertEquals(pdfWriter.writeText(pdStream), text + "\n");
         Locale.setDefault(l);
     }
+
+    @Test
+    public void testFloatCache() throws IOException {
+        String text = "[1.1 1.1] a";
+        PDStream pdStream = new PDStream(new PDDocument(), new ByteArrayInputStream(text.getBytes("UTF-8")));
+        MyPDFWriter pdfWriter = new MyPDFWriter();
+        pdfWriter.writeText(pdStream);
+        Assert.assertEquals(pdfWriter.i, 1);
+    }
+
+    private static class MyPDFWriter extends PDFWriter {
+        int i;
+
+        public MyPDFWriter() {
+            super(null, 0);
+        }
+
+        protected void addCache(float f) {
+            super.addCache(f);
+            i++;
+        }
+    };
 }