]> git.parisson.com Git - pdf.js.git/commitdiff
Merge the stream handling changes with the Font code
authorVivien Nicolas <21@vingtetun.org>
Mon, 13 Jun 2011 16:59:46 +0000 (18:59 +0200)
committerVivien Nicolas <21@vingtetun.org>
Mon, 13 Jun 2011 16:59:46 +0000 (18:59 +0200)
PDFFont.js
pdf.js

index 7abd9aa65dabdc6128a16fab2780688c82ccb0d8..39d27606ba1bb0e2d824135145a1c870e4763dc1 100644 (file)
@@ -20,7 +20,6 @@ var kMaxGlyphsCount = 1024;
  */
 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).
@@ -44,10 +43,6 @@ var Font = function(aFontName, aFontFile, aFontType) {
   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";
 
@@ -569,7 +564,7 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
     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));
@@ -949,7 +944,6 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
           // 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;
 
@@ -989,13 +983,12 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
           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
@@ -1144,22 +1137,21 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
 };
 
 
-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 = {
diff --git a/pdf.js b/pdf.js
index 37c93a4ad802cd28375dd85052fc9f9e5831d9b0..8d55ff2aca6b5e5212e2434bd10a8437deab72d8 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -48,26 +48,24 @@ function shadow(obj, prop, value) {
 }
 
 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]);
         },
@@ -89,11 +87,8 @@ var Stream = (function() {
         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);
         }
     };