OSDN Git Service

Float32Arrray を使うように変更
authorYoshihiro Yamazaki <yoya@awm.jp>
Tue, 11 Dec 2012 10:24:45 +0000 (19:24 +0900)
committerYoshihiro Yamazaki <yoya@awm.jp>
Tue, 11 Dec 2012 10:24:45 +0000 (19:24 +0900)
src/swf/matrix.js

index e828868..0263169 100644 (file)
@@ -5,45 +5,66 @@ goog.scope(function() {
 /**
  * @constructor
  */
-FlappSWFMatrix = function(ibit) {
-    ;
+FlappSWFMatrix = function() {
+    ; // no data property, only Float32Array procedure
 };
 
 FlappSWFMatrix.identity = function() {
-    return { scaleX:1, scaleY:1, skew0:0, skew1:0, transX:0, transY:0 };
+    var m = new Float32Array(6)
+    m[0] = m[3] = 1;
+    m[1] = m[2] = 0;
+    m[4] = m[5] = 0;
+    return m;
 };
 
-FlappSWFMatrix.multiplyScalar = function(m, a) {
-    return { scaleX:m.scaleX*a, scaleY:m.scaleY*a,
-            skew0:m.skew0*a, skew1:m.skew1*a, 
-            transX:m.transX*a, transY:m.transY*a };
+FlappSWFMatrix.multiplyScalar = function(m1, a) {
+    var m = new Float32Array(6)
+    m[0] = a* m1[0];
+    m[1] = a* m1[1];
+    m[2] = a* m1[2];
+    m[3] = a* m1[3];
+    m[4] = a* m1[4];
+    m[5] = a* m1[5];
+    return m;
+};
+
+
+FlappSWFMatrix.multiply = function(m1, m2) {
+    var m = new Float32Array(6);
+    /*
+     * / a1 c1 e1 \   / a2 c2 e2 \   / a1*a2+b1*c2 a1*b2+b1*d2 a1*e2+b1*f2+e1 \
+     * \ b1 d1 f1 / * \ b1 d2 f2 / = \ c1*a2+d1*c2 c1*b2+d1*d2 c1*e2+d1*f2+f1 /
+     */
+    m[0] = m1[0]*m2[0] + m1[1]*m2[2]; // a1*a2 + b1*c2;
+    m[1] = m1[2]*m2[0] + m1[3]*m2[2]; // c1*a2 + d1*c2;
+    m[2] = m1[0]*m2[1] + m1[1]*m2[3]; // a1*b2 + b1*d2
+    m[3] = m1[2]*m2[1] + m1[3]*m2[3]; // c1*b2 + d1*d2
+    m[4] = m1[0]*m2[4] + m1[1]*m2[5] + m1[4]; // a1*e2 + b1*f2 + e1
+    m[5] = m1[2]*m2[4] + m1[3]*m2[5] + m1[5]; // c1*e2 + d1*f2 + f1
+    return m;
 };
 
 FlappSWFMatrix.load = function(ibit) {
     ibit.a();
+    var m = new Float32Array(6);
     if (ibit.b()) { // HasScale
         var nScaleBits = ibit.ub(5);
-        var scaleX = ibit.sb(nScaleBits) / 0x10000;
-        var scaleY = ibit.sb(nScaleBits) / 0x10000;
+        m[0] = ibit.sb(nScaleBits) / 0x10000; // ScaleX
+        m[3] = ibit.sb(nScaleBits) / 0x10000; // ScaleY 
     } else {
-        var scaleX = 1;
-        var scaleY = 1;
+        m[0] = m[3] = 1; // scaleX, scaleY
     }
     if (ibit.b()) { // HasSkew
         var nSkewBits = ibit.ub(5);
-        var skew0 = ibit.sb(nSkewBits) / 0x10000;
-        var skew1 = ibit.sb(nSkewBits) / 0x10000;
+        m[1] = ibit.sb(nSkewBits) / 0x10000; // RotateSkew0
+        m[2] = ibit.sb(nSkewBits) / 0x10000; // RotateSkew1
     } else {
-        var skew0 = 0;
-        var skew1 = 0;
+        m[1] = m[2] = 0; // RotateSkew0, RotateSkew1
     }
     var nTransBits = ibit.ub(5);
-    var transX = ibit.sb(nTransBits);
-    var transY = ibit.sb(nTransBits);
-
-    return { scaleX:scaleX, scaleY:scaleY, skew0:skew0, skew1:skew1,
-        transX:transX, transY:transY
-    };
+    m[4] = ibit.sb(nTransBits); // TranslateX
+    m[5] = ibit.sb(nTransBits); // TranslateY
+    return m;
 };
 
 });