OSDN Git Service

Override the setValues
[sie/sie.git] / org / w3c / dom / smil.js
index 6de2c2e..8c2e5d2 100644 (file)
@@ -1295,6 +1295,13 @@ base("$calcMode").up("$attribute").mix( {
      return s;\r
    },\r
    \r
+  /*isKeyErrorメソッド\r
+   * 後述のsetKeyメソッドで使われる。keyTimes属性のエラーをチェックするメソッド\r
+   * 属性値にエラーがあれば、trueを返し、なければ、falseを返す*/\r
+  isKeyError: function(/*number*/ keyLength, /*number*/toLength) {\r
+    return !!(keyLength && (keyLength !== (toLength+1)) );\r
+  },\r
+   \r
    /*setKeyメソッド\r
     * 引数の要素のkeyTimes属性やkeySplines属性を処理するためのメソッド\r
     * 必要な他の属性処理はsetValuesメソッドに任せている*/\r
@@ -1304,6 +1311,7 @@ base("$calcMode").up("$attribute").mix( {
           this.getAttr("from", null),\r
           this.getAttr("to", null),\r
           this.getAttr("by", null) ),\r
+         toLength = to ? to.length : 0,\r
          keyTimes = this.getAttr("keyTimes", null),\r
          keySplines = this.getAttr("keySplines", null),\r
          keys,\r
@@ -1319,13 +1327,22 @@ base("$calcMode").up("$attribute").mix( {
         return null;\r
       }\r
       /*toオブジェクトはtoとfromで一組となっているのでlengthが加算される*/\r
-      if (keys.length && (keys.length !== (to.length+1))) {\r
+      if (this.isKeyError(keys.length, toLength)) {\r
         /*keyTimes属性とvalues属性のリストの個数が合致しない場合、アニメーションの効果がない\r
          * 仕様を参照 SMIL Animation 3.2.3. Animation function calculation modes\r
          * http://www.w3.org/TR/smil-animation/#AnimFuncCalcMode*/\r
+         \r
+        /*ただし、animateMotion要素においては、keyPoints属性が\r
+         * values属性のリストよりも優先されるため、\r
+         * keyPoints属性があるときは、アニメーションの効果がある\r
+         * \r
+         * >Regarding determining the points which correspond to the ‘keyTimes’ attributes, the ‘keyPoints’ attribute overrides ‘path’, which overrides ‘values’\r
+         * \r
+         * http://www.w3.org/TR/SVG11/animate.html#AnimateMotionElement\r
+         */\r
         return null;\r
       }\r
-      for (var i=0;i<to.length;++i) {\r
+      for (var i=0;i<toLength;++i) {\r
         to[i].keyTime = keys[i+1] - keys[i];\r
         if (splines) {\r
           toiKeySplines = this.$from.numList.call( {\r
@@ -1336,8 +1353,8 @@ base("$calcMode").up("$attribute").mix( {
         }\r
       }\r
     } else if (!isDiscrete && to) {\r
-      var per = 1 / to.length;\r
-      for (var i=0;i<to.length;++i) {\r
+      var per = 1 / toLength;\r
+      for (var i=0;i<toLength;++i) {\r
         to[i].keyTime = per;\r
         if (splines) {\r
           toiKeySplines = this.$from.numList.call( {\r
@@ -1356,20 +1373,20 @@ base("$calcMode").up("$attribute").mix( {
         if (keys.length && (keys[0] !== 0)) {\r
           return null;\r
         }\r
-        if (keys.length && (keys.length !== (to.length+1))) {\r
+        if (this.isKeyError(keys.length, toLength)) {\r
           return null;\r
         }\r
-        for (var i=0;i<to.length;++i) {\r
+        for (var i=0;i<toLength;++i) {\r
           to[i].keyTime = keys[i+1] - keys[i];\r
         }\r
       } else {\r
-        var per = 1 / (to.length+1);\r
-        for (var i=0;i<to.length;++i) {\r
+        var per = 1 / (toLength+1);\r
+        for (var i=0;i<toLength;++i) {\r
           to[i].keyTime = per;\r
         }\r
       }\r
       /*toオブジェクトが足らないので、一つ追加しておく*/\r
-      to.push( to[to.length-1].up().mix( function(){\r
+      to.push( to[toLength-1].up().mix( function(){\r
           if (!keys) {\r
             return;\r
           }\r
@@ -1403,11 +1420,11 @@ base("$calcMode").up("$attribute").mix( {
   \r
   \r
   /*後述のinitializeメソッドで使う要素リスト\r
-   * getElementsByTagNameNSã\83¡ã\82½ã\83\83ã\83\89ã\81®è¿\94ã\82\8aå\80¤ã\81®å\85¥å\8a\9bを想定*/\r
+   * getElementsByTagNameNSã\83¡ã\82½ã\83\83ã\83\89ã\81®è¿\94ã\82\8aå\80¤ã\82\92Arrayå\8c\96ã\81\97ã\81\9fã\81\93ã\81¨を想定*/\r
   elementList: [],\r
   \r
   /*何番目からelementListを処理しているかの数値*/\r
-  nubmerOfelemList: 0,\r
+  numberOfElemList: 0,\r
   \r
   /*initialize メソッド\r
    * 要素リストを初期化させる\r
@@ -1417,11 +1434,15 @@ base("$calcMode").up("$attribute").mix( {
     if (!eles || !eles.length) {\r
       return;\r
     }\r
-    var length = this.nubmerOfelemList+30;\r
-    for (var i=0; i<eles.length; ++i) {\r
-      this.up().init(eles.item(i));\r
+    var length = this.numberOfElemList+50;\r
+    for (var i=length-50; i<length; ++i) {\r
+      if (eles.length <= i) {\r
+        this.elementList = null;\r
+        return;\r
+      }\r
+      this.up().init(eles[i]);\r
     }\r
-    this.nubmerOfelemList += 30;\r
+    this.numberOfElemList += 50;\r
     eles = length = void 0;\r
   },\r
    \r
@@ -1796,7 +1817,9 @@ base("$calcMode").up("$attribute").mix( {
     to = this.setKey(ele);\r
   }\r
   if (to) {\r
-    this.funcs = to.map( function(x) {\r
+    var aa = new Array(to.length);\r
+    for (var i=0;i<to.length;++i) {\r
+      var x = to[i];\r
       x.to.string = toRGB(x.to.string);\r
       x.to.from.string = toRGB(x.to.from.string);\r
       var s = x.call();\r
@@ -1805,9 +1828,9 @@ base("$calcMode").up("$attribute").mix( {
        * endKeyTimeプロパティは区間のエンド地点*/\r
       s.startKeyTime = keyTime;\r
       keyTime = s.endKeyTime = keyTime + x.keyTime;\r
-      return s;\r
-    } )\r
-     .filter( function(s) {\r
+      aa[i] = s;\r
+    }\r
+    this.funcs = aa.filter( function(s) {\r
        if (!this.timeline.isResolved) {\r
          /*begin属性などにイベントを設定していた(未解決の)場合、後のs(0.1)がうまく作動せず、\r
           * 例外を出してしまうため、ここで返しておく*/\r
@@ -1820,7 +1843,7 @@ base("$calcMode").up("$attribute").mix( {
     this.setAdd(ele, to);\r
     this.setAccum(ele, to);\r
   }\r
-  keywords = toRGB = isColor = void 0;\r
+  keyTime = keywords = toRGB = isColor = void 0;\r
 } )\r
 /*$animateTranformElementオブジェクト\r
  * animateTransform要素に関連するオブジェクト*/\r
@@ -1970,7 +1993,7 @@ base("$calcMode").up("$attribute").mix( {
     mode: "paced",\r
         \r
     /*hasAttrValuesメソッドのオーバライド\r
-     * path属性に対応させるため*/\r
+     * pathå±\9eæ\80§ã\81ªã\81©ã\81«å¯¾å¿\9cã\81\95ã\81\9bã\82\8bã\81\9fã\82\81*/\r
     hasAttrValues: function () {\r
       if (this.$attribute.hasAttrValues.call(this)) {\r
         return true;\r
@@ -2047,6 +2070,12 @@ base("$calcMode").up("$attribute").mix( {
         rotate = +this.rotate;\r
       }\r
       return point.x+ "," +point.y + this.getRotate(path, advanceLength, rotate);\r
+    },\r
+    \r
+    /*setValuesメソッドのオーバライド*/\r
+    setValues: function() {\r
+      if (this.getAttr("keyPoints", null)) {}\r
+      return this.$setElement.setValues.apply(this, arguments);\r
     }\r
   } )\r
   .on("init", function (ele) {\r
@@ -2120,13 +2149,14 @@ base("$getDocument").mix ( function() {
            });\r
         function init (obj, name) {\r
           /*あとでframe.initializeメソッドで呼び出すために準備しておく*/\r
-          obj.elementList = svgDoc.getElementsByTagNameNS(svgns, name);\r
-          if (obj.elementList.length) {\r
+          var elist = svgDoc.getElementsByTagNameNS(svgns, name);\r
+          obj.numberOfElemList = 0;\r
+          if (elist.length > 0) {\r
+            obj.elementList = elist;\r
             frame.objList.push(obj);\r
           }\r
-          eles = obj = void 0;\r
+          elist = obj = void 0;\r
         };\r
-        frame.initialize();\r
     };\r
   }\r
   \r
@@ -2149,6 +2179,7 @@ base("$getDocument").mix ( function() {
             if (!this.isPaused) {\r
               frame++;\r
               try {\r
+                this.initialize();\r
                 this.setFrame(frame);\r
               } catch(e) {\r
               }\r