*/
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_charsToUnicode(chars) {
+ charsToUnicode: function fonts_chars2Unicode(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 = 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 += font.measureText(text, current.fontSize);
+ current.x += Fonts.measureText(text);
}
- ctx.restore();
+ this.ctx.restore();
},
showSpacedText: function(arr) {
for (var i = 0; i < arr.length; ++i) {