*/
var Fonts = (function Fonts() {
+ var kScalePrecision = 40;
var fonts = [];
+
+ if (!isWorker) {
+ var ctx = document.createElement('canvas').getContext('2d');
+ ctx.scale(1 / kScalePrecision, 1);
+ }
+
var fontCount = 0;
function FontInfo(name, data, properties) {
}
var current;
+ var measureCache;
return {
registerFont: function fonts_registerFont(fontName, data, properties) {
},
lookupById: function fonts_lookupById(id) {
return fonts[id];
+ },
+ setActive: function fonts_setActive(fontName, fontObj, size) {
+ // |current| can be null is fontName is a built-in font
+ // (e.g. "sans-serif")
+ if (fontObj && (current = fonts[fontObj.id])) {
+ var sizes = current.sizes;
+ if (!(measureCache = sizes[size]))
+ measureCache = sizes[size] = Object.create(null);
+ } else {
+ measureCache = null
+ }
+
+ ctx.font = (size * kScalePrecision) + 'px "' + fontName + '"';
+ },
+ measureText: function fonts_measureText(text) {
+ var width;
+ if (measureCache && (width = measureCache[text]))
+ return width;
+ width = ctx.measureText(text).width / kScalePrecision;
+ if (measureCache)
+ measureCache[text] = width;
+ return width;
}
};
})();
return rule;
},
- charsToUnicode: function fonts_charsToUnicode(chars) {
+ charsToUnicode: function fonts_chars2Unicode(chars) {
var charsCache = this.charsCache;
// if we translated this string before, just grab it from the cache
this.ctx.$setFont(fontName, size);
} else {
this.ctx.font = size + 'px "' + fontName + '"';
+ Fonts.setActive(fontName, fontObj, size);
}
},
setTextRenderingMode: function(mode) {
var ctx = this.ctx;
var current = this.current;
+ ctx.save();
+ ctx.transform.apply(ctx, current.textMatrix);
+ ctx.scale(1, -1);
+
if (this.ctx.$showText) {
ctx.$showText(current.y, text);
} else {
- ctx.save();
-
- ctx.transform.apply(ctx, current.textMatrix);
- ctx.scale(1, -1);
ctx.translate(current.x, -1 * current.y);
-
- var font = current.font;
- ctx.transform.apply(ctx, font.textMatrix);
-
- text = font.charsToUnicode(text);
-
+ var font = this.current.font;
+ if (font) {
+ ctx.transform.apply(ctx, font.textMatrix);
+ text = font.charsToUnicode(text);
+ }
ctx.fillText(text, 0, 0);
- current.x += ctx.measureText(text).width;
-
- ctx.restore();
+ current.x += Fonts.measureText(text);
}
+
+ this.ctx.restore();
},
showSpacedText: function(arr) {
for (var i = 0; i < arr.length; ++i) {