You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2017/04/18 16:30:53 UTC
svn commit: r1791809 - in /pdfbox/trunk/fontbox/src:
main/java/org/apache/fontbox/ttf/TTFSubsetter.java
test/java/org/apache/fontbox/ttf/TTFSubsetterTest.java
Author: tilman
Date: Tue Apr 18 16:30:53 2017
New Revision: 1791809
URL: http://svn.apache.org/viewvc?rev=1791809&view=rev
Log:
PDFBOX-3757: use LinkedHashMap instead of TreeMap to iterate in insertion order
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java
pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TTFSubsetterTest.java
Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java?rev=1791809&r1=1791808&r2=1791809&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java Tue Apr 18 16:30:53 2017
@@ -27,6 +27,7 @@ import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -829,7 +830,7 @@ public final class TTFSubsetter
writeUint16(out, glyphIds.size());
// glyphNameIndex[numGlyphs]
- Map<String, Integer> names = new TreeMap<>();
+ Map<String, Integer> names = new LinkedHashMap<>();
for (int gid : glyphIds)
{
String name = post.getName(gid);
Modified: pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TTFSubsetterTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TTFSubsetterTest.java?rev=1791809&r1=1791808&r2=1791809&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TTFSubsetterTest.java (original)
+++ pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TTFSubsetterTest.java Tue Apr 18 16:30:53 2017
@@ -23,12 +23,15 @@ import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import org.apache.fontbox.util.autodetect.FontFileFinder;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
@@ -232,4 +235,42 @@ public class TTFSubsetterTest
}
subset.close();
}
+
+ /**
+ * Test of PDFBOX-3757: check that postcript names that are not part of WGL4Names don't get
+ * shuffled in buildPostTable().
+ *
+ * @throws java.io.IOException
+ */
+ @Test
+ public void testPDFBox3757() throws IOException
+ {
+ final File testFile = new File("src/test/resources/ttf/LiberationSans-Regular.ttf");
+ TrueTypeFont ttf = new TTFParser().parse(testFile);
+ TTFSubsetter ttfSubsetter = new TTFSubsetter(ttf);
+ ttfSubsetter.add('Ö');
+ ttfSubsetter.add('\u200A');
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ttfSubsetter.writeToStream(baos);
+ try (TrueTypeFont subset = new TTFParser(true).parse(new ByteArrayInputStream(baos.toByteArray())))
+ {
+ assertEquals(5, subset.getNumberOfGlyphs());
+
+ assertEquals(0, subset.nameToGID(".notdef"));
+ assertEquals(1, subset.nameToGID("O"));
+ assertEquals(2, subset.nameToGID("Odieresis"));
+ assertEquals(3, subset.nameToGID("uni200A"));
+ assertEquals(4, subset.nameToGID("dieresis.uc"));
+
+ PostScriptTable pst = subset.getPostScript();
+ assertEquals(pst.getName(0), ".notdef");
+ assertEquals(pst.getName(1), "O");
+ assertEquals(pst.getName(2), "Odieresis");
+ assertEquals(pst.getName(3), "uni200A");
+ assertEquals(pst.getName(4), "dieresis.uc");
+
+ assertTrue("Hair space path should be empty", subset.getPath("uni200A").getBounds2D().isEmpty());
+ assertFalse("UC dieresis path should not be empty", subset.getPath("dieresis.uc").getBounds2D().isEmpty());
+ }
+ }
}