Elm.Native.Matrix2D = function(elm) { "use strict"; elm.Native = elm.Native || {}; if (elm.Native.Matrix2D) return elm.Native.Matrix2D; if (typeof Float32Array === 'undefined'){ Float32Array = Array; } var A = Float32Array; // layout of matrix in an array is // // | m11 m12 dx | // | m21 m22 dy | // | 0 0 1 | // // new A([ m11, m12, dx, m21, m22, dy ]) var identity = new A([1,0,0,0,1,0]); function matrix(m11, m21, m12, m22, dx, dy) { return new A([m11, m12, dx, m21, m22, dy]); } function rotate(t,m) { var c = Math.cos(t); var s = Math.sin(t); var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4]; return new A([m11*c + m12*s, -m11*s + m12*c, m[2], m21*c + m22*s, -m21*s + m22*c, m[5]]); } function move(x,y,m) { var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4]; return new A([m11, m12, m11*x + m12*y + m[2], m21, m22, m21*x + m22*y + m[5]]); } function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); } function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); } function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); } function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); } function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); } function transform(m11, m21, m12, m22, mdx, mdy, n) { var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5]; return new A([m11*n11 + m12*n21, m11*n12 + m12*n22, m11*ndx + m12*ndy + mdx, m21*n11 + m22*n21, m21*n12 + m22*n22, m21*ndx + m22*ndy + mdy]); } function multiply(m, n) { return transform(m[0], m[3], m[1], m[4], m[2], m[5], n); } return elm.Native.Matrix2D = { identity:identity, matrix:F6(matrix), multiply:F2(multiply), transform:F7(transform), rotate:F2(rotate), move:F3(move), scale:F2(scale), scaleX:F2(scaleX), scaleY:F2(scaleY), reflectX:reflectX, reflectY:reflectY }; };