From e26b5b3b00b8f3c54c6fc7cd029ab4cfa03e624c Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Thu, 1 Sep 2011 19:50:04 +0200 Subject: [PATCH] Show Type1 glyphs below 0x20, fix a bug in readNumberArray, read lenIV --- fonts.js | 42 ++++++++++++++++++++++++++---------------- pdf.js | 6 +++++- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/fonts.js b/fonts.js index 20f99932d..f17fdfc56 100755 --- a/fonts.js +++ b/fonts.js @@ -1439,7 +1439,6 @@ var Type1Parser = function() { var charstring = []; var lsb = 0; var width = 0; - var used = false; var value = ''; var count = array.length; @@ -1477,7 +1476,7 @@ var Type1Parser = function() { command = charStringDictionary['12'][escape]; } else { // TODO Clean this code - if (value == 13) { + if (value == 13) { //hsbw if (charstring.length == 2) { lsb = charstring[0]; width = charstring[1]; @@ -1509,7 +1508,7 @@ var Type1Parser = function() { } else if (command == -1) { error('Support for Type1 command ' + value + ' (' + escape + ') is not implemented in charstring: ' + - charString); + charstring); } value = command; @@ -1535,7 +1534,11 @@ var Type1Parser = function() { * array extracted from and eexec encrypted block of data */ function readNumberArray(str, index) { - var start = ++index; + var start = index; + while (str[index++] != '[') + start++; + start++; + var count = 0; while (str[index++] != ']') count++; @@ -1569,7 +1572,9 @@ var Type1Parser = function() { subrs: [], charstrings: [], properties: { - 'private': {} + 'private': { + 'lenIV': 4 + } } }; @@ -1592,9 +1597,12 @@ var Type1Parser = function() { }; var c = eexecStr[i]; - if ((glyphsSection || subrsSection) && c == 'R') { - var data = eexec.slice(i + 3, i + 3 + length); - var encoded = decrypt(data, kCharStringsEncryptionKey, 4); + if ((glyphsSection || subrsSection) && + (token == 'RD' || token == '-|')) { + i++; + var data = eexec.slice(i, i + length); + var lenIV = program.properties.private['lenIV']; + var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV); var str = decodeCharString(encoded); if (glyphsSection) { @@ -1607,7 +1615,8 @@ var Type1Parser = function() { } else { program.subrs.push(str.charstring); } - i += length + 3; + i += length; + token = ''; } else if (c == ' ' || c == '\n') { length = parseInt(token); token = ''; @@ -1624,7 +1633,7 @@ var Type1Parser = function() { getToken(); // read in 'array' for (var j = 0; j < num; ++j) { var t = getToken(); // read in 'dup' - if (t == 'ND') + if (t == 'ND' || t == '|-') break; var index = parseInt(getToken()); if (index > j) @@ -1646,7 +1655,7 @@ var Type1Parser = function() { case '/StemSnapH': case '/StemSnapV': program.properties.private[token.substring(1)] = - readNumberArray(eexecStr, i + 2); + readNumberArray(eexecStr, i + 1); break; case '/StdHW': case '/StdVW': @@ -1654,6 +1663,7 @@ var Type1Parser = function() { readNumberArray(eexecStr, i + 2)[0]; break; case '/BlueShift': + case '/lenIV': case '/BlueFuzz': case '/BlueScale': case '/LanguageGroup': @@ -1821,7 +1831,7 @@ var CFF = function(name, file, properties) { // Decrypt the data blocks and retrieve it's content var eexecBlock = file.getBytes(length2); - var data = type1Parser.extractFontProgram(eexecBlock, properties); + var data = type1Parser.extractFontProgram(eexecBlock); for (var info in data.properties) properties[info] = data.properties[info]; @@ -1987,11 +1997,10 @@ CFF.prototype = { var cmd = map[command]; assert(cmd, 'Unknow command: ' + command); - if (IsArray(cmd)) { + if (IsArray(cmd)) charstring.splice(i++, 1, cmd[0], cmd[1]); - } else { + else charstring[i] = cmd; - } } else { // Type1 charstring use a division for number above 32000 if (command > 32000) { @@ -2110,7 +2119,8 @@ CFF.prototype = { ExpansionFactor: '\x0c\x18' }; for (var field in fieldMap) { - if (!properties.private.hasOwnProperty(field)) continue; + if (!properties.private.hasOwnProperty(field)) + continue; var value = properties.private[field]; if (IsArray(value)) { diff --git a/pdf.js b/pdf.js index ec3cb0d75..2feade07e 100644 --- a/pdf.js +++ b/pdf.js @@ -4300,8 +4300,12 @@ var PartialEvaluator = (function() { var glyphsMap = {}; for (var i = firstChar; i <= lastChar; i++) { var glyph = diffEncoding[i] || baseEncoding[i]; - if (glyph) + if (glyph) { glyphsMap[glyph] = encodingMap[i] = GlyphsUnicode[glyph] || i; + if (glyphsMap[glyph] <= 0x1f) + glyphsMap[glyph] = encodingMap[i] += 0xE000; + + } } if (fontType == 'TrueType' && fontDict.has('ToUnicode') && differences) {