Don't skip mapping of glyphs for CIDFontType2 fonts with a CIDToGIDMap

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-01-02 14:21:56 +01:00
parent cb27707277
commit 8174da61fb
5 changed files with 34 additions and 8 deletions

View File

@ -2203,6 +2203,10 @@ var ToUnicodeMap = (function ToUnicodeMapClosure() {
}
},
has: function(i) {
return this._map[i] !== undefined;
},
get: function(i) {
return this._map[i];
},
@ -2232,6 +2236,10 @@ var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() {
}
},
has: function (i) {
return this.firstChar <= i && i <= this.lastChar;
},
get: function (i) {
if (this.firstChar <= i && i <= this.lastChar) {
return String.fromCharCode(i);
@ -2664,7 +2672,6 @@ var Font = (function FontClosure() {
var isSymbolic = !!(properties.flags & FontFlags.Symbolic);
var isIdentityUnicode =
properties.toUnicode instanceof IdentityToUnicodeMap;
var isCidFontType2 = (properties.type === 'CIDFontType2');
var newMap = Object.create(null);
var toFontChar = [];
var usedFontCharCodes = [];
@ -2675,8 +2682,7 @@ var Font = (function FontClosure() {
var fontCharCode = originalCharCode;
// First try to map the value to a unicode position if a non identity map
// was created.
// console.log(fontCharCode);
if (!isIdentityUnicode && toUnicode.get(originalCharCode) !== undefined) {
if (!isIdentityUnicode && toUnicode.has(originalCharCode)) {
var unicode = toUnicode.get(fontCharCode);
// TODO: Try to map ligatures to the correct spot.
if (unicode.length === 1) {
@ -4040,8 +4046,9 @@ var Font = (function FontClosure() {
if (isTrueType) {
var isGlyphLocationsLong = int16(tables.head.data[50],
tables.head.data[51]);
missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs,
isGlyphLocationsLong, hintsValid, dupFirstEntry);
missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf,
numGlyphs, isGlyphLocationsLong,
hintsValid, dupFirstEntry);
}
if (!tables.hhea) {
@ -4066,17 +4073,20 @@ var Font = (function FontClosure() {
var charCodeToGlyphId = [], charCode;
if (properties.type === 'CIDFontType2') {
var cidToGidMap = properties.cidToGidMap || [];
var cidToGidMapLength = cidToGidMap.length;
var isCidToGidMapEmpty = cidToGidMap.length === 0;
var toUnicode = properties.toUnicode;
properties.cMap.forEach(function(charCode, cid) {
assert(cid <= 0xffff, 'Max size of CID is 65,535');
var glyphId = -1;
if (cidToGidMapLength === 0) {
if (isCidToGidMapEmpty) {
glyphId = charCode;
} else if (cidToGidMap[cid] !== undefined) {
glyphId = cidToGidMap[cid];
}
if (glyphId >= 0 && glyphId < numGlyphs && !missingGlyphs[charCode]) {
if (glyphId >= 0 && glyphId < numGlyphs &&
(!missingGlyphs[glyphId] || toUnicode.has(charCode))) {
charCodeToGlyphId[charCode] = glyphId;
}
});

View File

@ -18,6 +18,7 @@
!sizes.pdf
!close-path-bug.pdf
!issue4630.pdf
!issue5202.pdf
!issue5280.pdf
!alphatrans.pdf
!devicen.pdf
@ -62,6 +63,7 @@
!issue1002.pdf
!issue925.pdf
!issue2840.pdf
!issue4061.pdf
!issue4668.pdf
!issue5039.pdf
!issue5070.pdf

BIN
test/pdfs/issue4061.pdf Normal file

Binary file not shown.

BIN
test/pdfs/issue5202.pdf Normal file

Binary file not shown.

View File

@ -485,6 +485,20 @@
"lastPage": 1,
"type": "eq"
},
{ "id": "issue4061",
"file": "pdfs/issue4061.pdf",
"md5": "236aaa8840a47c3c061f8e3034549764",
"rounds": 1,
"link": false,
"type": "eq"
},
{ "id": "issue5202",
"file": "pdfs/issue5202.pdf",
"md5": "bb9cc69211112e66aab40828086a4e5a",
"rounds": 1,
"link": false,
"type": "eq"
},
{ "id": "issue5238",
"file": "pdfs/issue5238.pdf",
"md5": "6ddecda00893be1793de20a70c83a3c2",