]> git.parisson.com Git - pdf.js.git/commitdiff
Track loaded such that setFont doesnt need to touch xref anymore
authorJulian Viereck <julian.viereck@gmail.com>
Mon, 5 Sep 2011 16:26:07 +0000 (09:26 -0700)
committerJulian Viereck <julian.viereck@gmail.com>
Thu, 15 Sep 2011 15:12:27 +0000 (08:12 -0700)
pdf.js

diff --git a/pdf.js b/pdf.js
index 37afdc3765c066b995d32225db93e44dd9579c96..e53ff1cb3ecee33960550b3559d3e300bb3ad1ba 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -4051,6 +4051,8 @@ var EvalState = (function() {
   return constructor;
 })();
 
+var FontsMap = {};
+
 var PartialEvaluator = (function() {
   function constructor() {
     this.state = new EvalState();
@@ -4208,17 +4210,23 @@ var PartialEvaluator = (function() {
                 images.bind(xobj); // monitoring image load
             }
           } else if (cmd == 'Tf') { // eagerly collect all fonts
-            var fontRes = resources.get('Font');
-            if (fontRes) {
-              fontRes = xref.fetchIfRef(fontRes);
-              var font = xref.fetchIfRef(fontRes.get(args[0].name));
-              assertWellFormed(IsDict(font));
-              if (!font.translated) {
-                font.translated = this.translateFont(font, xref, resources);
-                if (fonts && font.translated) {
-                  // keep track of each font we translated so the caller can
-                  // load them asynchronously before calling display on a page
-                  fonts.push(font.translated);
+            var fontName = args[0].name;
+            
+            // Check if this font is known already and process it otherwise.
+            if (!FontsMap[fontName]) {
+              var fontRes = resources.get('Font');
+              if (fontRes) {
+                fontRes = xref.fetchIfRef(fontRes);
+                var font = xref.fetchIfRef(fontRes.get(fontName));
+                assertWellFormed(IsDict(font));
+                if (!font.translated) {
+                  font.translated = this.translateFont(font, xref, resources);
+                  if (fonts && font.translated) {
+                    // keep track of each font we translated so the caller can
+                    // load them asynchronously before calling display on a page
+                    fonts.push(font.translated);
+                    FontsMap[fontName] = font;
+                  }
                 }
               }
             }
@@ -4233,6 +4241,10 @@ var PartialEvaluator = (function() {
         }
       }
 
+      // Expose arrays for debugging purpose.
+      window.fnArray = fnArray;
+      window.argsArray = argsArray;
+
       return function(gfx) {
         for (var i = 0, length = argsArray.length; i < length; i++)
           gfx[fnArray[i]].apply(gfx, argsArray[i]);
@@ -4914,16 +4926,20 @@ var CanvasGraphics = (function() {
       this.current.leading = -leading;
     },
     setFont: function(fontRef, size) {
-      var font = this.xref.fetchIfRef(this.res.get('Font'));
-      if (!IsDict(font))
-        return;
-
-      font = font.get(fontRef.name);
-      font = this.xref.fetchIfRef(font);
-      if (!font)
-        return;
+      // Lookup the fontObj using fontRef only.
+      var fontRefName = fontRef.name;
+      var fontObj = FontsMap[fontRefName].fontObj;
+      
+      if (!fontObj) {
+        throw "Can't find font for " + fontRefName;
+      }
+      
+      var name = fontObj.loadedName;
+      if (!name) {
+        // TODO: fontDescriptor is not available, fallback to default font
+        name = 'sans-serif';
+      }
 
-      var fontObj = font.fontObj;
       this.current.font = fontObj;
       this.current.fontSize = size;