From 86b8f12b92242467e8ffde628aee496f0d488298 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Fri, 30 Sep 2011 15:38:54 +0200 Subject: [PATCH] Ensure dependent font data is available before calling startRenderingIRQueue --- pdf.js | 10 +++++----- worker.js | 37 +++++++++++++++++++++++++++++++++++-- worker/processor_handler.js | 18 ++++++++++++++++-- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/pdf.js b/pdf.js index df3150f93..77c57e528 100644 --- a/pdf.js +++ b/pdf.js @@ -3363,12 +3363,12 @@ var Page = (function() { }); }; - // this.ensureFonts(fonts, function() { + this.ensureFonts(fonts, function() { displayContinuation(); - // }); + }); }, - getIRQueue: function(handler) { + getIRQueue: function(handler, dependency) { if (this.IRQueue) { // content was compiled return this.IRQueue; @@ -3387,7 +3387,7 @@ var Page = (function() { var pe = this.pe = new PartialEvaluator(); var IRQueue = {}; - return this.IRQueue = pe.getIRQueue(content, xref, resources, IRQueue, handler, "p" + this.pageNumber + "_"); + return this.IRQueue = pe.getIRQueue(content, xref, resources, IRQueue, handler, "p" + this.pageNumber + "_", dependency); }, ensureFonts: function(fonts, callback) { @@ -4353,7 +4353,7 @@ var PartialEvaluator = (function() { if (font.translated) { // keep track of each font we translated so the caller can // load them asynchronously before calling display on a page - var loadedName = uniquePrefix + "font_" + (FontLoadedCounter++); + var loadedName = "font_" + getIRQueue + + (FontLoadedCounter++); font.translated.properties.loadedName = loadedName; FontsMap[loadedName] = font; diff --git a/worker.js b/worker.js index 8ffece46f..8148ff3f1 100644 --- a/worker.js +++ b/worker.js @@ -120,6 +120,8 @@ var Promise = (function() { }; Promise.prototype = { + hasData: false, + set data(data) { if (data === undefined) { return; @@ -128,6 +130,11 @@ var Promise = (function() { throw "Promise " + this.name + ": Cannot set the data of a promise twice"; } this.$data = data; + this.hasData = true; + + if (this.$onDataCallback) { + this.$onDataCallback(data); + } }, get data() { @@ -136,6 +143,14 @@ var Promise = (function() { } return this.$data; }, + + onData: function(callback) { + if (this.$data !== EMPTY_PROMISE) { + callback(this.$data); + } else { + this.$onDataCallback = callback; + } + }, resolve: function(data) { if (this.isResolved) { @@ -203,8 +218,26 @@ var WorkerPDFDoc = (function() { processorHandler.on("page", function(data) { var pageNum = data.pageNum; var page = this.pageCache[pageNum]; - - page.startRenderingFromIRQueue(data.IRQueue, data.fonts); + + var depFonts = data.depFonts; + + function checkFontData() { + // Check if all fontObjs have been processed. If not, shedule a + // callback that is called once the data arrives and that checks + // the next fonts. + for (var i = 0; i < depFonts.length; i++) { + var fontName = depFonts[i]; + var fontObj = Objects.get(fontName); + if (!fontObj.hasData) { + fontObj.onData(checkFontData); + } + } + + // At this point, all font data ia loaded. Start the actuall rendering. + page.startRenderingFromIRQueue(data.IRQueue, depFonts); + } + + checkFontData(); }, this); processorHandler.on("obj", function(data) { diff --git a/worker/processor_handler.js b/worker/processor_handler.js index b7a915f3d..28c89db10 100644 --- a/worker/processor_handler.js +++ b/worker/processor_handler.js @@ -21,8 +21,11 @@ var WorkerProcessorHandler = { var gfx = new CanvasGraphics(null); var start = Date.now(); + + var dependency = []; + // Pre compile the pdf page and fetch the fonts/images. - var IRQueue = page.getIRQueue(handler); + var IRQueue = page.getIRQueue(handler, dependency); console.log("page=%d - getIRQueue: time=%dms, len=%d", pageNum, Date.now() - start, IRQueue.fnArray.length); @@ -42,11 +45,22 @@ var WorkerProcessorHandler = { } } console.log("cmds", JSON.stringify(cmdMap)); - } + } + + // Filter the dependecies for fonts. + var fonts = {}; + for (var i = 0; i < dependency.length; i++) { + var dep = dependency[i]; + if (dep.indexOf('font_') == 0) { + fonts[dep] = true; + } + } + handler.send("page", { pageNum: pageNum, IRQueue: IRQueue, + depFonts: Object.keys(fonts) }); }, this); }