blob: 140e11a4c4306b97d013a8609e337db4f4317fe8 [file] [log] [blame]
 var Matrix = (function () { 'use strict'; function reset() { this.props[0] = 1; this.props[1] = 0; this.props[2] = 0; this.props[3] = 1; this.props[4] = 0; this.props[5] = 0; return this; } function rotate(angle) { if (angle === 0) { return this; } var mCos = Math.cos(angle); var mSin = Math.sin(angle); return this._t(mCos, mSin, -mSin, mCos, 0, 0); } function shear(sx, sy) { return this._t(1, sy, sx, 1, 0, 0); } function skew(ax, ay) { return this.shear(Math.tan(ax), Math.tan(ay)); } function skewFromAxis(ax, angle) { var mCos = Math.cos(angle), mSin = Math.sin(angle); return this._t(mCos, mSin, -mSin, mCos, 0, 0)._t(1, 0, Math.tan(ax), 1, 0, 0)._t(mCos, -mSin, mSin, mCos, 0, 0); } function scale(sx, sy) { if (sx === 1 && sy === 1) { return this; } return this._t(sx, 0, 0, sy, 0, 0); } function setTransform(a, b, c, d, e, f) { this.props[0] = a; this.props[1] = b; this.props[2] = c; this.props[3] = d; this.props[4] = e; this.props[5] = f; return this; } function translate(tx, ty) { if(tx !== 0 || ty !== 0) { this.props[4] = this.props[0] * tx + this.props[2] * ty + this.props[4]; this.props[5] = this.props[1] * tx + this.props[3] * ty + this.props[5]; } return this; } function transform(a2, b2, c2, d2, e2, f2) { if (a2 === 1 && b2 === 0 && c2 === 0 && d2 === 1) { if (e2 !== 0 || f2 !== 0) { this.props[4] = this.props[0] * e2 + this.props[2] * f2 + this.props[4]; this.props[5] = this.props[1] * e2 + this.props[3] * f2 + this.props[5]; } return this; } var a1 = this.props[0]; var b1 = this.props[1]; var c1 = this.props[2]; var d1 = this.props[3]; var e1 = this.props[4]; var f1 = this.props[5]; /* matrix order (canvas compatible): * ace * bdf * 001 */ this.props[0] = a1 * a2 + c1 * b2; this.props[1] = b1 * a2 + d1 * b2; this.props[2] = a1 * c2 + c1 * d2; this.props[3] = b1 * c2 + d1 * d2; this.props[4] = a1 * e2 + c1 * f2 + e1; this.props[5] = b1 * e2 + d1 * f2 + f1; return this; } function clone(matr) { matr.props[0] = this.props[0]; matr.props[1] = this.props[1]; matr.props[2] = this.props[2]; matr.props[3] = this.props[3]; matr.props[4] = this.props[4]; matr.props[5] = this.props[5]; } function applyToPoint(x, y) { return { x: x * this.props[0] + y * this.props[2] + this.props[4], y: x * this.props[1] + y * this.props[3] + this.props[5] }; /*return { x: x * me.a + y * me.c + me.e, y: x * me.b + y * me.d + me.f };*/ } function applyToX(x, y) { return x * this.props[0] + y * this.props[2] + this.props[4]; } function applyToY(x, y) { return x * this.props[1] + y * this.props[3] + this.props[5]; } function applyToPointArray(x, y){ return [x * this.props[0] + y * this.props[2] + this.props[4], x * this.props[1] + y * this.props[3] + this.props[5]]; } function applyToPointStringified(x, y) { return (bm_rnd(x * this.props[0] + y * this.props[2] + this.props[4]))+',' + (bm_rnd(x * this.props[1] + y * this.props[3] + this.props[5])); } function toArray() { return [this.props[0], this.props[1], this.props[2], this.props[3], this.props[4], this.props[5]]; } function toCSS() { this.cssParts[1] = this.props.join(','); return this.cssParts.join(''); //return "matrix(" + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ")"; } function toString() { return "" + this.toArray(); } return function(){ this.reset = reset; this.rotate = rotate; this.skew = skew; this.skewFromAxis = skewFromAxis; this.shear = shear; this.scale = scale; this.setTransform = setTransform; this.translate = translate; this.transform = transform; this.applyToPoint = applyToPoint; this.applyToX = applyToX; this.applyToY = applyToY; this.applyToPointArray = applyToPointArray; this.applyToPointStringified = applyToPointStringified; this.toArray = toArray; this.toCSS = toCSS; this.toString = toString; this.clone = clone; this._t = this.transform; this.props = [1, 0, 0, 1, 0, 0]; this.cssParts = ['matrix(', '', ')']; } }());