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