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;