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:36:16 UTC
svn commit: r1825811 - in /pdfbox/branches/2.0/fontbox/src:
main/java/org/apache/fontbox/cmap/ test/java/org/apache/fontbox/cmap/
test/resources/cmap/
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