From 9fba150dd214d4a14e5d9ebdf268202ddc6f3512 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Wed, 12 Sep 2012 17:31:04 -0700 Subject: [PATCH] Move font translation to the worker --- src/api.js | 19 +++++-------------- src/evaluator.js | 29 ++++++++++++++--------------- src/fonts.js | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/api.js b/src/api.js index d6d13a095..169faea0d 100644 --- a/src/api.js +++ b/src/api.js @@ -575,24 +575,15 @@ var WorkerTransport = (function WorkerTransportClosure() { this.objs.resolve(id, imageData); break; case 'Font': - var name = data[2]; - var file = data[3]; - var properties = data[4]; - - if (file) { - // Rewrap the ArrayBuffer in a stream. - var fontFileDict = new Dict(); - file = new Stream(file, 0, file.length, fontFileDict); - } + var exportedData = data[2]; // At this point, only the font object is created but the font is // not yet attached to the DOM. This is done in `FontLoader.bind`. var font; - try { - font = new Font(name, file, properties); - } catch (e) { - font = new ErrorFont(e); - } + if ('error' in exportedData) + font = new ErrorFont(exportedData.error); + else + font = new Font(exportedData); this.objs.resolve(id, font); break; default: diff --git a/src/evaluator.js b/src/evaluator.js index 621dd613f..704091149 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -171,31 +171,30 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { ++self.objIdCounter; if (!font.loadedName) { - font.translated = self.translateFont(font, xref, resources, - dependency); - if (font.translated) { + var translated = self.translateFont(font, xref, resources, + dependency); + if (translated) { // keep track of each font we translated so the caller can // load them asynchronously before calling display on a page loadedName = 'font_' + uniquePrefix + self.objIdCounter; - font.translated.properties.loadedName = loadedName; + translated.properties.loadedName = loadedName; font.loadedName = loadedName; + font.translated = translated; - var translated = font.translated; - // Convert the file to an ArrayBuffer which will be turned back into - // a Stream in the main thread. - if (translated.file) - translated.file = translated.file.getBytes(); - if (translated.properties.file) { - translated.properties.file = - translated.properties.file.getBytes(); + var data; + try { + var fontObj = new Font(translated.name, + translated.file, + translated.properties); + data = fontObj.export(); + } catch (e) { + data = { error: e }; } handler.send('obj', [ loadedName, 'Font', - translated.name, - translated.file, - translated.properties + data ]); } } diff --git a/src/fonts.js b/src/fonts.js index 15af2fa39..820ada8a0 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -1526,6 +1526,15 @@ function fontCharsToUnicode(charCodes, fontProperties) { */ var Font = (function FontClosure() { function Font(name, file, properties) { + if (arguments.length === 1) { + // importing translated data + var data = arguments[0]; + for (var i in data) { + this[i] = data[i]; + } + return; + } + this.name = name; this.coded = properties.coded; this.charProcOperatorList = properties.charProcOperatorList; @@ -2036,6 +2045,15 @@ var Font = (function FontClosure() { mimetype: null, encoding: null, + export: function Font_export() { + var data = {}; + for (var i in this) { + if (this.hasOwnProperty(i)) + data[i] = this[i]; + } + return data; + }, + checkAndRepair: function Font_checkAndRepair(name, font, properties) { function readTableEntry(file) { var tag = file.getBytes(4);