Try to skip mapping of missing TrueType glyphs

Also don't skip mapping of glyphs which are empty, if the corresponding charCode is included in toUnicode.
This commit is contained in:
Jonas Jenwald 2015-02-07 00:13:41 +01:00
parent 8174da61fb
commit 01e6565dd4
5 changed files with 32 additions and 5 deletions

View File

@ -4070,11 +4070,21 @@ var Font = (function FontClosure() {
} }
} }
var charCodeToGlyphId = [], charCode; var charCodeToGlyphId = [], charCode, toUnicode = properties.toUnicode;
function hasGlyph(glyphId, charCode) {
if (!missingGlyphs[glyphId]) {
return true;
}
if (charCode >= 0 && toUnicode.has(charCode)) {
return true;
}
return false;
}
if (properties.type === 'CIDFontType2') { if (properties.type === 'CIDFontType2') {
var cidToGidMap = properties.cidToGidMap || []; var cidToGidMap = properties.cidToGidMap || [];
var isCidToGidMapEmpty = cidToGidMap.length === 0; var isCidToGidMapEmpty = cidToGidMap.length === 0;
var toUnicode = properties.toUnicode;
properties.cMap.forEach(function(charCode, cid) { properties.cMap.forEach(function(charCode, cid) {
assert(cid <= 0xffff, 'Max size of CID is 65,535'); assert(cid <= 0xffff, 'Max size of CID is 65,535');
@ -4086,7 +4096,7 @@ var Font = (function FontClosure() {
} }
if (glyphId >= 0 && glyphId < numGlyphs && if (glyphId >= 0 && glyphId < numGlyphs &&
(!missingGlyphs[glyphId] || toUnicode.has(charCode))) { hasGlyph(glyphId, charCode)) {
charCodeToGlyphId[charCode] = glyphId; charCodeToGlyphId[charCode] = glyphId;
} }
}); });
@ -4146,7 +4156,8 @@ var Font = (function FontClosure() {
var found = false; var found = false;
for (i = 0; i < cmapMappingsLength; ++i) { for (i = 0; i < cmapMappingsLength; ++i) {
if (cmapMappings[i].charCode === unicodeOrCharCode) { if (cmapMappings[i].charCode === unicodeOrCharCode &&
hasGlyph(cmapMappings[i].glyphId, unicodeOrCharCode)) {
charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
found = true; found = true;
break; break;
@ -4156,7 +4167,7 @@ var Font = (function FontClosure() {
// Try to map using the post table. There are currently no known // Try to map using the post table. There are currently no known
// pdfs that this fixes. // pdfs that this fixes.
var glyphId = properties.glyphNames.indexOf(glyphName); var glyphId = properties.glyphNames.indexOf(glyphName);
if (glyphId > 0) { if (glyphId > 0 && hasGlyph(glyphId, -1)) {
charCodeToGlyphId[charCode] = glyphId; charCodeToGlyphId[charCode] = glyphId;
} }
} }

View File

@ -59,6 +59,8 @@
!zerowidthline.pdf !zerowidthline.pdf
!bug868745.pdf !bug868745.pdf
!mmtype1.pdf !mmtype1.pdf
!issue5704.pdf
!bug893730.pdf
!bug864847.pdf !bug864847.pdf
!issue1002.pdf !issue1002.pdf
!issue925.pdf !issue925.pdf

BIN
test/pdfs/bug893730.pdf Normal file

Binary file not shown.

BIN
test/pdfs/issue5704.pdf Normal file

Binary file not shown.

View File

@ -1022,6 +1022,20 @@
"link": true, "link": true,
"type": "eq" "type": "eq"
}, },
{ "id": "issue5704",
"file": "pdfs/issue5704.pdf",
"md5": "6e0b62585feef24dff2d7e7687cd8128",
"rounds": 1,
"link": false,
"type": "eq"
},
{ "id": "bug893730",
"file": "pdfs/bug893730.pdf",
"md5": "2587379fb1b3bbff89c14f0863e78383",
"rounds": 1,
"link": false,
"type": "eq"
},
{ "id": "pdfkit_compressed", { "id": "pdfkit_compressed",
"file": "pdfs/pdfkit_compressed.pdf", "file": "pdfs/pdfkit_compressed.pdf",
"md5": "ffe9c571d0a1572e234253e6c7cdee6c", "md5": "ffe9c571d0a1572e234253e6c7cdee6c",