on 2ee2372 help sign in
72 lines 2.1 kB history raw
2Elm.Native.Graphics.Matrix = function(elm) {
3 "use strict";
5 elm.Native = elm.Native || {};
6 elm.Native.Graphics = elm.Native.Graphics || {};
7 if (elm.Native.Graphics.Matrix) return elm.Native.Graphics.Matrix;
9 try { Float32Array; } catch(e) { Float32Array = Array; }
10 var A = Float32Array;
12 // layout of matrix in an array is
13 //
14 // | m11 m12 dx |
15 // | m21 m22 dy |
16 // | 0 0 1 |
17 //
18 // new A([ m11, m12, dx, m21, m22, dy ])
20 var identity = new A([1,0,0,0,1,0]);
21 function matrix(m11, m21, m12, m22, dx, dy) {
22 return new A([m11, m12, dx, m21, m22, dy]);
23 }
25 function rotate(t,m) {
26 var c = Math.cos(t);
27 var s = Math.sin(t);
28 var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];
29 return new A([m11*c + m12*s, -m11*s + m12*c, m[2],
30 m21*c + m22*s, -m21*s + m22*c, m[5]]);
31 }
32 function move(x,y,m) {
33 var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];
34 return new A([m11, m12, m11*x + m12*y + m[2],
35 m21, m22, m21*x + m22*y + m[5]]);
36 }
37 function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); }
38 function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); }
39 function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); }
40 function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); }
41 function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); }
43 function transform(m11, m21, m12, m22, mdx, mdy, n) {
44 var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];
45 return new A([m11*n11 + m12*n21,
46 m11*n12 + m12*n22,
47 m11*ndx + m12*ndy + mdx,
48 m21*n11 + m22*n21,
49 m21*n12 + m22*n22,
50 m21*ndx + m22*ndy + mdy]);
51 }
53 function multiply(m, n) {
54 return transform(m[0], m[3], m[1], m[4], m[2], m[5], n);
55 }
57 return elm.Native.Graphics.Matrix = {
58 identity:identity,
59 matrix:F6(matrix),
60 multiply:F2(multiply),
62 transform:F7(transform),
63 rotate:F2(rotate),
64 move:F3(move),
65 scale:F2(scale),
66 scaleX:F2(scaleX),
67 scaleY:F2(scaleY),
68 reflectX:reflectX,
69 reflectY:reflectY
70 };
72};