[Sie-announce] SIEコード [2141] linearに関する基本的なアニメーション関数を適用

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 11月 13日 (土) 23:44:20 JST


Revision: 2141
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2141
Author:   dhrname
Date:     2010-11-13 23:44:20 +0900 (Sat, 13 Nov 2010)

Log Message:
-----------
linearに関する基本的なアニメーション関数を適用

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-12 13:59:18 UTC (rev 2140)
+++ branches/06x/063/org/w3c/dom/svg.js	2010-11-13 14:44:20 UTC (rev 2141)
@@ -4491,7 +4491,7 @@
   this._begin = null;
   this._end = null;
   this._from = this._to = this._values = this._by = null;
-  this._keyTimes = null;
+  this._keyTimes = [0, 1];
   this.addEventListener("beginEvent", function(evt) {
     var tar = evt.target;
     if (!tar.isRepeat) {
@@ -4532,7 +4532,11 @@
     } else if (name === "by") {
       tar._by = evt.newValue;
     } else if (name === "keyTimes") {
-      tar._keyTimes = evt.newValue.split(";");
+      var s = evt.newValue.split(";");
+      for (var i=0;i<s.length;++i) {
+        tar._keyTimes[i] = parseFloat(s[i]);
+      }
+      s = null;
     }
     evt = null;
   }, false);
@@ -4682,6 +4686,10 @@
     throw new DOMException(DOMException.INVALID_STATE_ERR);
   }
 };
+/*getCurrentTimeメソッド
+ *現在の時間コンテナ内での時刻であり、
+ *決して現在時刻ではない。要素のbeginイベントの発火したときが0sである。
+ */
 /*float*/ SVGAnimationElement.prototype.getCurrentTime = function(){
   return (this._currentFrame * 125 / 0.8);
 };
@@ -4750,6 +4758,9 @@
    *くわしくはNAIBU.Time.start関数のコードを参照
    */
   NAIBU.Clip[NAIBU.Clip.length] = this;
+  /*_valueListプロパティは、
+   *機会が理解できる形で保管されているvalueの値の配列リスト
+   */
   this._valueList = [];
   this.addEventListener("DOMNodeInserted", function(evt){
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
@@ -4762,57 +4773,72 @@
        *[(new SVGPoint()), (new SVGPoint())]
        *この_valueListプロパティはアニメの際に使うので、_valuesプロパティはアニメ中に使わない
        */
+      var vi = ttr.cloneNode(false);
       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;
         }
       } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば
-        tar._valueList = tar._value;
+        for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
+          tar._valueList = parseFloat(tar._value);
+        }
       } else if ("animatedPoints" in ttr) {
+        ttr.animatedPoints = vi.points;
         for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
-          var vir = ttr.cloneNode(false); //仮の要素
+          var vir = ttr.cloneNode(false);
+          delete vir._tar;
           vir.setAttributeNS(null, "points", tav[i]);
           tar._valueList[tar._valueList.length] = vir.points;
         }
       } else if ("normalizedPathSegList" in ttr) {
+        ttr.animatedNormalizedPathSegList = vi.normalizedPathSegList;
         for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
-          var vir = ttr.cloneNode(false); //仮の要素
+          var vir = ttr.cloneNode(false);
+          delete vir._tar;
           vir.setAttributeNS(null, "d", tav[i]);
           tar._valueList[tar._valueList.length] = vir.normalizedPathSegList;
         }
       } else {
+        vi = null;
         return;
       }
-      evt = tta = vir  = null;
+      evt = tta = vir = vi = null;
     }, false);
   }, false);
   this.addEventListener("beginEvent", function(evt) {
     var tar = evt.target;
     var attrName = tar.getAttributeNS(null, "attributeName"), newAttr = tar.targetElement.attributes.getNamedItemNS(null, attrName);
     var ttr = tar.targetElement, tta = ttr[attrName];
-    var vir = ttr.cloneNode(false), vta = vir[attrName];
     tar._frame = function() {
-      var d = tar.getSimpleDuration(), n = tar._valueList.length - 1;
+      var d = tar.getSimpleDuration(), n = tar._valueList.length - 1, tg = tar.getCurrentTime();
       if ((n !== -1) && (d !== 0)) {
-        var ntd = n / d;
+        var ii = Math.floor(tg*n) / d;
       } else {
         return;
       }
-      var ii = Math.floor(tar.getCurrentTime() * ntd);
       if (!!tta) {
-        var base = tta.baseVal;
-        tta.baseVal = vta;
+        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;
+        tanim.newValueSpecifiedUnits(tanim.unitType, v);
+        tta.baseVal = tanim;
+        tanim = null;
       } 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;
       } else if ("animatedPoints" in ttr) {
-        var base = tta.points;
-        tta.points = vta;
+        var base = ttr.points;
+        ttr.points = ttr.animatedPoints;
       } else if ("normalizedPathSegList" in ttr) {
-        var base = tta.normalizedPathSegList;
-        tta.normalizedPathSegList = vta;
+        var base = ttr.normalizedPathSegList;
+        ttr.normalizedPathSegList = ttr.animatedNormalizedPathSegList;
       }
+      v1 = v2 = v = null;
       /*setAttrbute(NS)メソッドはDOM属性を書き換えるため利用しない。
       *
       * 参照:アニメーションサンドイッチモデル
@@ -4834,7 +4860,7 @@
        tta.animatedPoints = tta.points;
        tta.points = base;
      } else if ("normalizedPathSegList" in ttr) {
-       tta.animatednormalizedPathSegList = tta.normalizedPathSegList;
+       tta.animatedNormalizedPathSegList = tta.normalizedPathSegList;
        tta.normalizedPathSegList = base;
      }
     };




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