95 lines
2.3 KiB
JavaScript
95 lines
2.3 KiB
JavaScript
var Class = require('../../core/class');
|
|
var Base = require('./base');
|
|
var Path = require('./path');
|
|
|
|
module.exports = Class(Base, {
|
|
|
|
base_initialize: Base.prototype.initialize,
|
|
|
|
initialize: function(path, width, height){
|
|
this.base_initialize();
|
|
this.width = width;
|
|
this.height = height;
|
|
if (path != null) this.draw(path);
|
|
},
|
|
|
|
draw: function(path, width, height){
|
|
if (!(path instanceof Path)) path = new Path(path);
|
|
this.path = path;
|
|
this._commands = path.toCommands();
|
|
if (width != null) this.width = width;
|
|
if (height != null) this.height = height;
|
|
return this.invalidate();
|
|
},
|
|
|
|
localHitTest: function(x, y){
|
|
if (!this._fill) return null;
|
|
if (this.width == null || this.height == null){
|
|
var context = Base._genericContext, commands = this._commands;
|
|
if (!commands) return null;
|
|
context.beginPath();
|
|
for (var i = 0, l = commands.length; i < l; i++)
|
|
commands[i](context);
|
|
return context.isPointInPath(x, y) ? this : null;
|
|
}
|
|
if (x > 0 && y > 0 && x < this.width && y < this.height){
|
|
return this;
|
|
}
|
|
return null;
|
|
},
|
|
|
|
renderShapeTo: function(context){
|
|
if (this._invisible || !this._commands || (!this._fill && !this._stroke)) {
|
|
return null;
|
|
}
|
|
context.transform(this.xx, this.yx, this.xy, this.yy, this.x, this.y);
|
|
var commands = this._commands,
|
|
fill = this._fill,
|
|
stroke = this._stroke,
|
|
dash = this._strokeDash;
|
|
|
|
context.beginPath();
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
for (var i = 0, l = commands.length; i < l; i++)
|
|
commands[i](context);
|
|
|
|
if (fill){
|
|
var m = this._fillTransform;
|
|
if (m){
|
|
context.save(); // TODO: Optimize away this by restoring the transform before stroking
|
|
context.transform(m.xx, m.yx, m.xy, m.yy, m.x, m.y);
|
|
context.fillStyle = fill;
|
|
context.fill();
|
|
context.restore();
|
|
} else {
|
|
context.fillStyle = fill;
|
|
context.fill();
|
|
}
|
|
}
|
|
if (stroke){
|
|
context.strokeStyle = stroke;
|
|
context.lineWidth = this._strokeWidth;
|
|
context.lineCap = this._strokeCap;
|
|
context.lineJoin = this._strokeJoin;
|
|
context.stroke();
|
|
}
|
|
}
|
|
|
|
});
|