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 2016/04/19 18:02:02 UTC

svn commit: r1739952 - /pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java

Author: tilman
Date: Tue Apr 19 16:02:02 2016
New Revision: 1739952

URL: http://svn.apache.org/viewvc?rev=1739952&view=rev
Log:
PDFBOX-3319: correct handling of partially monospaced fonts

Modified:
    pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java

Modified: pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java?rev=1739952&r1=1739951&r2=1739952&view=diff
==============================================================================
--- pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java (original)
+++ pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java Tue Apr 19 16:02:02 2016
@@ -249,7 +249,14 @@ public final class TTFSubsetter
         writeSInt16(out, h.getReserved4());
         writeSInt16(out, h.getReserved5());
         writeSInt16(out, h.getMetricDataFormat());
-        writeUint16(out, glyphIds.subSet(0, h.getNumberOfHMetrics()).size());
+
+        // is there a GID >= numberOfHMetrics ? Then keep the last entry of original hmtx table
+        int hmetrics = glyphIds.subSet(0, h.getNumberOfHMetrics()).size();
+        if (glyphIds.last() >= h.getNumberOfHMetrics())
+        {
+            ++hmetrics;
+        }
+        writeUint16(out, hmetrics);
 
         out.flush();
         return bos.toByteArray();
@@ -864,11 +871,21 @@ public final class TTFSubsetter
         HorizontalMetricsTable hm = ttf.getHorizontalMetrics();
         byte [] buf = new byte[4];
         InputStream is = ttf.getOriginalData();
+        
+        // is there a GID >= numberOfHMetrics ? Then keep the last entry of original hmtx table
+        SortedSet<Integer> gidSet = glyphIds;
+        if (glyphIds.last() >= h.getNumberOfHMetrics())
+        {
+            // Create a deep copy of the glyph set that has the last entry
+            gidSet = new TreeSet<Integer>(glyphIds);
+            gidSet.add(ttf.getHorizontalHeader().getNumberOfHMetrics() - 1);
+        }
+        
         try
         {
             is.skip(hm.getOffset());
             long lastOff = 0;
-            for (Integer glyphId : glyphIds)
+            for (Integer glyphId : gidSet)
             {
                 // offset in original file
                 long off;