Browse Source

speedup unicode/glyph conversion and cache translated strings in the font

Andreas Gal 14 years ago
parent
commit
d2e18d35b5
  1. 37
      fonts.js
  2. 8
      pdf.js

37
fonts.js

@ -30,6 +30,7 @@ var fontCount = 0; @@ -30,6 +30,7 @@ var fontCount = 0;
*/
var Fonts = {
_active: null,
get active() {
return this._active;
},
@ -38,12 +39,34 @@ var Fonts = { @@ -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) { @@ -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) { @@ -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

8
pdf.js

@ -2245,13 +2245,7 @@ var CanvasGraphics = (function() { @@ -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();

Loading…
Cancel
Save