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(', '', ')'];
}
}());