From 6dd82ad5d4e79228d7dedbf33fbc9d02b7ec1424 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Mon, 5 Sep 2011 09:26:07 -0700 Subject: [PATCH] Track loaded such that setFont doesnt need to touch xref anymore --- pdf.js | 56 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/pdf.js b/pdf.js index 37afdc376..e53ff1cb3 100644 --- a/pdf.js +++ b/pdf.js @@ -4051,6 +4051,8 @@ var EvalState = (function() { return constructor; })(); +var FontsMap = {}; + var PartialEvaluator = (function() { function constructor() { this.state = new EvalState(); @@ -4208,17 +4210,23 @@ var PartialEvaluator = (function() { images.bind(xobj); // monitoring image load } } else if (cmd == 'Tf') { // eagerly collect all fonts - var fontRes = resources.get('Font'); - if (fontRes) { - fontRes = xref.fetchIfRef(fontRes); - var font = xref.fetchIfRef(fontRes.get(args[0].name)); - assertWellFormed(IsDict(font)); - if (!font.translated) { - font.translated = this.translateFont(font, xref, resources); - if (fonts && font.translated) { - // keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page - fonts.push(font.translated); + var fontName = args[0].name; + + // Check if this font is known already and process it otherwise. + if (!FontsMap[fontName]) { + var fontRes = resources.get('Font'); + if (fontRes) { + fontRes = xref.fetchIfRef(fontRes); + var font = xref.fetchIfRef(fontRes.get(fontName)); + assertWellFormed(IsDict(font)); + if (!font.translated) { + font.translated = this.translateFont(font, xref, resources); + if (fonts && font.translated) { + // keep track of each font we translated so the caller can + // load them asynchronously before calling display on a page + fonts.push(font.translated); + FontsMap[fontName] = font; + } } } } @@ -4233,6 +4241,10 @@ var PartialEvaluator = (function() { } } + // Expose arrays for debugging purpose. + window.fnArray = fnArray; + window.argsArray = argsArray; + return function(gfx) { for (var i = 0, length = argsArray.length; i < length; i++) gfx[fnArray[i]].apply(gfx, argsArray[i]); @@ -4914,16 +4926,20 @@ var CanvasGraphics = (function() { this.current.leading = -leading; }, setFont: function(fontRef, size) { - var font = this.xref.fetchIfRef(this.res.get('Font')); - if (!IsDict(font)) - return; + // Lookup the fontObj using fontRef only. + var fontRefName = fontRef.name; + var fontObj = FontsMap[fontRefName].fontObj; + + if (!fontObj) { + throw "Can't find font for " + fontRefName; + } + + var name = fontObj.loadedName; + if (!name) { + // TODO: fontDescriptor is not available, fallback to default font + name = 'sans-serif'; + } - font = font.get(fontRef.name); - font = this.xref.fetchIfRef(font); - if (!font) - return; - - var fontObj = font.fontObj; this.current.font = fontObj; this.current.fontSize = size;