*/
var Fonts = {
_active: null,
+
get active() {
return this._active;
},
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;
}
};
encoding: {},
charset: null
},
- loading: false
+ loading: false,
+ cache: Object.create(null)
};
this.mimetype = "font/ttf";
Fonts[aName] = {
data: this.font,
properties: aProperties,
- loading: true
+ loading: true,
+ cache: Object.create(null)
}
// Attach the font to the document
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();