*/
var Fonts = {};
-
/**
* 'Font' is the class the outside world should use, it encapsulate all the font
* decoding logics whatever type it is (assuming the font type is supported).
var start = Date.now();
switch (aFontType) {
case "Type1":
- // All Type1 font program should begin with the comment %!
- if (aFontFile.getByte() != 0x25 || aFontFile.getByte() != 0x21)
- error("Invalid file header");
-
var cff = new CFF(aFontName, aFontFile);
this.mimetype = "font/otf";
var decryptedString = [];
var value = "";
- var count = aStream.length;
+ var count = aStream.length - aStream.start;
for (var i = 0; i < count; i++) {
value = aStream.getByte();
decryptedString[i] = String.fromCharCode(value ^ (r >> 8));
// and start interpreting it in order to decode it
var file = operandStack.pop();
var eexecString = decrypt(aBinaryStream, kEexecEncryptionKey, 4).join("");
- dump(eexecString);
lexer = new Lexer(new StringStream(eexecString));
break;
var file = operandStack.pop();
// Add '1' because of the space separator, this is dirty
- var stream = lexer.stream.makeSubStream(lexer.stream.pos + 1, size);
+ var stream = lexer.stream.makeSubStream(lexer.stream.start + lexer.stream.pos + 1, size);
lexer.stream.skip(size + 1);
var charString = decrypt(stream, kCharStringsEncryptionKey, 4).join("");
var charStream = new StringStream(charString);
var decodedCharString = decodeCharString(charStream);
- dump("decodedCharString: " + decodedCharString);
operandStack.push(decodedCharString);
// boolean indicating if the operation is a success or not
};
-var fontCount = 0;
var CFF = function(aFontName, aFontFile) {
- if (!fontCount || true) {
- fontCount++;
- var start = Date.now();
+ var start = Date.now();
- 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 length1 = aFontFile.dict.get("Length1");
+ var length2 = aFontFile.dict.get("Length2");
+ var pos = aFontFile.pos;
+ var ASCIIStream = aFontFile.makeSubStream(pos, length1, aFontFile.dict);
+ var binaryStream = aFontFile.makeSubStream(pos + length1, length2, aFontFile.dict);
- this.parser = new Type1Parser(ASCIIStream, binaryStream);
- var fontName = this.parser.parse();
- this.font = PSFonts.get(fontName);
- this.data = this.convertToCFF(this.font);
- var end = Date.now();
- //log("Time to parse font is:" + (end - start));
- }
+ this.parser = new Type1Parser(ASCIIStream, binaryStream);
+ var fontName = this.parser.parse();
+ this.font = PSFonts.get(fontName);
+ this.data = this.convertToCFF(this.font);
+ var end = Date.now();
+ //log("Time to parse font is:" + (end - start));
};
CFF.prototype = {
}
var Stream = (function() {
- function constructor(arrayBuffer, dict) {
+ function constructor(arrayBuffer, start, length, dict) {
this.bytes = new Uint8Array(arrayBuffer);
- this.pos = 0;
- this.start = 0;
+ this.start = start || 0;
+ this.pos = this.start;
+ this.length = (start + length) || arrayBuffer.byteLength;
this.dict = dict;
}
constructor.prototype = {
- get length() {
- return this.bytes.length;
- },
getByte: function() {
var bytes = this.bytes;
- if (this.pos >= bytes.length)
+ if (this.pos >= this.length)
return -1;
return bytes[this.pos++];
},
lookChar: function() {
var bytes = this.bytes;
- if (this.pos >= bytes.length)
+ if (this.pos >= this.length)
return;
return String.fromCharCode(bytes[this.pos]);
},
moveStart: function() {
this.start = this.pos;
},
- makeSubStream: function(pos, length, dict) {
- var buffer = this.bytes.buffer;
- if (length)
- return new Stream(new Uint8Array(buffer, pos, length), dict);
- return new Stream(new Uint8Array(buffer, pos), dict);
+ makeSubStream: function(start, length, dict) {
+ return new Stream(this.bytes.buffer, start, length, dict);
}
};