var charstring = [];
var lsb = 0;
var width = 0;
- var used = false;
var value = '';
var count = array.length;
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];
} else if (command == -1) {
error('Support for Type1 command ' + value +
' (' + escape + ') is not implemented in charstring: ' +
- charString);
+ charstring);
}
value = command;
* 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++;
subrs: [],
charstrings: [],
properties: {
- 'private': {}
+ 'private': {
+ 'lenIV': 4
+ }
}
};
};
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) {
} else {
program.subrs.push(str.charstring);
}
- i += length + 3;
+ i += length;
+ token = '';
} else if (c == ' ' || c == '\n') {
length = parseInt(token);
token = '';
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)
case '/StemSnapH':
case '/StemSnapV':
program.properties.private[token.substring(1)] =
- readNumberArray(eexecStr, i + 2);
+ readNumberArray(eexecStr, i + 1);
break;
case '/StdHW':
case '/StdVW':
readNumberArray(eexecStr, i + 2)[0];
break;
case '/BlueShift':
+ case '/lenIV':
case '/BlueFuzz':
case '/BlueScale':
case '/LanguageGroup':
// 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];
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) {
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)) {