76 lines
1.4 KiB
JavaScript
76 lines
1.4 KiB
JavaScript
|
var Class = require('../../core/class');
|
||
|
|
||
|
// Utility command factories
|
||
|
|
||
|
var point = function(c){
|
||
|
return function(x, y){
|
||
|
return this.push(c, x, y);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
var arc = function(c, cc){
|
||
|
return function(x, y, rx, ry, outer){
|
||
|
return this.push(c, Math.abs(rx || x), Math.abs(ry || rx || y), 0, outer ? 1 : 0, cc, x, y);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
var curve = function(t, s, q, c){
|
||
|
return function(c1x, c1y, c2x, c2y, ex, ey){
|
||
|
var l = arguments.length, k = l < 4 ? t : l < 6 ? q : c;
|
||
|
return this.push(k, c1x, c1y, c2x, c2y, ex, ey);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// SVG Path Class
|
||
|
|
||
|
var SVGPath = Class({
|
||
|
|
||
|
initialize: function(path){
|
||
|
if (path instanceof SVGPath){
|
||
|
this.path = [Array.prototype.join.call(path.path, ' ')];
|
||
|
} else {
|
||
|
if (path && path.applyToPath)
|
||
|
path.applyToPath(this);
|
||
|
else
|
||
|
this.path = [path || 'm0 0'];
|
||
|
}
|
||
|
},
|
||
|
|
||
|
push: function(){
|
||
|
this.path.push(Array.prototype.join.call(arguments, ' '));
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
reset: function(){
|
||
|
this.path = [];
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
move: point('m'),
|
||
|
moveTo: point('M'),
|
||
|
|
||
|
line: point('l'),
|
||
|
lineTo: point('L'),
|
||
|
|
||
|
curve: curve('t', 's', 'q', 'c'),
|
||
|
curveTo: curve('T', 'S', 'Q', 'C'),
|
||
|
|
||
|
arc: arc('a', 1),
|
||
|
arcTo: arc('A', 1),
|
||
|
|
||
|
counterArc: arc('a', 0),
|
||
|
counterArcTo: arc('A', 0),
|
||
|
|
||
|
close: function(){
|
||
|
return this.push('z');
|
||
|
},
|
||
|
|
||
|
toSVG: function(){
|
||
|
return this.path.join(' ');
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
SVGPath.prototype.toString = SVGPath.prototype.toSVG;
|
||
|
|
||
|
module.exports = SVGPath;
|