You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2018/03/04 12:38:32 UTC

svn commit: r1825812 - in /pdfbox/trunk: ./ fontbox/src/main/java/org/apache/fontbox/cmap/ fontbox/src/test/java/org/apache/fontbox/cmap/ fontbox/src/test/resources/cmap/

Author: lehmi
Date: Sun Mar  4 12:38:32 2018
New Revision: 1825812

URL: http://svn.apache.org/viewvc?rev=1825812&view=rev
Log:
PDFBOX-4139: replace single value cidranges with a simple mapping, merge consecutive cidranges

Modified:
    pdfbox/trunk/   (props changed)
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java
    pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java
    pdfbox/trunk/fontbox/src/test/resources/cmap/CMapTest

Propchange: pdfbox/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Mar  4 12:38:32 2018
@@ -1,3 +1,3 @@
-/pdfbox/branches/2.0:1760418,1761484,1762133,1763609,1779822,1780783,1780789,1782684,1784450,1792784,1795704,1795712,1799081-1799082,1814046,1814285,1814459,1824914
+/pdfbox/branches/2.0:1760418,1761484,1762133,1763609,1779822,1780783,1780789,1782684,1784450,1792784,1795704,1795712,1799081-1799082,1814046,1814285,1814459,1824914,1825811
 /pdfbox/branches/no-awt:1618517-1621410
 /pdfbox/no-awt:1618514-1618516

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java?rev=1825812&r1=1825811&r2=1825812&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java Sun Mar  4 12:38:32 2018
@@ -25,7 +25,7 @@ class CIDRange
 
     private final char from;
 
-    private final char to;
+    private char to;
 
     private final int cid;
 
@@ -66,4 +66,23 @@ class CIDRange
         return -1;
     }
 
+    /**
+     * Check if the given values represent a consecutive range of the given range. If so, extend the given range instead
+     * of creating a new one.
+     * 
+     * @param newFrom start value of the new range
+     * @param newTo end value of the new range
+     * @param newCid start CID value of the range
+     * @return true if the given range was extended
+     */
+    public boolean extend(char newFrom, char newTo, int newCid)
+    {
+        if ((newFrom == to + 1) && (newCid == cid + to - from + 1))
+        {
+            to = newTo;
+            return true;
+        }
+        return false;
+    }
+
 }

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java?rev=1825812&r1=1825811&r2=1825812&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java Sun Mar  4 12:38:32 2018
@@ -218,7 +218,15 @@ public class CMap
      */
     void addCIDRange(char from, char to, int cid)
     {
-        codeToCidRanges.add(new CIDRange(from, to, cid));
+        CIDRange lastRange = null;
+        if (!codeToCidRanges.isEmpty())
+        {
+            lastRange = codeToCidRanges.get(codeToCidRanges.size() - 1);
+        }
+        if (lastRange == null || !lastRange.extend(from, to, cid))
+        {
+            codeToCidRanges.add(new CIDRange(from, to, cid));
+        }
     }
 
     /**

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java?rev=1825812&r1=1825811&r2=1825812&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java Sun Mar  4 12:38:32 2018
@@ -296,7 +296,15 @@ public class CMapParser
             int mappedCode = (Integer) parseNextToken(cmapStream);
             if (startCode.length <= 2 && endCode.length <= 2)
             {
-                result.addCIDRange((char) start, (char) end, mappedCode);
+                // some CMaps are using CID ranges to map single values
+                if (end == start)
+                {
+                    result.addCIDMapping(start, mappedCode);
+                }
+                else
+                {
+                    result.addCIDRange((char) start, (char) end, mappedCode);
+                }
             }
             else
             {

Modified: pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java?rev=1825812&r1=1825811&r2=1825812&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java (original)
+++ pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java Sun Mar  4 12:38:32 2018
@@ -70,6 +70,23 @@ public class TestCMapParser extends Test
         int cid3 = 520;
         int strCID3 = 0x0208;
         assertEquals("CID 520 from cidchar <0208> 520", strCID3, cMap.toCID(cid3));
+
+        int cid4 = 300;
+        int strCID4 = 0x12C;
+        assertEquals("CID 300 from cidrange <0300> <0300> 300", strCID4, cMap.toCID(cid4));
+    }
+
+    public void testIdentity() throws IOException
+    {
+        final String resourceDir = "src/main/resources/org/apache/fontbox/cmap";
+        File inDir = new File(resourceDir);
+
+        CMapParser parser = new CMapParser();
+        CMap cMap = parser.parse(new File(inDir, "Identity-H"));
+
+        assertEquals("Indentity-H CID 65", 65, cMap.toCID(65));
+        assertEquals("Indentity-H CID 12345", 12345, cMap.toCID(12345));
+        assertEquals("Indentity-H CID 0xFFFF", 0xFFFF, cMap.toCID(0xFFFF));
     }
 
     /**

Modified: pdfbox/trunk/fontbox/src/test/resources/cmap/CMapTest
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/test/resources/cmap/CMapTest?rev=1825812&r1=1825811&r2=1825812&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/test/resources/cmap/CMapTest (original)
+++ pdfbox/trunk/fontbox/src/test/resources/cmap/CMapTest Sun Mar  4 12:38:32 2018
@@ -40,6 +40,7 @@ endcidchar
 2 begincidrange
 <0000> <00ff> 0
 <0100> <01ff> 256
+<0300> <0300> 300
 endcidrange
 
 endcmap