From 0bef50d56d008e99e04878ba56e04809188d6298 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Thu, 3 Aug 2017 22:19:36 -0700 Subject: [PATCH] Fix two cmap related issues. In issue #8707, there's a char code mapped to a non- existing glyph which shouldn't be drawn. However, we saw it was missing and tried to then use the post table and end up mapping it incorrectly. This illuminated a problem with issue #5704 and bug 893730 where glyphs disappeared after above fix. This was from the cmap returning the wrong glyph id. Which in turn was caused because the font had multiple of the same type of cmap table and we were choosing the last one. Now, we instead default to the first one. I'm unsure if we should instead be merging the multiple cmaps, but using only the first one works. --- src/core/fonts.js | 15 ++++++++++----- test/pdfs/.gitignore | 1 + test/pdfs/issue8707.pdf | Bin 0 -> 10055 bytes test/test_manifest.json | 7 +++++++ 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 test/pdfs/issue8707.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index 43f7df8da..7f62283ea 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -1353,6 +1353,13 @@ var Font = (function FontClosure() { var offset = font.getInt32() >>> 0; var useTable = false; + // Sometimes there are multiple of the same type of table. Default + // to choosing the first table and skip the rest. + if (potentialTable && potentialTable.platformId === platformId && + potentialTable.encodingId === encodingId) { + continue; + } + if (platformId === 0 && encodingId === 0) { useTable = true; // Continue the loop since there still may be a higher priority @@ -2393,11 +2400,9 @@ var Font = (function FontClosure() { if (cmapMappings[i].charCode !== unicodeOrCharCode) { continue; } - if (hasGlyph(cmapMappings[i].glyphId)) { - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - found = true; - break; - } + charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; + found = true; + break; } if (!found && properties.glyphNames) { // Try to map using the post table. diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 9dc334de0..0e0cd9a46 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -56,6 +56,7 @@ !issue8480.pdf !issue8570.pdf !issue8697.pdf +!issue8707.pdf !bad-PageLabels.pdf !filled-background.pdf !ArabicCIDTrueType.pdf diff --git a/test/pdfs/issue8707.pdf b/test/pdfs/issue8707.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ffc5a3d6ad2fc7f1be0047e0e837bbb553b1ffb1 GIT binary patch literal 10055 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index b33f30b10..d4d6aec6f 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -682,6 +682,13 @@ "link": false, "type": "eq" }, + { "id": "issue8707", + "file": "pdfs/issue8707.pdf", + "md5": "d3dc670adde9ec9fb82c974027033029", + "rounds": 1, + "link": false, + "type": "eq" + }, { "id": "issue5509", "file": "pdfs/issue5509.pdf", "md5": "1975ef8db7355b1d691bc79d0749574b",