From 00290b9ff4f0f23e0e9967627d5bdfdafaaa4902 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Fri, 16 Sep 2011 09:04:12 -0700 Subject: [PATCH] Rename some stuff and add missing font_handler.js --- test/test_slave.html | 3 +- web/viewer.html | 3 +- worker.js | 31 ++++++----- worker/font_boot.js | 16 ++++++ worker/font_handler.js | 52 +++++++++++++++++++ .../{boot_processor.js => processor_boot.js} | 6 +-- worker/{handler.js => processor_handler.js} | 2 +- 7 files changed, 94 insertions(+), 19 deletions(-) create mode 100644 worker/font_boot.js create mode 100644 worker/font_handler.js rename worker/{boot_processor.js => processor_boot.js} (76%) rename worker/{handler.js => processor_handler.js} (98%) diff --git a/test/test_slave.html b/test/test_slave.html index 06657ddd3..bbec69d3a 100644 --- a/test/test_slave.html +++ b/test/test_slave.html @@ -10,7 +10,8 @@ - + + diff --git a/web/viewer.html b/web/viewer.html index 00076aa80..33026a492 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -13,7 +13,8 @@ - + + diff --git a/worker.js b/worker.js index 1a143c1d6..8ffece46f 100644 --- a/worker.js +++ b/worker.js @@ -3,6 +3,9 @@ 'use strict'; +// Set this to true if you want to use workers. +var useWorker = false; + var WorkerPage = (function() { function constructor(workerPDF, page) { this.workerPDF = workerPDF; @@ -179,10 +182,9 @@ var WorkerPDFDoc = (function() { this.pageCache = []; - var useWorker = true; - if (useWorker) { - var worker = this.worker = new Worker("../worker/boot_processor.js"); + var worker = this.worker = new Worker("../worker/processor_boot.js"); + var fontWorker = this.fontWorker = new Worker('../worker/font_boot.js'); } else { // If we don't use a worker, just post/sendMessage to the main thread. var worker = { @@ -190,21 +192,22 @@ var WorkerPDFDoc = (function() { worker.onmessage({data: obj}); } } + var fontWorker = { + postMessage: function(obj) { + fontWorker.onmessage({data: obj}); + } + } } - var fontWorker = new Worker('../worker/boot_font.js'); - var fontHandler = this.fontHandler = new MessageHandler('font', fontWorker); - - var handler = this.handler = new MessageHandler("main", worker); - handler.on("page", function(data) { + var processorHandler = this.processorHandler = new MessageHandler("main", worker); + processorHandler.on("page", function(data) { var pageNum = data.pageNum; var page = this.pageCache[pageNum]; - page.startRenderingFromIRQueue(data.IRQueue, data.fonts); }, this); - handler.on("obj", function(data) { + processorHandler.on("obj", function(data) { var objId = data[0]; var objType = data[1]; @@ -225,6 +228,7 @@ var WorkerPDFDoc = (function() { } }, this); + var fontHandler = this.fontHandler = new MessageHandler('font', fontWorker); fontHandler.on('font_ready', function(data) { var objId = data[0]; var fontObj = new FontShape(data[1]); @@ -240,10 +244,11 @@ var WorkerPDFDoc = (function() { if (!useWorker) { // If the main thread is our worker, setup the handling for the messages // the main thread sends to it self. - WorkerHandler.setup(handler); + WorkerProcessorHandler.setup(processorHandler); + WorkerFontHandler.setup(fontHandler); } - handler.send("doc", data); + processorHandler.send("doc", data); } constructor.prototype = { @@ -252,7 +257,7 @@ var WorkerPDFDoc = (function() { }, startRendering: function(page) { - this.handler.send("page_request", page.page.pageNumber + 1); + this.processorHandler.send("page_request", page.page.pageNumber + 1); }, getPage: function(n) { diff --git a/worker/font_boot.js b/worker/font_boot.js new file mode 100644 index 000000000..9158d20a1 --- /dev/null +++ b/worker/font_boot.js @@ -0,0 +1,16 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- / +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ + +'use strict'; + +importScripts('console.js'); +importScripts('message_handler.js'); +importScripts('../pdf.js'); +importScripts('../fonts.js'); +importScripts('../crypto.js'); +importScripts('../glyphlist.js'); +importScripts('font_handler.js'); + + +var handler = new MessageHandler("worker_font", this); +WorkerFontHandler.setup(handler); diff --git a/worker/font_handler.js b/worker/font_handler.js new file mode 100644 index 000000000..3479090a0 --- /dev/null +++ b/worker/font_handler.js @@ -0,0 +1,52 @@ +var WorkerFontHandler = { + setup: function(handler) { + handler.on("font", function(data) { + var objId = data[0]; + var name = data[1]; + var file = data[2]; + var properties = data[3]; + + var font = { + name: name, + file: file, + properties: properties + }; + + // Some fonts don't have a file, e.g. the build in ones like Arial. + if (file) { + var fontFileDict = new Dict(); + fontFileDict.map = file.dict.map; + + var fontFile = new Stream(file.bytes, file.start, + file.end - file.start, fontFileDict); + + // Check if this is a FlateStream. Otherwise just use the created + // Stream one. This makes complex_ttf_font.pdf work. + var cmf = file.bytes[0]; + if ((cmf & 0x0f) == 0x08) { + font.file = new FlateStream(fontFile); + } else { + font.file = fontFile; + } + } + + var obj = new Font(font.name, font.file, font.properties); + + var str = ''; + var data = obj.data; + if (data) { + var length = data.length; + for (var j = 0; j < length; j++) + str += String.fromCharCode(data[j]); + } + + obj.str = str; + + // Remove the data array form the font object, as it's not needed + // anymore as we sent over the ready str. + delete obj.data; + + handler.send("font_ready", [objId, obj]); + }); + } +} diff --git a/worker/boot_processor.js b/worker/processor_boot.js similarity index 76% rename from worker/boot_processor.js rename to worker/processor_boot.js index cc3896c2a..deb2778c2 100644 --- a/worker/boot_processor.js +++ b/worker/processor_boot.js @@ -10,10 +10,10 @@ importScripts('../fonts.js'); importScripts('../crypto.js'); importScripts('../glyphlist.js'); importScripts('../metrics.js'); -importScripts('handler.js'); +importScripts('processor_handler.js'); // Listen for messages from the main thread. var pdfDoc = null; -var handler = new MessageHandler("worker", this); -WorkerHandler.setup(handler); +var handler = new MessageHandler("worker_processor", this); +WorkerProcessorHandler.setup(handler); diff --git a/worker/handler.js b/worker/processor_handler.js similarity index 98% rename from worker/handler.js rename to worker/processor_handler.js index fe6c6d8ef..b7a915f3d 100644 --- a/worker/handler.js +++ b/worker/processor_handler.js @@ -3,7 +3,7 @@ 'use strict'; -var WorkerHandler = { +var WorkerProcessorHandler = { setup: function(handler) { var pdfDoc = null;