[Sie-announce] SIEコード [2134] SVGAnimateElementの_valuesプロパティと_valueListプロパティとの変換に関する処理を追加

Zurück zum Archiv-Index

svnno****@sourc***** svnno****@sourc*****
2010年 11月 10日 (水) 21:16:08 JST


Revision: 2134
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2134
Author:   dhrname
Date:     2010-11-10 21:16:08 +0900 (Wed, 10 Nov 2010)

Log Message:
-----------
SVGAnimateElementの_valuesプロパティと_valueListプロパティとの変換に関する処理を追加

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-07 12:30:31 UTC (rev 2133)
+++ branches/06x/063/org/w3c/dom/svg.js	2010-11-10 12:16:08 UTC (rev 2134)
@@ -4733,9 +4733,84 @@
    *くわしくはNAIBU.Time.start関数のコードを参照
    */
   NAIBU.Clip[NAIBU.Clip.length] = this;
+  this._valueList = [];
+  this.addEventListener("DOMNodeInserted", function(evt){
+    if (evt.eventPhase === Event.BUBBLING_PHASE) {
+      return; //強制終了させる
+    }
+    var tar = evt.target;
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
+      var tar = evt.target, attrName = tar.getAttributeNS(null, "attributeName"),ttr = tar.targetElement, tta = ttr[attrName];
+      /*tar.valuesのリスト: ex. ["12px", "13px"]を、次のように機械に理解できるよう変換して、tar._valueListに格納
+       *[(new SVGPoint()), (new SVGPoint())]
+       *この_valueListプロパティはアニメの際に使うので、_valuesプロパティはアニメ中に使わない
+       */
+      if (!!tta) {
+        var base = tta.baseVal;
+        for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
+          if (base instanceof SVGLength) {
+            tta.baseVal = tar.ownerDocument.documentElement.createSVGLength();
+          } else if (base instanceof SVGRect) {
+            tta.baseVal = tar.ownerDocument.documentElement.createSVGRect();
+          } else {
+            return;
+          }
+          ttr.setAttributeNS(null, attrName, tav[i]);
+          tar._valueList[tar._valueList.length] = tta.baseVal;
+        }
+        tta.baseVal = base;
+      } else if ("animatedPoints" in ttr) {
+        var base = ttr.points;
+        for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
+          ttr.points = new SVGPointList();
+          ttr.setAttributeNS(null, "points", tav[i]);
+          tar._valueList[tar._valueList.length] = ttr.points;
+        }
+        ttr.points = base;
+      } else if ("normalizedPathSegList" in ttr) {
+        var base = ttr.normalizedPathSegList;
+        for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
+          ttr.normalizedPathSegList = new PathSegList();
+          ttr.setAttributeNS(null, "d", tav[i]);
+          tar._valueList[tar._valueList.length] = ttr.normalizedPathSegList;
+        }
+        ttr.normalizedPathSegList = base;
+      } else {
+        return;
+      }
+      tta  = 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 tta = tar.targetElement[attrName];
     tar._frame = function() {
+      var d = tar.getSimpleDuration(), n = tar._values.length - 1;
+      if ((n !== -1) && (d !== 0)) {
+        var ntd = n / d;
+      } else {
+        return;
+      }
+      if (!!tta) {
+        var base = tta.baseVal;
+        var ii = Math.floor(tar.getCurrentTime() * ntd);
+        /*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("DOMAttrModified", true, false, newAttr, newAttr, tar._to, attrName, MutationEvent.MODIFICATION);
+        tar.targetElement.dispatchEvent(evt);
+        evt = null;
+        /*変化値はanimValプロパティに収納しておき、
+         *変化する前の、元の値はbaseValプロパティに再び収納しておく
+         */
+        tta.animVal = tta.baseVal;
+        tta.baseVal = base;
+      }
     };
   }, false);
   this.addEventListener("endEvent", function(evt) {




Sie-announce メーリングリストの案内
Zurück zum Archiv-Index