From: Julian Viereck Date: Fri, 16 Sep 2011 16:04:12 +0000 (-0700) Subject: Rename some stuff and add missing font_handler.js X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=00290b9ff4f0f23e0e9967627d5bdfdafaaa4902;p=pdf.js.git Rename some stuff and add missing font_handler.js --- diff --git a/test/test_slave.html b/test/test_slave.html index 06657dd..bbec69d 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 00076aa..33026a4 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -13,7 +13,8 @@ - + + diff --git a/worker.js b/worker.js index 1a143c1..8ffece4 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/boot_processor.js b/worker/boot_processor.js deleted file mode 100644 index cc3896c..0000000 --- a/worker/boot_processor.js +++ /dev/null @@ -1,19 +0,0 @@ -/* -*- 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('../metrics.js'); -importScripts('handler.js'); - -// Listen for messages from the main thread. -var pdfDoc = null; - -var handler = new MessageHandler("worker", this); -WorkerHandler.setup(handler); diff --git a/worker/font_boot.js b/worker/font_boot.js new file mode 100644 index 0000000..9158d20 --- /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 0000000..3479090 --- /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/handler.js b/worker/handler.js deleted file mode 100644 index fe6c6d8..0000000 --- a/worker/handler.js +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- / -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var WorkerHandler = { - setup: function(handler) { - var pdfDoc = null; - - handler.on("doc", function(data) { - pdfDoc = new PDFDoc(new Stream(data)); - }); - - handler.on("page_request", function(pageNum) { - pageNum = parseInt(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(null); - - var start = Date.now(); - // Pre compile the pdf page and fetch the fonts/images. - var IRQueue = page.getIRQueue(handler); - - console.log("page=%d - getIRQueue: time=%dms, len=%d", pageNum, Date.now() - start, IRQueue.fnArray.length); - - if (false /* show used commands */) { - var cmdMap = {}; - - var fnArray = IRQueue .fnArray; - for (var i = 0; i < fnArray.length; i++) { - var entry = fnArray[i]; - if (entry == "paintReadyFormXObject") { - //console.log(preCompilation.argsArray[i]); - } - if (cmdMap[entry] == null) { - cmdMap[entry] = 1; - } else { - cmdMap[entry] += 1; - } - } - console.log("cmds", JSON.stringify(cmdMap)); - } - - handler.send("page", { - pageNum: pageNum, - IRQueue: IRQueue, - }); - }, this); - } -} diff --git a/worker/processor_boot.js b/worker/processor_boot.js new file mode 100644 index 0000000..deb2778 --- /dev/null +++ b/worker/processor_boot.js @@ -0,0 +1,19 @@ +/* -*- 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('../metrics.js'); +importScripts('processor_handler.js'); + +// Listen for messages from the main thread. +var pdfDoc = null; + +var handler = new MessageHandler("worker_processor", this); +WorkerProcessorHandler.setup(handler); diff --git a/worker/processor_handler.js b/worker/processor_handler.js new file mode 100644 index 0000000..b7a915f --- /dev/null +++ b/worker/processor_handler.js @@ -0,0 +1,53 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- / +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ + +'use strict'; + +var WorkerProcessorHandler = { + setup: function(handler) { + var pdfDoc = null; + + handler.on("doc", function(data) { + pdfDoc = new PDFDoc(new Stream(data)); + }); + + handler.on("page_request", function(pageNum) { + pageNum = parseInt(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(null); + + var start = Date.now(); + // Pre compile the pdf page and fetch the fonts/images. + var IRQueue = page.getIRQueue(handler); + + console.log("page=%d - getIRQueue: time=%dms, len=%d", pageNum, Date.now() - start, IRQueue.fnArray.length); + + if (false /* show used commands */) { + var cmdMap = {}; + + var fnArray = IRQueue .fnArray; + for (var i = 0; i < fnArray.length; i++) { + var entry = fnArray[i]; + if (entry == "paintReadyFormXObject") { + //console.log(preCompilation.argsArray[i]); + } + if (cmdMap[entry] == null) { + cmdMap[entry] = 1; + } else { + cmdMap[entry] += 1; + } + } + console.log("cmds", JSON.stringify(cmdMap)); + } + + handler.send("page", { + pageNum: pageNum, + IRQueue: IRQueue, + }); + }, this); + } +}