*/
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 -1;
}
+var MeasureText = {
+ currentCache: null,
+ currentFont: null,
+ currentSize: 0,
+ ctx: null,
+ sizes: Object.create(null)
+};
+
/**
* 'Font' is the class the outside world should use, it encapsulate all the font
* decoding logics whatever type it is (assuming the font type is supported).
* type1Font.bind();
*/
var Font = (function() {
+ var kScalePrecision = 40;
+
var constructor = function font_constructor(name, file, properties) {
this.name = name;
this.textMatrix = properties.textMatrix || IDENTITY_MATRIX;
return rule;
},
- charsToUnicode: function fonts_chars2Unicode(chars) {
+ charsToUnicode: function fonts_charsToUnicode(chars) {
var charsCache = this.charsCache;
// if we translated this string before, just grab it from the cache
// Enter the translated string into the cache
return charsCache[chars] = str;
+ },
+
+ measureText: function fonts_measureText(text, size) {
+ if (MeasureText.currentFont != this ||
+ MeasureText.currentSize != size) {
+ var ctx = MeasureText.ctx;
+ if (!ctx) {
+ ctx = MeasureText.ctx = document.createElement('canvas').getContext('2d');
+ ctx.scale(1 / kScalePrecision, 1);
+ }
+ ctx.font = (size * kScalePrecision) + 'px "' + this.loadedName + '"';
+ MeasureText.currentFont = this;
+ MeasureText.currentSize = size;
+ var cache = MeasureText.sizes[size];
+ if (!cache)
+ cache = MeasureText.sizes[size] = Object.create(null);
+ MeasureText.currentCache = cache;
+ }
+
+ var key = size + "$" + text;
+ var width = MeasureText.currentCache[key];
+ if (width)
+ return width;
+ var ctx = MeasureText.ctx;
+ width = ctx.measureText(text).width / kScalePrecision;
+ return MeasureText.currentCache[key] = width;
}
};
this.ctx.$setFont(fontName, size);
} else {
this.ctx.font = size + 'px "' + fontName + '"';
- Fonts.setActive(fontName, fontObj, size);
}
},
setTextRenderingMode: function(mode) {
ctx.$showText(current.y, text);
} else {
ctx.translate(current.x, -1 * current.y);
- var font = this.current.font;
- if (font) {
- ctx.transform.apply(ctx, font.textMatrix);
- text = font.charsToUnicode(text);
- }
+ var font = current.font;
+ ctx.transform.apply(ctx, font.textMatrix);
+ text = font.charsToUnicode(text);
ctx.fillText(text, 0, 0);
- current.x += Fonts.measureText(text);
+ current.x += font.measureText(text, current.fontSize);
}
- this.ctx.restore();
+ ctx.restore();
},
showSpacedText: function(arr) {
for (var i = 0; i < arr.length; ++i) {