Add the 'for' keyword and support 2's complement signed integer

This commit is contained in:
Vivien Nicolas 2011-06-04 00:43:50 +02:00
parent a08691313f
commit c166db13fd
2 changed files with 33 additions and 14 deletions

View File

@ -153,7 +153,11 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
value = -((value - 251) * 256) - parseInt(aStream.getByte()) - 108; value = -((value - 251) * 256) - parseInt(aStream.getByte()) - 108;
count++; count++;
} else { } else {
error("Two complement signed integers are ignored for the moment"); var byte = aStream.getByte();
var high = (byte >> 1);
value = (byte - high) * 16777216 + aStream.getByte() * 65536 +
aStream.getByte() * 256 * + aStream.getByte();
count += 4;
} }
charString.push(value); charString.push(value);
@ -372,6 +376,17 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
executionStack.push(bool ? procedure2 : procedure1); executionStack.push(bool ? procedure2 : procedure1);
break; break;
case "for":
var procedure = operandStack.pop();
var limit = operandStack.pop();
var increment = operandStack.pop();
var initial = operandStack.pop();
for (var i = 0; i < limit; i += increment) {
operandStack.push(i);
executionStack.push(procedure.slice());
}
break;
case "dup": case "dup":
dump("duplicate: " + operandStack.peek()); dump("duplicate: " + operandStack.peek());
operandStack.push(operandStack.peek()); operandStack.push(operandStack.peek());
@ -459,6 +474,12 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
case "def": case "def":
var value = operandStack.pop(); var value = operandStack.pop();
var key = operandStack.pop(); var key = operandStack.pop();
if (key == "FontName" && Fonts.get(value)) {
// The font has already be decoded, stop!
return true;
}
dump("def: " + key + " = " + value); dump("def: " + key + " = " + value);
dictionaryStack.peek().set(key, value); dictionaryStack.peek().set(key, value);
break; break;
@ -573,26 +594,20 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
}; };
var hack = true;
var Type1Font = function(aFontName, aFontFile) { var Type1Font = function(aFontName, aFontFile) {
// All Type1 font program should begin with the comment %! // All Type1 font program should begin with the comment %!
if (aFontFile.getByte() != 0x25 || aFontFile.getByte() != 0x21) if (aFontFile.getByte() != 0x25 || aFontFile.getByte() != 0x21)
error("Invalid file header"); error("Invalid file header");
if (hack) { var start = Date.now();
var start = Date.now();
var ASCIIStream = aFontFile.makeSubStream(0, aFontFile.dict.get("Length1"), aFontFile.dict); var ASCIIStream = aFontFile.makeSubStream(0, aFontFile.dict.get("Length1"), aFontFile.dict);
var binaryStream = aFontFile.makeSubStream(aFontFile.dict.get("Length1"), aFontFile.dict.get("Length2"), aFontFile.dict); var binaryStream = aFontFile.makeSubStream(aFontFile.dict.get("Length1"), aFontFile.dict.get("Length2"), aFontFile.dict);
this.parser = new Type1Parser(ASCIIStream, binaryStream); this.parser = new Type1Parser(ASCIIStream, binaryStream);
this.parser.parse(); this.parser.parse();
var end = Date.now(); var end = Date.now();
dump("Time to parse font is:" + (end - start)); dump("Time to parse font is:" + (end - start));
hack = false;
}
}; };

4
pdf.js
View File

@ -2291,6 +2291,10 @@ var CanvasGraphics = (function() {
TODO("support Type3 font"); TODO("support Type3 font");
break; break;
case "TrueType":
TODO("implement TrueType support");
break;
default: default:
error("Unsupported font type: " + subtype); error("Unsupported font type: " + subtype);
break; break;