[Sie-announce] SIEコード [1914] SMIL言語に関する修正を施した

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 6月 30日 (水) 22:36:11 JST


Revision: 1914
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1914
Author:   dhrname
Date:     2010-06-30 22:36:11 +0900 (Wed, 30 Jun 2010)

Log Message:
-----------
SMIL言語に関する修正を施した

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

Modified: branches/06x/061/org/w3c/dom/events.js
===================================================================
--- branches/06x/061/org/w3c/dom/events.js	2010-06-30 13:35:25 UTC (rev 1913)
+++ branches/06x/061/org/w3c/dom/events.js	2010-06-30 13:36:11 UTC (rev 1914)
@@ -151,21 +151,22 @@
   /*最初に捕獲フェーズでDOMツリーを下っていき、イベントのターゲットについたら、
    *そこで、浮上フェーズとして折り返すように、反復処理をおこなう
    */
-  for (var i=0, n=1, sli = s.length, slii = sli*2-1;i<slii;++i){
-    var d = sli - i;
+  for (var i=0, n=1, d=0, tce = null, sli = s.length, slii = sli*2-1;i<slii;++i){
+    d = sli - i;
     if (d === 0){ //イベントのターゲットに到着(折り返し地点)
       n = -1;
-      evt.eventPhase = Event.AT_TARGET;
+      evt.eventPhase = 2;//Event.AT_TARGET;
       evt.currentTarget = evt.target;
     } else {
       evt.currentTarget = s[d*n-1];
     }
-    var tce = evt.currentTarget._capter; //tceは登録しておいたリスナーのリスト
+    tce = evt.currentTarget._capter; //tceは登録しておいたリスナーのリスト
     for (var j=0,tcli=tce.length;j<tcli;++j){
       if (tce[j]) {
         tce[j].handleEvent(evt);
       }
     }
+    j = tcli = null;
     if (evt._stop) {
       break; //stopPropagationメソッドが呼ばれたら、停止する
     }
@@ -173,12 +174,12 @@
       if (!evt.bubbles) {
         break; //浮上フェーズに移行せず、停止する
       }
-      evt.eventPhase = Event.BUBBLING_PHASE;
+      evt.eventPhase = 3;//Event.BUBBLING_PHASE;
     }
   }
-  var d = evt._default
-  evt = te = s = null;
-  return d;
+  var ed = evt._default
+  evt = te = s = d = tce = n = sli = slii = null;
+  return ed;
 };
 
 function EventListener(cap,type,listener) {
@@ -255,6 +256,8 @@
     evt = new UIEvent();
   } else if (eventType === "SVGEvents") {
     evt = new SVGEvent();
+  } else if (eventType === "TimeEvents") {
+    evt = new TimeEvent();
   } else {
     evt =  new Event();
   }

