Author: lehmi Date: Sun Mar 4 12:36:15 2018 New Revision: 1825811 URL: http://svn.apache.org/viewvc?rev=1825811&view=rev Log: PDFBOX-4139: replace single value cidranges with a simple mapping, merge consecutive cidranges
Modified: pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java pdfbox/branches/2.0/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java pdfbox/branches/2.0/fontbox/src/test/resources/cmap/CMapTest Modified: pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java?rev=1825811&r1=1825810&r2=1825811&view=diff ============================================================================== --- pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java (original) +++ pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CIDRange.java Sun Mar 4 12:36:15 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/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java?rev=1825811&r1=1825810&r2=1825811&view=diff ============================================================================== --- pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java (original) +++ pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java Sun Mar 4 12:36:15 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/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java?rev=1825811&r1=1825810&r2=1825811&view=diff ============================================================================== --- pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java (original) +++ pdfbox/branches/2.0/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java Sun Mar 4 12:36:15 2018 @@ -302,7 +302,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/branches/2.0/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java?rev=1825811&r1=1825810&r2=1825811&view=diff ============================================================================== --- pdfbox/branches/2.0/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java (original) +++ pdfbox/branches/2.0/fontbox/src/test/java/org/apache/fontbox/cmap/TestCMapParser.java Sun Mar 4 12:36:15 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/branches/2.0/fontbox/src/test/resources/cmap/CMapTest URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/fontbox/src/test/resources/cmap/CMapTest?rev=1825811&r1=1825810&r2=1825811&view=diff ============================================================================== --- pdfbox/branches/2.0/fontbox/src/test/resources/cmap/CMapTest (original) +++ pdfbox/branches/2.0/fontbox/src/test/resources/cmap/CMapTest Sun Mar 4 12:36:15 2018 @@ -40,6 +40,7 @@ endcidchar 2 begincidrange <0000> <00ff> 0 <0100> <01ff> 256 +<0300> <0300> 300 endcidrange endcmap