svnno****@sourc*****
svnno****@sourc*****
2010年 11月 14日 (日) 22:22:12 JST
Revision: 2142 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2142 Author: dhrname Date: 2010-11-14 22:22:12 +0900 (Sun, 14 Nov 2010) Log Message: ----------- animate要素の単純なアニメーションを実装 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-13 14:44:20 UTC (rev 2141) +++ branches/06x/063/org/w3c/dom/svg.js 2010-11-14 13:22:12 UTC (rev 2142) @@ -4759,7 +4759,7 @@ */ NAIBU.Clip[NAIBU.Clip.length] = this; /*_valueListプロパティは、 - *機会が理解できる形で保管されているvalueの値の配列リスト + *機械が理解できる形で保管されているvalueの値の配列リスト */ this._valueList = []; this.addEventListener("DOMNodeInserted", function(evt){ @@ -4774,17 +4774,20 @@ *この_valueListプロパティはアニメの際に使うので、_valuesプロパティはアニメ中に使わない */ var vi = ttr.cloneNode(false); + if (!tar._values[0]) { + tar._values[0] = ttr.getAttributeNS(null, attrName) || ttr.style.getPropertyValue(attrName); + } 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; + tar._valueList[tar._valueList.length] = vir[attrName].baseVal; } } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) { - tar._valueList = parseFloat(tar._value); + tar._valueList[i] = parseFloat(tav[i]); } } else if ("animatedPoints" in ttr) { ttr.animatedPoints = vi.points; @@ -4815,54 +4818,55 @@ var ttr = tar.targetElement, tta = ttr[attrName]; tar._frame = function() { var d = tar.getSimpleDuration(), n = tar._valueList.length - 1, tg = tar.getCurrentTime(); - if ((n !== -1) && (d !== 0)) { - var ii = Math.floor(tg*n) / d; + if ((n !== -1) && (d !== 0) && (tg <= d)) { + var ii = Math.floor((tg*n) / d); } else { return; } + /*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("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null); if (!!tta) { 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; + var v1 = tar._valueList[ii].value, v2 = tar._valueList[ii+1].value; + /*vを求める公式に関しては、SMIL2.0 Animation Moduleの単純アニメーション関数の項を参照 + * 3.4.2 Specifying the simple animation function f(t) + *http://www.w3.org/TR/2005/REC-SMIL2-20050107/animation.html#animationNS-SpecifyingAnimationFunction + */ + var v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) / d; tanim.newValueSpecifiedUnits(tanim.unitType, v); tta.baseVal = tanim; tanim = null; + ttr.dispatchEvent(evt); + /*変化値はanimValプロパティに収納しておき、 + *変化する前の、元の値はbaseValプロパティに再び収納しておく + */ + tta.animVal = tta.baseVal; + tta.baseVal = base; } 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; + var v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) / d; + ttr.dispatchEvent(evt); } else if ("animatedPoints" in ttr) { var base = ttr.points; ttr.points = ttr.animatedPoints; + ttr.dispatchEvent(evt); + tta.animatedPoints = tta.points; + tta.points = base; } else if ("normalizedPathSegList" in ttr) { var base = ttr.normalizedPathSegList; ttr.normalizedPathSegList = ttr.animatedNormalizedPathSegList; + ttr.dispatchEvent(evt); + tta.animatedNormalizedPathSegList = tta.normalizedPathSegList; + tta.normalizedPathSegList = base; } - v1 = v2 = v = null; - /*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("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null); - ttr.dispatchEvent(evt); - evt = null; - if (!!tta) { - /*変化値はanimValプロパティに収納しておき、 - *変化する前の、元の値はbaseValプロパティに再び収納しておく - */ - tta.animVal = tta.baseVal; - tta.baseVal = base; - } else if (!base) { //スタイルシートのプロパティならば - } else if ("animatedPoints" in ttr) { - tta.animatedPoints = tta.points; - tta.points = base; - } else if ("normalizedPathSegList" in ttr) { - tta.animatedNormalizedPathSegList = tta.normalizedPathSegList; - tta.normalizedPathSegList = base; - } + evt = v1 = v2 = v = null; }; evt = vir = null; }, false);