GT2/GT2-Android/node_modules/art/modes/canvas/text.js

117 lines
2.8 KiB
JavaScript
Raw Normal View History

var Class = require('../../core/class');
var Base = require('./base');
var fontAnchors = { middle: 'center' };
module.exports = Class(Base, {
base_initialize: Base.prototype.initialize,
initialize: function(text, font, alignment, path){
this.base_initialize();
this.draw.apply(this, arguments);
},
draw: function(text, font, alignment, path){
var em;
if (typeof font == 'string'){
em = Number(/(\d+)/.exec(font)[0]);
} else if (font){
em = parseFloat(font.fontSize || font['font-size'] || '12');
font = (font.fontStyle || font['font-style'] || '') + ' ' +
(font.fontVariant || font['font-variant'] || '') + ' ' +
(font.fontWeight || font['font-weight'] || '') + ' ' +
em + 'px ' +
(font.fontFamily || font['font-family'] || 'Arial');
} else {
font = this._font;
}
var lines = text && text.split(/\r?\n/);
this._font = font;
this._fontSize = em;
this._text = lines;
this._alignment = fontAnchors[alignment] || alignment || 'left';
var context = Base._genericContext;
context.font = this._font;
context.textAlign = this._alignment;
context.textBaseline = 'middle';
lines = this._text;
var l = lines.length, width = 0;
for (var i = 0; i < l; i++){
var w = context.measureText(lines[i]).width;
if (w > width) width = w;
}
this.width = width;
this.height = l ? l * 1.1 * em : 0;
return this.invalidate();
},
// Interaction
localHitTest: function(x, y){
if (!this._fill) return null;
if (x > 0 && y > 0 && x < this.width && y < this.height){
return this;
}
return null;
},
// Rendering
renderShapeTo: function(context){
if (this._invisible || !this._text || (!this._fill && !this._stroke)) {
return null;
}
context.transform(this.xx, this.yx, this.xy, this.yy, this.x, this.y);
var fill = this._fill,
stroke = this._stroke,
text = this._text,
dash = this._strokeDash;
context.font = this._font;
context.textAlign = this._alignment;
context.textBaseline = 'middle';
var em = this._fontSize,
y = em / 2,
lineHeight = 1.1 * em,
lines = text,
l = lines.length;
if (fill){
context.fillStyle = fill;
for (var i = 0; i < l; i++)
context.fillText(lines[i], 0, y + i * lineHeight);
}
if (stroke){
if (dash) {
if (context.setLineDash) {
context.setLineDash(dash);
} else {
// TODO: Remove when FF supports setLineDash.
context.mozDash = dash;
}
// TODO: Create fallback to other browsers.
} else {
if (context.setLineDash) {
context.setLineDash([]);
} else {
context.mozDash = null;
}
}
context.strokeStyle = stroke;
context.lineWidth = this._strokeWidth;
context.lineCap = this._strokeCap;
context.lineJoin = this._strokeJoin;
for (i = 0; i < l; i++)
context.strokeText(lines[i], 0, y + i * lineHeight);
}
}
});