});
};
- // 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;
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) {
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;
};
Promise.prototype = {
+ hasData: false,
+
set data(data) {
if (data === undefined) {
return;
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() {
}
return this.$data;
},
+
+ onData: function(callback) {
+ if (this.$data !== EMPTY_PROMISE) {
+ callback(this.$data);
+ } else {
+ this.$onDataCallback = callback;
+ }
+ },
resolve: function(data) {
if (this.isResolved) {
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) {
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);
}
}
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);
}