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