From cf4bca7813da34114218f51369d874e6327abcfe Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Tue, 14 Jun 2011 23:41:26 -0700 Subject: [PATCH] completed async font loading framework --- pdf.js | 25 ++++++++++++++++++++----- test.html | 7 +++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/pdf.js b/pdf.js index 5aec4e76a..633437e7e 100644 --- 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); + } + } } } diff --git a/test.html b/test.html index f78f22ce2..e59d0577e 100644 --- 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();