]> git.parisson.com Git - pdf.js.git/commitdiff
speedup unicode/glyph conversion and cache translated strings in the font
authorAndreas Gal <andreas.gal@gmail.com>
Sat, 18 Jun 2011 04:22:37 +0000 (21:22 -0700)
committerAndreas Gal <andreas.gal@gmail.com>
Sat, 18 Jun 2011 04:22:37 +0000 (21:22 -0700)
fonts.js
pdf.js

index be4007d2482141a26c24208167458db9cf7d08a8..f348c346fc9f411c9cc6f8566c96f5f931293e5c 100644 (file)
--- 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;
+
+    // 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 GlyphsUnicode[active.properties.encoding[aCode]];
+    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 4a083c343f4bc1ed63f2ec46a442df7af701e658..cc866c174633434bfb97a9b7d9f0619eab87222f 100644 (file)
--- 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();