First page is rendering using new worker infrastructure

This commit is contained in:
Julian Viereck 2011-09-05 18:12:03 -07:00
parent 5a1488df9f
commit cc17707da6
5 changed files with 62 additions and 30 deletions

11
pdf.js
View File

@ -3406,7 +3406,7 @@ var Page = (function() {
var exc = null; var exc = null;
// try { // try {
self.display(gfx); self.display(gfx);
stats.render = Date.now(); self.stats.render = Date.now();
// } catch (e) { // } catch (e) {
// exc = e.toString(); // exc = e.toString();
// } // }
@ -3416,7 +3416,7 @@ var Page = (function() {
this.ensureFonts(fonts, function() { this.ensureFonts(fonts, function() {
images.notifyOnLoad(function() { images.notifyOnLoad(function() {
stats.images = Date.now(); self.stats.images = Date.now();
displayContinuation(); displayContinuation();
}); });
}) })
@ -4294,10 +4294,6 @@ var PartialEvaluator = (function() {
} }
} }
// Expose arrays for debugging purpose.
window.fnArray = fnArray;
window.argsArray = argsArray;
return { return {
fnArray: fnArray, fnArray: fnArray,
argsArray: argsArray argsArray: argsArray
@ -4791,6 +4787,9 @@ var CanvasGraphics = (function() {
}, },
postCompile: function(raw) { postCompile: function(raw) {
if (!this.pe) {
this.pe = new PartialEvaluator();
}
return this.pe.evalFromRaw(raw); return this.pe.evalFromRaw(raw);
}, },

View File

@ -60,16 +60,29 @@ var WorkerPDFDoc = (function() {
this.pageCache = []; this.pageCache = [];
this.worker = new Worker("worker/boot.js"); this.worker = new Worker("../worker/boot.js");
this.handler = new MessageHandler({ this.handler = new MessageHandler("main", {
"page": function(data) { "page": function(data) {
var pageNum = data.pageNum; var pageNum = data.pageNum;
var page = this.pageCache[pageNum]; var page = this.pageCache[pageNum];
// Add necessary shape back to fonts.
var fonts = data.fonts;
for (var i = 0; i < fonts.length; i++) {
var font = fonts[i];
var fontFileDict = new Dict();
fontFileDict.map = font.file.dict.map;
var fontFile = new Stream(font.file.bytes, font.file.start,
font.file.end - font.file.start, fontFileDict);
font.file = new FlateStream(fontFile);
}
console.log("startRenderingFromPreCompilation:", "numberOfFonts", fonts.length);
page.startRenderingFromPreCompilation(data.preCompilation, data.fonts, data.images); page.startRenderingFromPreCompilation(data.preCompilation, data.fonts, data.images);
} }
}, this.worker.postMessage, this); }, this.worker, this);
this.worker.onmessage = this.handler.onMessage;
this.handler.send("doc", data); this.handler.send("doc", data);
} }
@ -80,7 +93,7 @@ var WorkerPDFDoc = (function() {
}, },
startRendering: function(page) { startRendering: function(page) {
this.handler.send("page", page.page.pageNumber); this.handler.send("page", page.page.pageNumber + 1);
}, },
getPage: function(n) { getPage: function(n) {

View File

@ -3,9 +3,8 @@
'use strict'; 'use strict';
//
importScripts('console.js'); importScripts('console.js');
importScripts('event_handler.js'); importScripts('message_handler.js');
importScripts('../pdf.js'); importScripts('../pdf.js');
importScripts('../fonts.js'); importScripts('../fonts.js');
importScripts('../crypto.js'); importScripts('../crypto.js');
@ -14,9 +13,9 @@ importScripts('../glyphlist.js');
// Listen for messages from the main thread. // Listen for messages from the main thread.
var pdfDoc = null; var pdfDoc = null;
var handler = new MessageHandler({ var handler = new MessageHandler("worker", {
"doc": function(data) { "doc": function(data) {
pdfDocument = new PDFDoc(new Stream(data)); pdfDoc = new PDFDoc(new Stream(data));
console.log("setup pdfDoc"); console.log("setup pdfDoc");
}, },
@ -24,11 +23,11 @@ var handler = new MessageHandler({
pageNum = parseInt(pageNum); pageNum = parseInt(pageNum);
console.log("about to process page", pageNum); console.log("about to process page", pageNum);
var page = pdfDocument.getPage(pageNum); var page = pdfDoc.getPage(pageNum);
// The following code does quite the same as Page.prototype.startRendering, // The following code does quite the same as Page.prototype.startRendering,
// but stops at one point and sends the result back to the main thread. // but stops at one point and sends the result back to the main thread.
var gfx = new CanvasGraphics(canvasCtx); var gfx = new CanvasGraphics(null);
var fonts = []; var fonts = [];
// TODO: Figure out how image loading is handled inside the worker. // TODO: Figure out how image loading is handled inside the worker.
var images = new ImagesLoader(); var images = new ImagesLoader();
@ -43,9 +42,9 @@ var handler = new MessageHandler({
var font = fonts[i]; var font = fonts[i];
fontsMin.push({ fontsMin.push({
name: orgFont.name, name: font.name,
file: orgFont.file, file: font.file,
properties: orgFont.properties properties: font.properties
}); });
} }
@ -58,6 +57,4 @@ var handler = new MessageHandler({
preCompilation: preCompilation, preCompilation: preCompilation,
}); });
} }
}, postMessage); }, this);
onmessage = handler.onMessage;

View File

@ -8,7 +8,15 @@ var console = {
log: function log() { log: function log() {
var args = Array.prototype.slice.call(arguments); var args = Array.prototype.slice.call(arguments);
postMessage({ postMessage({
action: 'log', action: 'console_log',
data: args
});
},
error: function error() {
var args = Array.prototype.slice.call(arguments);
postMessage({
action: 'console_error',
data: args data: args
}); });
}, },

View File

@ -4,8 +4,18 @@
'use strict'; 'use strict';
function MessageHandler(actionHandler, postMessage, scope) { function MessageHandler(name, actionHandler, comObj, scope) {
this.onMessage = function(event) { this.name = name;
actionHandler["console_log"] = function(data) {
console.log.apply(console, data);
}
actionHandler["console_error"] = function(data) {
console.error.apply(console, data);
}
comObj.onmessage = function(event) {
var data = event.data; var data = event.data;
if (data.action in actionHandler) { if (data.action in actionHandler) {
actionHandler[data.action].call(scope, data.data); actionHandler[data.action].call(scope, data.data);
@ -15,9 +25,14 @@ function MessageHandler(actionHandler, postMessage, scope) {
}; };
this.send = function(actionName, data) { this.send = function(actionName, data) {
postMessage({ try {
action: actionName, comObj.postMessage({
data: data action: actionName,
}); data: data
});
} catch (e) {
console.error("FAILED to send data from", this.name);
throw e;
}
} }
} }