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++;
+ }
+ };
}