[Sie-announce] SIEコード [2006] SVGAnimateColorElementの実装開始

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 9月 20日 (月) 23:29:39 JST


Revision: 2006
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2006
Author:   dhrname
Date:     2010-09-20 23:29:39 +0900 (Mon, 20 Sep 2010)

Log Message:
-----------
SVGAnimateColorElementの実装開始

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

Modified: branches/06x/061/org/w3c/dom/svg.js
===================================================================
--- branches/06x/061/org/w3c/dom/svg.js	2010-09-17 12:58:51 UTC (rev 2005)
+++ branches/06x/061/org/w3c/dom/svg.js	2010-09-20 14:29:39 UTC (rev 2006)
@@ -4394,7 +4394,7 @@
   this.addEventListener("beginEvent", function(evt) {
     var tar = evt.target;
     if (tar.targetElement) {
-      var attrName = tar.getAttributeNS(null, "attributeName"), newAttr = tar.targetElement.attributes.getNamedItemNS(null, attrName);console.log(newAttr);
+      var attrName = tar.getAttributeNS(null, "attributeName"), newAttr = tar.targetElement.attributes.getNamedItemNS(null, attrName);
       var tta = tar.targetElement[attrName];
       if (!!tta) {
         var base = tta.baseVal;
@@ -4451,19 +4451,44 @@
     var tar = evt.target, name = evt.attrName;
     if (name === "path") {
       var d = tar.ownerDocument.createElementNS("http://www.w3.org/2000/svg", "path");
-      d.setAttributeNS(null, evt.newValue);
+      d.setAttributeNS(null, "d", evt.newValue);
       tar._path = d;
       d = null;
     }
   }, false);
   this.addEventListener("beginEvent", function(evt) {
-    var tar = evt.target;
+    var tar = evt.target, trans = tar.targetElement.transform;
+    /*アニメーション中に変化すべき値をanimValプロパティに入力して、
+     *baseValと同じような値に設定。
+     */
+    trans.animVal = new SVGTransformList();
+    trans.animVal.initialize(trans.baseVal.createSVGTransformFromMatrix(trans.baseVal.getItem(0).matrix));
+    trans.animVal.setItem(tar.ownerDocument.documentElement.createSVGTransform());
     tar._frame = function() {
-      var _tar = tar, tpn = _tar._path.normalizedPathSegList;
+      var _tar = tar, tpn = _tar._path;
+      if (!!tpn) {
+        var st = (tpn.getTotalLength() / _tar.getSimpleDuration()) * _tar.getCurrentTime() / 125 * 0.8;
+        var p = tpn.getPointAtLength(st), trans = _tar.targetElement.transform;
+        p = p.matrixTransform(_tar.targetElement.getScreenCTM())
+        trans.animVal.getItem(trans.numberOfItmes-1).setTranslate(p.x, p.y);
+        var base = trans.baseVal;
+        trans.baseVal = trans.animVal;
+        var evtt = _tar.ownerDocument.createEvent("MutationEvents");
+        evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
+        _tar.targetElement.dispatchEvent(evtt);
+        trans.baseVal = base;
+        evtt = base = trans = null;
+      }
     }
+    evt = trans = null;
   }, false);
   this.addEventListener("endEvent", function(evt) {
-    var tar = evt.target;
+    var tar = evt.target, trans = tar.targetElement.transform;
+    trans.animVal = trans.baseVal;
+    var evtt = tar.ownerDocument.createEvent("MutationEvents");
+    evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
+    tar.targetElement.dispatchEvent(evtt);
+    tar._frame = evt = evtt = null;
   }, false);
   this.addEventListener("repeatEvent", function(evt) {
     var tar = evt.target;
@@ -4487,11 +4512,70 @@
 function SVGAnimateColorElement() {
   SVGAnimationElement.apply(this);
   NAIBU.Clip[NAIBU.Clip.length] = this;
-  this.addEventListener("beginEvent", function(evt) {
+  this._from = this._to = this._values = this._by = null;
+  this.addEventListener("DOMAttrModified", function(evt){
+    if (evt.eventPhase === Event.BUBBLING_PHASE) {
+      return;
+    }
+    var tar = evt.target, name = evt.attrName;
+    if (name === "from") {
+      tar._from = evt.newValue;
+    } else if (name === "to") {
+      tar._to = evt.newValue;
+    } else if (name === "values") {
+      tar._values = evt.newValue.split(";");
+    } else if (name === "by") {
+      tar._by = evt.newValue;
+    }
+  }, false);
+  this.addEventListener("DOMNodeInserted", function(evt){
     var tar = evt.target;
+    if (evt.eventPhase === Event.BUBBLING_PHASE) {
+      return; //強制終了させる
+    }
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
+      var tar = evt.target;
+      /*以降の場合分けルールに関しては、下記の仕様を参照
+       *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#AnimationNS-FromToBy
+       */
+      if (tar._values) {
+      } else if (tar._from && tar._to) {
+        tar._values = [tar._from, tar._to];
+      } else if (tar._from && tar._by) {
+        var n = parseFloat(tar._from) + parseFloat(tar._by), tanni = tar._from.match(/\D+/) || [""];
+        tar._values = [tar._from, n+tanni[0]];
+      } else if (tar._to) {
+        tar._values = [null, tar._to];
+      } else if (tar._by) {
+        tar._values = ["0", tar._by];
+      }
+    }, false);
+    tar = null;
   }, false);
+  this.addEventListener("beginEvent", function(evt) {
+    var tar = evt.target, attrName = tar.getAttributeNS(null, "attributeName");
+    var style = tar.ownerDocument.getOverrideStyle(tar.targetElement, "");
+    var fstyle = tar.ownerDocument.defaultView.getComputedStyle(tar.targetElement, "");
+    if (tar._values[0] !== null) {
+      style.setProperty(attrName, tar._values[0], null);
+    }
+    tar._frame = function() {
+      var _tar = tar, t = new SVGColor(), fill = style.getPropertyCSSValue(attrName);
+      t.setRGBColor(tar._valuse[1]);
+      var fc = fill.rgbColor, tc = t.rgbColor, num = CSSPrimitiveValue.CSS_NUMBER, di = _tar.getSimpleDuration();
+      var r = (fc.red.getFloatValue(num)-tc.red.getFloatValue(num)) / di;
+      var g = (fc.green.getFloatValue(num) - tc.blue.getFloatValue(num)) / di;
+      var b = (fc.blue.getFloatValue(num) - tc.blue.getFloatValue(num)) / di;
+      style.setProperty(attrName, "rgb(" +r+ "," +g+ "," +"b"+ ")", null);
+      _tar = t = fc = tc = num = r = g = b = null;
+    }
+  }, false);
   this.addEventListener("endEvent", function(evt) {
     var tar = evt.target;
+    var evtt = tar.ownerDocument.createEvent("MutationEvents");
+    evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
+    tar.targetElement.dispatchEvent(evtt);
+    tar._frame = evt = evtt = null;
   }, false);
   this.addEventListener("repeatEvent", function(evt) {
     var tar = evt.target;




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