"31": "hvcurveto"
};
- function decodeCharString(aStream) {
- var start = Date.now();
+ function decodeCharString(aArray) {
var charString = [];
var value = "";
- var count = aStream.length;
+ var count = aArray.length;
for (var i = 0; i < count; i++) {
- value = aStream.getByte();
+ value = parseInt(aArray[i]);
if (value < 32) {
var command = null;
if (value == 12) {
- var escape = aStream.getByte();
+ var escape = aArray[++i];
command = charStringDictionary["12"][escape];
- i++;
} else {
command = charStringDictionary[value];
}
// Some charstring commands are meaningless in Type2 and will return
// a null, let's just ignored them
- if (!command && i < count)
+ if (!command && i < count) {
continue;
- else if (!command)
+ } else if (!command) {
break;
- else if (command == -1) {
+ } else if (command == -1) {
log("decodeCharstring: " + charString);
error("Support for Type1 command " + value + " (" + escape + ") is not implemented");
}
} else if (value <= 246) {
value = parseInt(value) - 139;
} else if (value <= 250) {
- value = ((value - 247) * 256) + parseInt(aStream.getByte()) + 108;
- i++;
+ value = ((value - 247) * 256) + parseInt(aArray[++i]) + 108;
} else if (value <= 254) {
- value = -((value - 251) * 256) - parseInt(aStream.getByte()) - 108;
- i++;
+ value = -((value - 251) * 256) - parseInt(aArray[++i]) - 108;
} else {
- var byte = aStream.getByte();
+ var byte = aArray[++i];
var high = (byte >> 1);
- value = (byte - high) << 24 | aStream.getByte() << 16 |
- aStream.getByte() << 8 | aStream.getByte();
- i += 4;
+ value = (byte - high) << 24 | aArray[++i] << 16 |
+ aArray[++i] << 8 | aArray[++i];
}
charString.push(value);
}
- var end = Date.now();
- dump("Time to decode charString of length " + count + " is " + (end - start));
return charString;
};
if (inSubrs && c == 0x52) {
length = parseInt(length);
var data = eexecString.slice(i + 3, i + 3 + length);
- var encodedSubr = decrypt(data, kCharStringsEncryptionKey, 4).join("");
- var subr = decodeCharString(new StringStream(encodedSubr));
+ var encodedSubr = decrypt(data, kCharStringsEncryptionKey, 4, true);
+ var subr = decodeCharString(encodedSubr);
subrs.push(subr);
i += 3 + length;
} else if (inGlyphs && c == 0x52) {
length = parseInt(length);
var data = eexecString.slice(i + 3, i + 3 + length);
- var encodedCharstring = decrypt(data, kCharStringsEncryptionKey, 4).join("");
- var subr = decodeCharString(new StringStream(encodedCharstring));
+ var encodedCharstring = decrypt(data, kCharStringsEncryptionKey, 4, true);
+ var subr = decodeCharString(encodedCharstring);
glyphs.push({
glyph: glyph,
fontInfo.name = aFontName;
fontInfo.bbox = aFontBBox;
- // XXX
+ // XXX This hold the glyph data as if, this should be improved
this.glyphs = fontInfo.charstrings;
this.data = this.convertToCFF(fontInfo);
var end = Date.now();
- //log("Time to parse font is:" + (end - start));
};
CFF.prototype = {
},
flattenCharstring: function(aCharstring, aSubrs) {
+ var original = aCharstring.slice();
var i = 0;
while (true) {
var obj = aCharstring[i];
if (obj.charAt) {
switch (obj) {
case "callsubr":
- var subr = aSubrs[aCharstring[i- 1]].slice();
+ if (aCharstring[i - 1] == 351) {
+ log(original);
+ log(aCharstring);
+ error("...");
+ aCharstring.splice(i - 1, 2);
+ continue;
+ }
+
+ var subr = aSubrs[aCharstring[i - 1]].slice();
if (subr.length > 1) {
subr = this.flattenCharstring(subr, aSubrs);
subr.pop();