Modified: branches/06x/061/org/w3c/dom/smil.js
===================================================================
--- branches/06x/061/org/w3c/dom/smil.js	2010-06-30 13:35:25 UTC (rev 1913)
+++ branches/06x/061/org/w3c/dom/smil.js	2010-06-30 13:36:11 UTC (rev 1914)
@@ -67,17 +67,38 @@
   typedef dom::DOMString DOMString;
 */
 function ElementTimeControl(ele) {
-  this.tar = ele;
+  this._tar = ele;
+  /*_beginと_endプロパティはミリ秒数を収納する。リピート時に書き換えられることがある。
+   *_beginはアニメ開始時の秒数。_endはアニメ終了時の秒数。
+   *なお、文書読み込み終了時(アニメ開始時刻)の秒数を0とする。
+   */
+  this._begin = null;
+  this._end = null;
   return this;
 };
 ElementTimeControl.prototype = {
-  /*void*/  beginElement : function() {},
-  /*void*/  endElement : function() {},
-  /*void*/  beginElementAt : function(/*float*/ offset) {},
-  /*void*/  endElementAt : function(/*float*/ offset) {}
+  /*void*/  beginElement : function() {
+    var ttd = this._tar.ownerDocument, evt = ttd.createEvent("TimeEvents");
+    evt.initTimeEvent("beginEvent", ttd.defaultView, 0);
+    this._tar.dispatchEvent(evt);
+  },
+  /*void*/  endElement : function() {
+    var ttd = this._tar.ownerDocument, evt = ttd.createEvent("TimeEvents");
+    evt.initTimeEvent("endEvent", ttd.defaultView, 0);
+    this._tar.dispatchEvent(evt);
+  },
+  /*void*/  beginElementAt : function(/*float*/ offset) {
+    var ntc = this._tar.ownerDocument.rootElement.getCurrentTime();
+    this._begin = offset + ntc;
+  },
+  /*void*/  endElementAt : function(/*float*/ offset) {
+    var ntc = this._tar.ownerDocument.rootElement.getCurrentTime();
+    this._end = offset + ntc;
+  }
 };
 
 function TimeEvent() {
+  Event.apply(this);
   /*readonly attribute views::AbstractView*/  this.view;
   /*readonly attribute long*/             this.detail;
   return this;

Modified: branches/06x/061/org/w3c/dom/svg.js
===================================================================
--- branches/06x/061/org/w3c/dom/svg.js	2010-06-30 13:35:25 UTC (rev 1913)
+++ branches/06x/061/org/w3c/dom/svg.js	2010-06-30 13:36:11 UTC (rev 1914)
@@ -184,7 +184,7 @@
             } else if (com === "scale") {
               s.setScale(degz, _parseFloat(deg[1] || deg[0]));
             } else if (com === "rotate") {
-              s.setRotate(degz);
+              s.setRotate(degz, 0, 0);
             } else if (com === "skewX") {
               s.setSkewX(degz);
             } else if (com === "skewY") {
@@ -3750,7 +3750,11 @@
   SVGElement.apply(this, arguments);
   /*readonly SVGElement*/ this.targetElement;
   this._currentTime = 0;
-  //smil::ElementTimeControl;
+  /*_simpleDurationプロパティは
+   *dur属性の値を収納しておく。属性がなければnullのまま
+   */
+  this._simpleDuration = null;
+  //別モジュールであるsmil::ElementTimeControlを参照のこと
   var s = new ElementTimeControl(this);
   /*以下は関数のコピー
    *これによって、ElementTimeControlの多重継承を模擬する
@@ -3765,13 +3769,61 @@
 SVGAnimationElement.prototype = new SVGElement();
 
 /*float*/ SVGAnimationElement.prototype.getStartTime = function(){
+  if (!!this._begin) {
+    return (this._begin);
+  } else {
+    throw new DOMException(DOMException.INVALID_STATE_ERR);
+  }
 };
 /*float*/ SVGAnimationElement.prototype.getCurrentTime = function(){
   return (this._currentTime);
 };
 /*float*/ SVGAnimationElement.prototype.getSimpleDuration = function(){
+  if (!!!this._simpleDuration && !!!this._end) {
+    throw new DOMException(DOMException.NOT_SUPPORTED_ERR);
+  } else if (!!this._simpleDuration && !!this._end) {
+    var s = (this._simpleDuration > this._end - this._begin) ? this._end - this._begin : this._simpleDuration;
+  } else {
+    var s = !!this._end ? this._end - this._begin : this._simpleDuration;
+  }
+ return s;
 };
                     //raises( DOMException );
+NAIBU.Time = {
+  currentFrame : 0,
+  start : function() {
+  if (NAIBU.Clip.length > 0) {
+    NAIBU.stop = setInterval( (function() {
+        var ntc = NAIBU.Time.currentFrame++;
+        var nc = NAIBU.Clip;
+        var s = ntc * 41;
+        for (var i=0,ncli=nc.length;i<ncli;++i) {
+          var nci = nc[i];
+          if (nci.getStartTime() <= s) {
+            if (nci.getCurrentTime() === 0) {
+              nci.beginElement();
+            }
+            nci._currentTime += 41;
+          }
+          if (nci._end) {
+            if (nci._end <= s && nci.getCurrentTime() !== 0) {
+              nci.endElement();
+              nci._currentTime = 0;
+              nci._begin = nci._end = null;
+            }
+          }
+        }
+        if (ntc > 7000) {
+          clearInterval(NAIBU.stop);
+        }
+        }),
+         125
+      );
+    }
+ }
+};
+NAIBU.Clip = [];
+  
 function SVGAnimateElement(){
   SVGAnimationElement.apply(this, arguments);
   return this;




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