[Sie-announce] SIEコード [2142] animate要素の単純なアニメーションを実装

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 11月 14日 (日) 22:22:12 JST


Revision: 2142
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2142
Author:   dhrname
Date:     2010-11-14 22:22:12 +0900 (Sun, 14 Nov 2010)

Log Message:
-----------
animate要素の単純なアニメーションを実装

Modified Paths:
--------------
    branches/06x/063/org/w3c/dom/svg.js

Modified: branches/06x/063/org/w3c/dom/svg.js
===================================================================
--- branches/06x/063/org/w3c/dom/svg.js	2010-11-13 14:44:20 UTC (rev 2141)
+++ branches/06x/063/org/w3c/dom/svg.js	2010-11-14 13:22:12 UTC (rev 2142)
@@ -4759,7 +4759,7 @@
    */
   NAIBU.Clip[NAIBU.Clip.length] = this;
   /*_valueListプロパティは、
-   *機会が理解できる形で保管されているvalueの値の配列リスト
+   *機械が理解できる形で保管されているvalueの値の配列リスト
    */
   this._valueList = [];
   this.addEventListener("DOMNodeInserted", function(evt){
@@ -4774,17 +4774,20 @@
        *この_valueListプロパティはアニメの際に使うので、_valuesプロパティはアニメ中に使わない
        */
       var vi = ttr.cloneNode(false);
+      if (!tar._values[0]) {
+        tar._values[0] = ttr.getAttributeNS(null, attrName) || ttr.style.getPropertyValue(attrName);
+      }
       if (!!tta) {
         ttr[attrName].animVal = vi[attrName].baseVal;
         for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
           var vir = ttr.cloneNode(false); //仮の要素
           delete vir._tar;
           vir.setAttributeNS(null, attrName, tav[i]);
-          tar._valueList[tar._valueList.length] = vir.baseVal;
+          tar._valueList[tar._valueList.length] = vir[attrName].baseVal;
         }
       } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば
         for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
-          tar._valueList = parseFloat(tar._value);
+          tar._valueList[i] = parseFloat(tav[i]);
         }
       } else if ("animatedPoints" in ttr) {
         ttr.animatedPoints = vi.points;
@@ -4815,54 +4818,55 @@
     var ttr = tar.targetElement, tta = ttr[attrName];
     tar._frame = function() {
       var d = tar.getSimpleDuration(), n = tar._valueList.length - 1, tg = tar.getCurrentTime();
-      if ((n !== -1) && (d !== 0)) {
-        var ii = Math.floor(tg*n) / d;
+      if ((n !== -1) && (d !== 0) && (tg <= d)) {
+        var ii = Math.floor((tg*n) / d);
       } else {
         return;
       }
+      /*setAttrbute(NS)メソッドはDOM属性を書き換えるため利用しない。
+      *
+      * 参照:アニメーションサンドイッチモデル
+      * >アニメーションが起動している時,それは実際,DOMの中の属性値は変化しない。
+      *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#animationNS-AnimationSandwichModel
+      */
+      var evt = tar.ownerDocument.createEvent("MutationEvents");
+      evt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
       if (!!tta) {
         var base = tta.baseVal, tanim = tta.animVal;
-        var v1 = tar._valueList[ii], v2 = tar._valueList[ii+1];
-        var v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) * (n-1) / d;
+        var v1 = tar._valueList[ii].value, v2 = tar._valueList[ii+1].value;
+        /*vを求める公式に関しては、SMIL2.0 Animation Moduleの単純アニメーション関数の項を参照
+         * 3.4.2 Specifying the simple animation function f(t)
+         *http://www.w3.org/TR/2005/REC-SMIL2-20050107/animation.html#animationNS-SpecifyingAnimationFunction
+         */
+        var v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) / d;
         tanim.newValueSpecifiedUnits(tanim.unitType, v);
         tta.baseVal = tanim;
         tanim = null;
+        ttr.dispatchEvent(evt);
+        /*変化値はanimValプロパティに収納しておき、
+         *変化する前の、元の値はbaseValプロパティに再び収納しておく
+         */
+        tta.animVal = tta.baseVal;
+        tta.baseVal = base;
       } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば
         var base = null;
         var v1 = tar._valueList[ii], v2 = tar._valueList[ii+1];
-        var v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) * (n-1) / d;
+        var v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) / d;
+        ttr.dispatchEvent(evt);
       } else if ("animatedPoints" in ttr) {
         var base = ttr.points;
         ttr.points = ttr.animatedPoints;
+        ttr.dispatchEvent(evt);
+        tta.animatedPoints = tta.points;
+        tta.points = base;
       } else if ("normalizedPathSegList" in ttr) {
         var base = ttr.normalizedPathSegList;
         ttr.normalizedPathSegList = ttr.animatedNormalizedPathSegList;
+        ttr.dispatchEvent(evt);
+        tta.animatedNormalizedPathSegList = tta.normalizedPathSegList;
+        tta.normalizedPathSegList = base;
       }
-      v1 = v2 = v = null;
-      /*setAttrbute(NS)メソッドはDOM属性を書き換えるため利用しない。
-      *
-      * 参照:アニメーションサンドイッチモデル
-      * >アニメーションが起動している時,それは実際,DOMの中の属性値は変化しない。
-      *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#animationNS-AnimationSandwichModel
-      */
-     var evt = tar.ownerDocument.createEvent("MutationEvents");
-     evt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
-     ttr.dispatchEvent(evt);
-     evt = null;
-     if (!!tta) {
-       /*変化値はanimValプロパティに収納しておき、
-        *変化する前の、元の値はbaseValプロパティに再び収納しておく
-        */
-       tta.animVal = tta.baseVal;
-       tta.baseVal = base;
-     } else if (!base) { //スタイルシートのプロパティならば
-     } else if ("animatedPoints" in ttr) {
-       tta.animatedPoints = tta.points;
-       tta.points = base;
-     } else if ("normalizedPathSegList" in ttr) {
-       tta.animatedNormalizedPathSegList = tta.normalizedPathSegList;
-       tta.normalizedPathSegList = base;
-     }
+     evt = v1 = v2 = v = null;
     };
     evt = vir = null;
   }, false);




Sie-announce メーリングリストの案内
Back to archive index