OSDN Git Service

Modify the _parse method
[sie/sie.git] / org / w3c / dom / smil.js
index 078e9a3..b85c60f 100644 (file)
@@ -258,6 +258,9 @@ base("$frame").mix ( {
       }\r
       state = list = void 0;\r
     }\r
+  } ).mix( function() {\r
+    /*後述の$beginや$endで使うメソッド*/\r
+    this.addList = this.addBeginList;\r
   } );\r
   \r
   /*$endFrame オブジェクト\r
@@ -350,10 +353,7 @@ base("$frame").mix ( {
           event: str\r
         };\r
       }\r
-    },\r
-    \r
-    /*$frame.$listのbeginList(あるいはendList)オブジェクトを設定しておくプロパティ*/\r
-    list: $frame.$list.beginList,\r
+    }, \r
     \r
     /*_parse メソッド\r
      * 引数の文字列を解析して、フレーム数を算出し、結果を$frame.beginプロパティに出力\r
@@ -361,7 +361,14 @@ base("$frame").mix ( {
     _parse: function (str) {\r
       var plusminus = str.search(/[\+\-]/),\r
           event = null,\r
-          ele;\r
+          ele,\r
+          /*endListのvalueプロパティには、活動継続フレーム数と開始フレーム数を足したものが入る*/\r
+          endList = this.$list.addEndList(Number.MAX_VALUE);\r
+      if (this.$end) {\r
+        /*$endオブジェクトを継承していた場合、\r
+         *活動継続フレーム数関連のリストは無効とする*/\r
+        endList = { value: 0};\r
+      }\r
       if (str === "indefinite") {\r
         this.begin = Number.MAX_VALUE;\r
       } else if (plusminus > 0) {\r
@@ -391,16 +398,12 @@ base("$frame").mix ( {
         /*イベントの時間差を設定しておく\r
          * eventOffsetとobjListの変数はクロージャとしてlistener関数で使われる*/\r
         var eventOffset = this.begin,\r
-            /*objListのvalueプロパティはあとで書き換えられる*/\r
-            objList = this.$list.addBeginList(Number.MAX_VALUE),\r
+            /*objListのvalueプロパティはあとで書き換えられる(イベントの場合のみ)*/\r
+            objList = this.$list.addList(Number.MAX_VALUE),\r
         /*イベントのリスナーとして使う*/\r
             listener = function(evt) {\r
               objList.value = this.begin = eventOffset + this.$frame.currentFrame;\r
-              var s = this.$activate;\r
-              this.activeTime = s.call() || Number.MAX_VALUE;\r
-              this.simpleDuration = s.simpleDur;\r
-              s = void 0;\r
-              this.$frame.addLine(this);\r
+              endList.value = this.$list.begin + this.activeTime;\r
               this.isResolved = true;\r
             };\r
         this.eventOffset = eventOffset;\r
@@ -420,10 +423,10 @@ base("$frame").mix ( {
           ele && ele.addEventListener(evtName, listener.bind(this), false);\r
         }\r
       } else {\r
-        /*イベントの影響を防ぐため\r
-         * すでに、フレームオブジェクトのタイムラインには登録済みなので、\r
-         * フレームではなく、自分独自のタイムラインに登録しておけばよい*/\r
-        this.$frame = this;\r
+        /*開始リストに登録しておく($endの場合は終了リストに登録)*/\r
+        this.$list.addList(this.begin);\r
+        /*活動継続時間から算出される終了フレーム数は、終了リストに入れておく*/\r
+        endList.value = this.begin + this.activeTime;\r
       }\r
       s = event = str = plusminus = ele = void 0;\r
     },\r
@@ -436,8 +439,13 @@ base("$frame").mix ( {
       this.isResolved = false;\r
       /*$listオブジェクトを更新*/\r
       this.$list = this.$list.up();\r
+      /*beginとend属性を考慮に入れないで、活動継続時間を求める*/\r
+      var s = this.$activate.up();\r
+      this.activeTime = s.call() || Number.MAX_VALUE;\r
+      this.simpleDuration = s.simpleDur;\r
       var str = this.trim(this.string);\r
       if (str.indexOf(";") > -1){\r
+        /*;で区切られたリストを一つずつ解析*/\r
         var list = str.split(";");\r
         for (var i=0;i<list.length;++i) {\r
           this._parse(list[i]);\r
@@ -445,7 +453,7 @@ base("$frame").mix ( {
       } else {\r
         this._parse(str);\r
       }\r
-      str = void 0;\r
+      s = str = void 0;\r
       return this;\r
     },\r
     \r
@@ -569,11 +577,15 @@ base("$frame").mix ( {
       if (!this.string) {\r
         return null;\r
       }\r
+      /*addListメソッドには、addBeginList関数が入っているはずなので、それを変更する*/\r
+      this.$list.addList = this.$list.addEndList;\r
       this.parse(this.string);\r
       return this.isResolved ? this.begin\r
                              : "indefinite";\r
     }\r
   } ).mix( {\r
+    $list: $frame.$begin.$list.up(),\r
+    \r
     /*イベントリスナー用の関数*/\r
     listener: function(evt) {\r
       if (this.begin <= 0) {\r
@@ -1298,46 +1310,17 @@ base("$calcMode").up("$attribute").mix( {
   to: "",\r
   \r
   /*initメソッドで使われるアニメーション関数*/\r
-  _setFrame: function (frame) {\r
-    this.state = "playing";\r
+  _setFrame: function ($list) {\r
     this.setAttribute(this.to);\r
   },\r
   \r
-  /*アニメーション中かどうかの判別\r
-   * 1, idling アニメがまだ始まっていない待機状態 (規定値)\r
-   * 2, playing アニメーションの再生中\r
-   */\r
-  state: "idling",\r
-  \r
   /*開始を設定されたタイムライン ($beginオブジェクト)*/\r
   timeline: base("$frame").$begin,\r
   \r
-  /*_setEndFrameメソッドで終了処理をさせたいときに、呼び出されるメソッド\r
-   * 終了処理が必要なときだけ、trueを返す*/\r
-  checkEnd: function (frame) {\r
-    var line = this.timeline,\r
-        end = line.begin + line.activeTime;\r
-    if (!line.isResolved || isNaN(end)) {\r
-      /*未解決など問題が発生したとき*/\r
-      line = frame = void 0;\r
-      return false;\r
-    } else if (\r
-          ( ( frame < line.begin ) || ( end <= frame )\r
-          ) && (this.state === "playing") ) {\r
-      /*stateプロパティを書き換えることで、一度のみ、終了処理させる*/\r
-      this.state = "idling";\r
-      line = frame = void 0;\r
-      return true;\r
-    } else {\r
-      line = frame = void 0;\r
-      return false;\r
-    }\r
-  },\r
-  \r
   /*アニメが終了した際の後処理*/\r
-  _setEndFrame: function (frame) {\r
+  _setEndFrame: function ($list) {\r
     /*removeの場合、アニメーションを凍結せずに、もとに戻す*/\r
-    if (this.checkEnd(frame) && (this.fill === "remove")) {\r
+    if (this.fill === "remove") {\r
       this.removeAttribute();\r
     }\r
   },\r
@@ -1355,22 +1338,14 @@ base("$calcMode").up("$attribute").mix( {
     var thisele = this.element;\r
     if (line && thisele) {\r
       this.timeline = line;\r
-      /*ラインの中に、属性処理をするためのラインを追加*/\r
-      line.addLine(\r
-       { setFrame: this._setFrame.bind(this),\r
-         begin: 1,\r
-         activeTime: 1\r
-       }\r
-      );\r
-      base("$frame").$endFrame.addLine(\r
-        { setFrame: this._setEndFrame.bind(this),\r
-          begin: 1,\r
-          activeTime: 1\r
-        }\r
-      );\r
+      /*$begin.$listのイベントに属性処理を追加*/\r
+      line.$list.addEvent("begin", this._setFrame.bind(this));\r
+      line.$list.addEvent("play", this._setFrame.bind(this));\r
+      line.$list.addEvent("end", this._setEndFrame.bind(this));\r
+      base("$frame").addLine(line.$list);\r
+      /*アニメーションが再起動する可能性もあるため、$listのstateプロパティはここで初期化*/\r
+      line.$list.state = line.$list.WAITING;\r
     }\r
-    /*アニメーションが再起動する可能性もあるため、stateプロパティはここで初期化*/\r
-    this.state = "idling";\r
     line = thisele = void 0;\r
   }\r
 }).up("$animateElement").mix( {\r
@@ -1403,7 +1378,8 @@ base("$calcMode").up("$attribute").mix( {
     return "";\r
   },\r
   \r
-  _setFrame: function(currentTime) {\r
+  _setFrame: function($list) {\r
+    var currentTime = $list.currentFrame;\r
     /*durationは単純継続時間\r
      *advanceは継続時間内での、進捗率\r
      *  仕様を参照 http://www.w3.org/TR/smil-animation/#AnimFuncValues\r
@@ -1418,16 +1394,13 @@ base("$calcMode").up("$attribute").mix( {
         advance = duration ? ( (currentTime - line.begin) % duration ) / duration\r
                     : 0;\r
     this.setAttribute(this.tocall(advance));\r
-    this.state = "playing";\r
     line = duration = advance = void 0;\r
   },\r
   \r
   /*_setEndFrameメソッドは、終了処理と凍結作業をするときに、falseを返す*/\r
-  _setEndFrame: function(frame) {\r
+  _setEndFrame: function($list) {\r
+    var frame = $list.currentFrame;\r
     /*上書きされたメソッドを呼び出してアニメーションの凍結作業をする*/\r
-    if (!this.checkEnd(frame)) {\r
-      return;\r
-    }\r
     if (this.fill === "freeze") {\r
       var line = this.timeline,\r
           duration = line.simpleDuration;\r
@@ -1806,7 +1779,7 @@ base("$calcMode").up("$attribute").mix( {
    \r
    _setEndFrame: function(currentFrame) {\r
      var list = this.element.__transformList;\r
-     if (!this.checkEnd(currentFrame) || (this.fill !== "remove") || !list) {\r
+     if ((this.fill !== "remove") || !list) {\r
        return;\r
      }\r
      if (!this.isSum) {\r