svn commit: r1799314 - in /xmlgraphics/fop-pdf-images/trunk: src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java

[email protected]
Newsgroups gmane.text.xml.fop.cvs
Message-ID <[email protected]>
Author: ssteiner
Date: Tue Jun 20 08:06:24 2017
New Revision: 1799314

URL: http://svn.apache.org/viewvc?rev=1799314&view=rev
Log:
FOP-2715: Optimise PDFWriter writing out floats

Modified:
    xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
    xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java

Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java?rev=1799314&r1=1799313&r2=1799314&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java Tue Jun 20 08:06:24 2017
@@ -21,6 +21,7 @@ import java.text.DecimalFormat;
 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 @@ import org.apache.pdfbox.pdmodel.common.
 
 
 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 @@ public class PDFWriter {
             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 @@ public class PDFWriter {
         }
     }
 
+    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;

Modified: xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java?rev=1799314&r1=1799313&r2=1799314&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java Tue Jun 20 08:06:24 2017
@@ -39,4 +39,26 @@ public class PDFWriterTestCase {
         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++;
+        }
+    };
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.