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) {