You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
266 lines
7.6 KiB
JavaScript
266 lines
7.6 KiB
JavaScript
// Generated by CoffeeScript 1.12.5
|
|
(function() {
|
|
var KAPPA, SVGPath, number,
|
|
slice = [].slice;
|
|
|
|
SVGPath = require('../path');
|
|
|
|
number = require('../object').number;
|
|
|
|
KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);
|
|
|
|
module.exports = {
|
|
initVector: function() {
|
|
this._ctm = [1, 0, 0, 1, 0, 0];
|
|
return this._ctmStack = [];
|
|
},
|
|
save: function() {
|
|
this._ctmStack.push(this._ctm.slice());
|
|
return this.addContent('q');
|
|
},
|
|
restore: function() {
|
|
this._ctm = this._ctmStack.pop() || [1, 0, 0, 1, 0, 0];
|
|
return this.addContent('Q');
|
|
},
|
|
closePath: function() {
|
|
return this.addContent('h');
|
|
},
|
|
lineWidth: function(w) {
|
|
return this.addContent((number(w)) + " w");
|
|
},
|
|
_CAP_STYLES: {
|
|
BUTT: 0,
|
|
ROUND: 1,
|
|
SQUARE: 2
|
|
},
|
|
lineCap: function(c) {
|
|
if (typeof c === 'string') {
|
|
c = this._CAP_STYLES[c.toUpperCase()];
|
|
}
|
|
return this.addContent(c + " J");
|
|
},
|
|
_JOIN_STYLES: {
|
|
MITER: 0,
|
|
ROUND: 1,
|
|
BEVEL: 2
|
|
},
|
|
lineJoin: function(j) {
|
|
if (typeof j === 'string') {
|
|
j = this._JOIN_STYLES[j.toUpperCase()];
|
|
}
|
|
return this.addContent(j + " j");
|
|
},
|
|
miterLimit: function(m) {
|
|
return this.addContent((number(m)) + " M");
|
|
},
|
|
dash: function(length, options) {
|
|
var phase, ref, space, v;
|
|
if (options == null) {
|
|
options = {};
|
|
}
|
|
if (length == null) {
|
|
return this;
|
|
}
|
|
if (Array.isArray(length)) {
|
|
length = ((function() {
|
|
var i, len, results;
|
|
results = [];
|
|
for (i = 0, len = length.length; i < len; i++) {
|
|
v = length[i];
|
|
results.push(number(v));
|
|
}
|
|
return results;
|
|
})()).join(' ');
|
|
phase = options.phase || 0;
|
|
return this.addContent("[" + length + "] " + (number(phase)) + " d");
|
|
} else {
|
|
space = (ref = options.space) != null ? ref : length;
|
|
phase = options.phase || 0;
|
|
return this.addContent("[" + (number(length)) + " " + (number(space)) + "] " + (number(phase)) + " d");
|
|
}
|
|
},
|
|
undash: function() {
|
|
return this.addContent("[] 0 d");
|
|
},
|
|
moveTo: function(x, y) {
|
|
return this.addContent((number(x)) + " " + (number(y)) + " m");
|
|
},
|
|
lineTo: function(x, y) {
|
|
return this.addContent((number(x)) + " " + (number(y)) + " l");
|
|
},
|
|
bezierCurveTo: function(cp1x, cp1y, cp2x, cp2y, x, y) {
|
|
return this.addContent((number(cp1x)) + " " + (number(cp1y)) + " " + (number(cp2x)) + " " + (number(cp2y)) + " " + (number(x)) + " " + (number(y)) + " c");
|
|
},
|
|
quadraticCurveTo: function(cpx, cpy, x, y) {
|
|
return this.addContent((number(cpx)) + " " + (number(cpy)) + " " + (number(x)) + " " + (number(y)) + " v");
|
|
},
|
|
rect: function(x, y, w, h) {
|
|
return this.addContent((number(x)) + " " + (number(y)) + " " + (number(w)) + " " + (number(h)) + " re");
|
|
},
|
|
roundedRect: function(x, y, w, h, r) {
|
|
var c;
|
|
if (r == null) {
|
|
r = 0;
|
|
}
|
|
r = Math.min(r, 0.5 * w, 0.5 * h);
|
|
c = r * (1.0 - KAPPA);
|
|
this.moveTo(x + r, y);
|
|
this.lineTo(x + w - r, y);
|
|
this.bezierCurveTo(x + w - c, y, x + w, y + c, x + w, y + r);
|
|
this.lineTo(x + w, y + h - r);
|
|
this.bezierCurveTo(x + w, y + h - c, x + w - c, y + h, x + w - r, y + h);
|
|
this.lineTo(x + r, y + h);
|
|
this.bezierCurveTo(x + c, y + h, x, y + h - c, x, y + h - r);
|
|
this.lineTo(x, y + r);
|
|
this.bezierCurveTo(x, y + c, x + c, y, x + r, y);
|
|
return this.closePath();
|
|
},
|
|
ellipse: function(x, y, r1, r2) {
|
|
var ox, oy, xe, xm, ye, ym;
|
|
if (r2 == null) {
|
|
r2 = r1;
|
|
}
|
|
x -= r1;
|
|
y -= r2;
|
|
ox = r1 * KAPPA;
|
|
oy = r2 * KAPPA;
|
|
xe = x + r1 * 2;
|
|
ye = y + r2 * 2;
|
|
xm = x + r1;
|
|
ym = y + r2;
|
|
this.moveTo(x, ym);
|
|
this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);
|
|
this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);
|
|
this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
|
|
this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);
|
|
return this.closePath();
|
|
},
|
|
circle: function(x, y, radius) {
|
|
return this.ellipse(x, y, radius);
|
|
},
|
|
polygon: function() {
|
|
var i, len, point, points;
|
|
points = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
|
this.moveTo.apply(this, points.shift());
|
|
for (i = 0, len = points.length; i < len; i++) {
|
|
point = points[i];
|
|
this.lineTo.apply(this, point);
|
|
}
|
|
return this.closePath();
|
|
},
|
|
path: function(path) {
|
|
SVGPath.apply(this, path);
|
|
return this;
|
|
},
|
|
_windingRule: function(rule) {
|
|
if (/even-?odd/.test(rule)) {
|
|
return '*';
|
|
}
|
|
return '';
|
|
},
|
|
fill: function(color, rule) {
|
|
if (/(even-?odd)|(non-?zero)/.test(color)) {
|
|
rule = color;
|
|
color = null;
|
|
}
|
|
if (color) {
|
|
this.fillColor(color);
|
|
}
|
|
return this.addContent('f' + this._windingRule(rule));
|
|
},
|
|
stroke: function(color) {
|
|
if (color) {
|
|
this.strokeColor(color);
|
|
}
|
|
return this.addContent('S');
|
|
},
|
|
fillAndStroke: function(fillColor, strokeColor, rule) {
|
|
var isFillRule;
|
|
if (strokeColor == null) {
|
|
strokeColor = fillColor;
|
|
}
|
|
isFillRule = /(even-?odd)|(non-?zero)/;
|
|
if (isFillRule.test(fillColor)) {
|
|
rule = fillColor;
|
|
fillColor = null;
|
|
}
|
|
if (isFillRule.test(strokeColor)) {
|
|
rule = strokeColor;
|
|
strokeColor = fillColor;
|
|
}
|
|
if (fillColor) {
|
|
this.fillColor(fillColor);
|
|
this.strokeColor(strokeColor);
|
|
}
|
|
return this.addContent('B' + this._windingRule(rule));
|
|
},
|
|
clip: function(rule) {
|
|
return this.addContent('W' + this._windingRule(rule) + ' n');
|
|
},
|
|
transform: function(m11, m12, m21, m22, dx, dy) {
|
|
var m, m0, m1, m2, m3, m4, m5, v, values;
|
|
m = this._ctm;
|
|
m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5];
|
|
m[0] = m0 * m11 + m2 * m12;
|
|
m[1] = m1 * m11 + m3 * m12;
|
|
m[2] = m0 * m21 + m2 * m22;
|
|
m[3] = m1 * m21 + m3 * m22;
|
|
m[4] = m0 * dx + m2 * dy + m4;
|
|
m[5] = m1 * dx + m3 * dy + m5;
|
|
values = ((function() {
|
|
var i, len, ref, results;
|
|
ref = [m11, m12, m21, m22, dx, dy];
|
|
results = [];
|
|
for (i = 0, len = ref.length; i < len; i++) {
|
|
v = ref[i];
|
|
results.push(number(v));
|
|
}
|
|
return results;
|
|
})()).join(' ');
|
|
return this.addContent(values + " cm");
|
|
},
|
|
translate: function(x, y) {
|
|
return this.transform(1, 0, 0, 1, x, y);
|
|
},
|
|
rotate: function(angle, options) {
|
|
var cos, rad, ref, sin, x, x1, y, y1;
|
|
if (options == null) {
|
|
options = {};
|
|
}
|
|
rad = angle * Math.PI / 180;
|
|
cos = Math.cos(rad);
|
|
sin = Math.sin(rad);
|
|
x = y = 0;
|
|
if (options.origin != null) {
|
|
ref = options.origin, x = ref[0], y = ref[1];
|
|
x1 = x * cos - y * sin;
|
|
y1 = x * sin + y * cos;
|
|
x -= x1;
|
|
y -= y1;
|
|
}
|
|
return this.transform(cos, sin, -sin, cos, x, y);
|
|
},
|
|
scale: function(xFactor, yFactor, options) {
|
|
var ref, x, y;
|
|
if (yFactor == null) {
|
|
yFactor = xFactor;
|
|
}
|
|
if (options == null) {
|
|
options = {};
|
|
}
|
|
if (arguments.length === 2) {
|
|
yFactor = xFactor;
|
|
options = yFactor;
|
|
}
|
|
x = y = 0;
|
|
if (options.origin != null) {
|
|
ref = options.origin, x = ref[0], y = ref[1];
|
|
x -= xFactor * x;
|
|
y -= yFactor * y;
|
|
}
|
|
return this.transform(xFactor, 0, 0, yFactor, x, y);
|
|
}
|
|
};
|
|
|
|
}).call(this);
|