]> git.parisson.com Git - pdf.js.git/commitdiff
completed async font loading framework
authorAndreas Gal <andreas.gal@gmail.com>
Wed, 15 Jun 2011 06:41:26 +0000 (23:41 -0700)
committerAndreas Gal <andreas.gal@gmail.com>
Wed, 15 Jun 2011 06:41:26 +0000 (23:41 -0700)
pdf.js
test.html

diff --git a/pdf.js b/pdf.js
index 5aec4e76abb27d03875a64e49e42361c0981be3e..633437e7e0f01027b651a7c70d7d56a193122aa9 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -1385,6 +1385,14 @@ var Page = (function() {
                                              ? obj
                                              : null));
         },
+        compile: function(gfx, fonts) {
+            if (!this.code) {
+                var xref = this.xref;
+                var content = xref.fetchIfRef(this.content);
+                var resources = xref.fetchIfRef(this.resources);
+                this.code = gfx.compile(content, xref, resources, fonts);
+            }
+        },
         display: function(gfx) {
             var xref = this.xref;
             var content = xref.fetchIfRef(this.content);
@@ -1395,8 +1403,6 @@ var Page = (function() {
             gfx.beginDrawing({ x: mediaBox[0], y: mediaBox[1],
                                width: mediaBox[2] - mediaBox[0],
                                height: mediaBox[3] - mediaBox[1] });
-            if (!this.code)
-                this.code = gfx.compile(content, xref, resources);
             gfx.execute(this.code, xref, resources);
             gfx.endDrawing();
         }
@@ -1701,7 +1707,7 @@ var CanvasGraphics = (function() {
             this.xref = savedXref;
         },
 
-        compile: function(stream, xref, resources) {
+        compile: function(stream, xref, resources, fonts) {
             var xobjs = xref.fetchIfRef(resources.get("XObject")) || new Dict();
 
             var parser = new Parser(new Lexer(stream), false);
@@ -1739,7 +1745,10 @@ var CanvasGraphics = (function() {
                             assertWellFormed(IsName(type), "XObject should have a Name subtype");
 
                             if ("Form" == type.name) {
-                                args[0].code = this.compile(xobj, xref, xobj.dict.get("Resources"));
+                                args[0].code = this.compile(xobj,
+                                                            xref,
+                                                            xobj.dict.get("Resources"),
+                                                            fonts);
                             }
                         }
                     } else if (cmd == "Tf") { // eagerly collect all fonts
@@ -1748,8 +1757,14 @@ var CanvasGraphics = (function() {
                             fontRes = xref.fetchIfRef(fontRes);
                             var font = xref.fetchIfRef(fontRes.get(args[0].name));
                             assertWellFormed(IsDict(font));
-                            if (!font.translated)
+                            if (!font.translated) {
                                 font.translated = this.translateFont(font);
+                                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);
+                                }
+                            }
                         }
                     }
 
index f78f22ce24387aaab0e2e025b1054c54953879b4..e59d0577ee2010acd55efc504bb9dd95b86c8833 100644 (file)
--- a/test.html
+++ b/test.html
@@ -95,6 +95,13 @@ function displayPage(num) {
     ctx.restore();
 
     var gfx = new CanvasGraphics(ctx);
+
+    // page.compile will collect all fonts for us, once we have loaded them
+    // we can trigger the actual page rendering with page.display
+    var fonts = [];
+    page.compile(gfx, fonts);
+
+    // This should be called when font loading is complete
     page.display(gfx);
 
     var t2 = Date.now();