From d2e18d35b5b7d46ee5a6fd7416c6c3809a37ee06 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Fri, 17 Jun 2011 21:22:37 -0700 Subject: [PATCH] speedup unicode/glyph conversion and cache translated strings in the font --- fonts.js | 37 +++++++++++++++++++++++++++++++------ pdf.js | 8 +------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/fonts.js b/fonts.js index be4007d24..f348c346f 100644 --- a/fonts.js +++ b/fonts.js @@ -30,6 +30,7 @@ var fontCount = 0; */ var Fonts = { _active: null, + get active() { return this._active; }, @@ -38,12 +39,34 @@ var Fonts = { this._active = this[aName]; }, - unicodeFromCode: function fonts_unicodeFromCode(aCode) { + chars2Unicode: function(chars) { var active = this._active; - if (!active || !active.properties.encoding) - return aCode; + if (!active) + return chars; - return GlyphsUnicode[active.properties.encoding[aCode]]; + // if we translated this string before, just grab it from the cache + var ret = active.cache[chars]; + if (ret) + return ret; + + // translate the string using the font's encoding + var encoding = active.properties.encoding; + if (!encoding) + return chars; + + var ret = ""; + for (var i = 0; i < chars.length; ++i) { + var ch = chars.charCodeAt(i); + var uc = encoding[ch]; + if (typeof uc != "number") // we didn't convert the glyph yet + uc = encoding[ch] = GlyphsUnicode[uc]; + ret += String.fromCharCode(uc); + } + + // enter the translated string into the cache + active.cache[chars] = ret; + + return ret; } }; @@ -83,7 +106,8 @@ var Font = function(aName, aFile, aProperties) { encoding: {}, charset: null }, - loading: false + loading: false, + cache: Object.create(null) }; this.mimetype = "font/ttf"; @@ -99,7 +123,8 @@ var Font = function(aName, aFile, aProperties) { Fonts[aName] = { data: this.font, properties: aProperties, - loading: true + loading: true, + cache: Object.create(null) } // Attach the font to the document diff --git a/pdf.js b/pdf.js index 4a083c343..cc866c174 100644 --- a/pdf.js +++ b/pdf.js @@ -2245,13 +2245,7 @@ var CanvasGraphics = (function() { this.ctx.translate(0, 2 * this.current.y); this.ctx.scale(1, -1); this.ctx.transform.apply(this.ctx, this.current.textMatrix); - - // Replace characters code by glyphs code - var glyphs = []; - for (var i = 0; i < text.length; i++) - glyphs[i] = String.fromCharCode(Fonts.unicodeFromCode(text[i].charCodeAt(0))); - - this.ctx.fillText(glyphs.join(""), this.current.x, this.current.y); + this.ctx.fillText(Fonts.chars2Unicode(text), this.current.x, this.current.y); this.current.x += this.ctx.measureText(text).width; this.ctx.restore();