diff --git a/pdf.js b/pdf.js index 39d36780f..4deb1f934 100644 --- a/pdf.js +++ b/pdf.js @@ -3406,7 +3406,7 @@ var Page = (function() { var exc = null; // try { self.display(gfx); - stats.render = Date.now(); + self.stats.render = Date.now(); // } catch (e) { // exc = e.toString(); // } @@ -3416,7 +3416,7 @@ var Page = (function() { this.ensureFonts(fonts, function() { images.notifyOnLoad(function() { - stats.images = Date.now(); + self.stats.images = Date.now(); displayContinuation(); }); }) @@ -4294,10 +4294,6 @@ var PartialEvaluator = (function() { } } - // Expose arrays for debugging purpose. - window.fnArray = fnArray; - window.argsArray = argsArray; - return { fnArray: fnArray, argsArray: argsArray @@ -4791,6 +4787,9 @@ var CanvasGraphics = (function() { }, postCompile: function(raw) { + if (!this.pe) { + this.pe = new PartialEvaluator(); + } return this.pe.evalFromRaw(raw); }, diff --git a/worker.js b/worker.js index 61f8c0934..1eb65b7b9 100644 --- a/worker.js +++ b/worker.js @@ -60,16 +60,29 @@ var WorkerPDFDoc = (function() { this.pageCache = []; - this.worker = new Worker("worker/boot.js"); - this.handler = new MessageHandler({ + this.worker = new Worker("../worker/boot.js"); + this.handler = new MessageHandler("main", { "page": function(data) { var pageNum = data.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); } - }, this.worker.postMessage, this); - this.worker.onmessage = this.handler.onMessage; + }, this.worker, this); this.handler.send("doc", data); } @@ -80,7 +93,7 @@ var WorkerPDFDoc = (function() { }, startRendering: function(page) { - this.handler.send("page", page.page.pageNumber); + this.handler.send("page", page.page.pageNumber + 1); }, getPage: function(n) { diff --git a/worker/boot.js b/worker/boot.js index 4ec65a1de..da09f21c5 100644 --- a/worker/boot.js +++ b/worker/boot.js @@ -3,9 +3,8 @@ 'use strict'; -// importScripts('console.js'); -importScripts('event_handler.js'); +importScripts('message_handler.js'); importScripts('../pdf.js'); importScripts('../fonts.js'); importScripts('../crypto.js'); @@ -14,9 +13,9 @@ importScripts('../glyphlist.js'); // Listen for messages from the main thread. var pdfDoc = null; -var handler = new MessageHandler({ +var handler = new MessageHandler("worker", { "doc": function(data) { - pdfDocument = new PDFDoc(new Stream(data)); + pdfDoc = new PDFDoc(new Stream(data)); console.log("setup pdfDoc"); }, @@ -24,11 +23,11 @@ var handler = new MessageHandler({ pageNum = parseInt(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, // 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 = []; // TODO: Figure out how image loading is handled inside the worker. var images = new ImagesLoader(); @@ -43,9 +42,9 @@ var handler = new MessageHandler({ var font = fonts[i]; fontsMin.push({ - name: orgFont.name, - file: orgFont.file, - properties: orgFont.properties + name: font.name, + file: font.file, + properties: font.properties }); } @@ -58,6 +57,4 @@ var handler = new MessageHandler({ preCompilation: preCompilation, }); } -}, postMessage); - -onmessage = handler.onMessage; +}, this); diff --git a/worker/console.js b/worker/console.js index 74a2d56a3..debcba3aa 100644 --- a/worker/console.js +++ b/worker/console.js @@ -8,7 +8,15 @@ var console = { log: function log() { var args = Array.prototype.slice.call(arguments); postMessage({ - action: 'log', + action: 'console_log', + data: args + }); + }, + + error: function error() { + var args = Array.prototype.slice.call(arguments); + postMessage({ + action: 'console_error', data: args }); }, diff --git a/worker/message_handler.js b/worker/message_handler.js index b97558ee6..17c6e4aea 100644 --- a/worker/message_handler.js +++ b/worker/message_handler.js @@ -4,8 +4,18 @@ 'use strict'; -function MessageHandler(actionHandler, postMessage, scope) { - this.onMessage = function(event) { +function MessageHandler(name, actionHandler, comObj, scope) { + 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; if (data.action in actionHandler) { actionHandler[data.action].call(scope, data.data); @@ -15,9 +25,14 @@ function MessageHandler(actionHandler, postMessage, scope) { }; this.send = function(actionName, data) { - postMessage({ - action: actionName, - data: data - }); + try { + comObj.postMessage({ + action: actionName, + data: data + }); + } catch (e) { + console.error("FAILED to send data from", this.name); + throw e; + } } } \ No newline at end of file