[Sie-announce] SIEコード [2183] 0. 64統合

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 11月 25日 (木) 20:44:41 JST


Revision: 2183
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2183
Author:   dhrname
Date:     2010-11-25 20:44:41 +0900 (Thu, 25 Nov 2010)

Log Message:
-----------
0.64統合

Modified Paths:
--------------
    branches/06x/sie.js

Modified: branches/06x/sie.js
===================================================================
--- branches/06x/sie.js	2010-11-25 11:40:35 UTC (rev 2182)
+++ branches/06x/sie.js	2010-11-25 11:44:41 UTC (rev 2183)
@@ -1090,7 +1090,7 @@
    *
    */
   for (var i=0, n=1, d=0, tce = null, sli = s.length, slii = sli*2-1;i<slii;++i){
-    d = sli - i - 1;
+    var d = sli - i - 1;
     if (d === 0){ //イベントのターゲットに到着(折り返し地点)
       n = -1;
       evt.eventPhase = 2;//Event.AT_TARGET;
@@ -2186,21 +2186,43 @@
   var style = this.defaultView.getComputedStyle(tar, "")
   s.setProperty = function(propertyName, value, priority) {
     var tar = elt, el = tar._tar, isFill = isStroke = false;
+    if ((tar.localName === "g") || (tar.localName === "a")) {
+      var sl = tar.getElementsByTagNameNS("http://www.w3.org/2000/svg", "*");
+      if (sl) {
+        for (var i=0,sli=sl.length;i<sli;++i) {
+          var di = sl[i];
+          NAIBU._setPaint(di, di.getScreenCTM());
+          di = null;
+        }
+        sl = null;
+      }
+      el = null;
+    }
+    if (!el) {
+      setProp.call(s, propertyName, value, priority);
+      return;
+    }
     if (!!!tar._fillElement) {
       tar._fillElement = document.createElement("v:fill"); //キャッシュを作る
     } else {
-      /*あらかじめ消しおかないと、効果が出ない*/
-      el.removeChild(tar._fillElement);
+      var tgebtfill = el.getElementsByTagName("fill");
+      if (tgebtfill.length > 0) {
+        /*あらかじめ消しおかないと、効果が出ない*/
+        el.removeChild(tgebtfill[0]);
+      }
+      tgebtfill = null;
       isFill = true;
     }
     if (!!!tar._strokeElement) {
       tar._strokeElement = document.createElement("v:stroke");
     } else {
-      /*あらかじめ消しおかないと、効果が出ない*/
-      el.removeChild(tar._strokeElement);
+      var tgebtstroke = el.getElementsByTagName("stroke")
+      if (tgebtstroke.length > 0) {
+        el.removeChild(tgebtstroke[0]);
+      }
+      tgebtstroke = null;
       isStroke = true;
     }
-
     var fillElement = tar._fillElement, strokeElement = tar._strokeElement;
     setProp.call(s, propertyName, value, priority);
     if (propertyName === "fill-opacity") {
@@ -3879,6 +3901,15 @@
       NAIBU.doc.validateOnParse = false;
       NAIBU.doc.resolveExternals = false;
       NAIBU.doc.loadXML(str);
+      /*IE6-8のみで使えるupdateIntervalは、
+       *描画間隔の調整が可能。デフォルトは0。
+       *スクロール時にバグが起きるので、0に戻してやる必要がある。
+       */
+      screen.updateInterval = 999;
+      window.onscroll = function () {
+        screen.updateInterval = 0;
+        screen.updateInterval = 99;
+      }
       var objei = this._tar;
       if (/&[^;]+;/.test(str)) {
         /*以下の処理は、実体参照を使ったとき
@@ -3900,6 +3931,9 @@
       tar.viewport.left = 0;
       tar.viewport.width = objei.clientWidth;
       tar.viewport.height = objei.clientHeight;
+      if (tar.viewport.height < 24) { //IEの標準モードではclientHeightプロパティの値が小さくなることがある
+        tar.viewport.height = screen.width;
+      }
       var objw = objei.getAttribute("width"), objh = objei.getAttribute("height");
       if (objw) {
         tar.setAttributeNS(null, "width", objw);
@@ -4499,9 +4533,12 @@
   /*以下では、スタイルシートを用いて、fill-とstroke-関連の
    *処理を行う。SVGPaintインターフェースをも用いる
    */
-  var tod = tar.ownerDocument;
+  var tod = tar.ownerDocument, el = tar._tar;
+  if (!el) {
+    return;
+  }
   var style = tod.defaultView.getComputedStyle(tar, "");
-  var el = tar._tar, fill = style.getPropertyCSSValue("fill"), stroke = style.getPropertyCSSValue("stroke");
+  var fill = style.getPropertyCSSValue("fill"), stroke = style.getPropertyCSSValue("stroke");
   if (fill.paintType === /*SVGPaint.SVG_PAINTTYPE_RGBCOLOR*/ 1 || fill.paintType === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {
     if (fill.paintType === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {
       /*再度、設定。css.jsのsetPropertyを参照*/
@@ -4509,8 +4546,12 @@
     }
     if (!!tar._fillElement) {
       var fillElement = tar._fillElement;
-      /*あらかじめ消しおかないと、効果が出ない*/
-      el.removeChild(fillElement);
+      var tgebtfill = el.getElementsByTagName("fill");
+      if (tgebtfill.length > 0) {
+        /*あらかじめ消しおかないと、効果が出ない*/
+        el.removeChild(tgebtfill[0]);
+      }
+      tgebtfill = null;
     } else {
       var fillElement = document.createElement("v:fill");
     }
@@ -4554,7 +4595,11 @@
     }
     if (!!tar._strokeElement) {
       var strokeElement = tar._strokeElement;
-      el.removeChild(strokeElement);
+      var tgebtstroke = el.getElementsByTagName("stroke")
+      if (tgebtstroke.length > 0) {
+        el.removeChild(tgebtstroke[0]);
+      }
+      tgebtstroke = null;
     } else {
       var strokeElement = document.createElement("v:stroke");
     }
@@ -6983,10 +7028,10 @@
 SVGAnimationElement.prototype._eventRegExp = /(mouse|activ|clic)[a-z]+/;
 SVGAnimationElement.prototype._timeRegExp = /[\-\d\.]+(h|min|s|ms)?/;
 SVGAnimationElement.prototype._unit = {
-    "h" : 2880000,
+    "h"   : 2880000,
     "min" : 48000,
-    "s" : 800,
-    "ms" : 0.8
+    "s"   : 800,
+    "ms"  : 0.8
 };
 /*どれだけズレの時間があるかを計測するメソッド
  *tに数値が使われていないときは0を返す
@@ -7057,6 +7102,7 @@
   Max : 7000,
   start : function() {
   if (NAIBU.Clip.length > 0) {
+    screen.updateInterval = 42; //24fpsとして描画処理
     NAIBU.stop = setInterval( (function() {
 /*      try{*/
         var ntc = NAIBU.Time.currentFrame++;
@@ -7110,6 +7156,15 @@
    *機械が理解できる形で保管されているvalueの値の配列リスト
    */
   this._valueList = [];
+  this._isDiscrete = false;
+  this.addEventListener("DOMAttrModified", function(evt){
+    if (evt.eventPhase === Event.BUBBLING_PHASE) {
+      return; //強制終了させる
+    }
+    if ((evt.attrName === "calcMode") && (evt.newValue === "discrete")) {
+      evt.target._isDiscrete = true;
+    }
+  }, false);
   this.addEventListener("DOMNodeInserted", function(evt){
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       return; //強制終了させる
@@ -7157,7 +7212,7 @@
         vi = null;
         return;
       }
-      if ((tar._keyTimes[1] === 1) && (tar._valueList.length > 2)) {
+      if ((tar._keyTimes[1] === 1) && (tar._valueList.length > 2)) { //keyTimesが設定されていない場合、均等に時間を割り振る
         for (var i=0,n=0,tvli=tar._valueList.length-1;i<tvli;++i) {
           n += 1 / tvli;
           tar._keyTimes[i+1] = n;
@@ -7187,12 +7242,16 @@
       evt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
       if (!!tta) {
         var base = tta.baseVal, tanim = tta.animVal;
-        var v1 = tar._valueList[ii].value, v2 = tar._valueList[ii+1].value, di = (tar._keyTimes[ii+1] - tar._keyTimes[ii]) * d;
+        var v1 = tar._valueList[ii].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) / di;
+        if (!tar._isDiscrete) {
+          var v2 = tar._valueList[ii+1].value, di = (tar._keyTimes[ii+1] - tar._keyTimes[ii]) * d, v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) / di;
+        } else {
+          var v = v1;
+        }
         tanim.newValueSpecifiedUnits(tanim.unitType, v);
         tta.baseVal = tanim;
         tanim = null;
@@ -7202,25 +7261,29 @@
          */
         tta.animVal = tta.baseVal;
         tta.baseVal = base;
+        di = null;
       } 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) / d;
-        ttr.dispatchEvent(evt);
+        var v1 = tar._valueList[ii].value, v2 = tar._valueList[ii+1].value, di = (tar._keyTimes[ii+1] - tar._keyTimes[ii]) * d;
+        if (!tar._isDiscrete) {
+          var v = v1 + (v2-v1) * (tg-tar._keyTimes[ii]*d) / di;
+        } else {
+          var v = v1;
+        }
       } else if ("animatedPoints" in ttr) {
         var base = ttr.points;
         ttr.points = ttr.animatedPoints;
         ttr.dispatchEvent(evt);
-        tta.animatedPoints = tta.points;
-        tta.points = base;
+        ttr.animatedPoints = ttr.points;
+        ttr.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;
+        ttr.animatedNormalizedPathSegList = ttr.normalizedPathSegList;
+        ttr.normalizedPathSegList = base;
       }
-     evt = v1 = v2 = v = null;
+     evt = v1 = v2 = v = d = n = ii = tg = null;
     };
     evt = vir = null;
   }, false);
@@ -7385,6 +7448,26 @@
 function SVGAnimateColorElement() {
   SVGAnimationElement.apply(this);
   NAIBU.Clip[NAIBU.Clip.length] = this;
+  this._valueList = [];
+  this.addEventListener("DOMNodeInserted", function(evt){
+    if (evt.eventPhase === Event.BUBBLING_PHASE) {
+      return; //強制終了させる
+    }
+    var tar = evt.target;
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
+      var tar = evt.target, attrName = tar.getAttributeNS(null, "attributeName"),ttr = tar.targetElement;
+      var fstyle = tar.ownerDocument.defaultView.getComputedStyle(ttr, "");
+      if (!tar._values[0]) {
+        tar._values[0] = fstyle.getPropertyValue(attrName);
+      }
+      for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
+        var to = new SVGColor();
+        to.setRGBColor(tar._values[i]);
+        tar._valueList[tar._valueList.length] = to;
+        to = null;
+      }
+    }, false);
+  }, false);
   this.addEventListener("beginEvent", function(evt) {
     var tar = evt.target, attrName = tar.getAttributeNS(null, "attributeName");
     var style = tar.ownerDocument.getOverrideStyle(tar.targetElement, "");
@@ -7393,30 +7476,20 @@
       style.setProperty(attrName, tar._values[0], null);
     }
     tar._frame = function() {
-      var _tar = tar, to = new SVGColor(), from = new SVGColor();
-      var d = _tar.getSimpleDuration();
-      if (d === 0) {
-        d = null;
+      var _tar = tar;
+      var d = _tar.getSimpleDuration() * 0.8, n = _tar._valueList.length - 1, tg = _tar.getCurrentTime();
+      if ((n !== -1) && (d !== 0) && (tg <= d)) {
+        var ii = Math.floor((tg*n) / d);
+      } else {
         return;
       }
-      var n = _tar._values.length - 1, t = _tar.getCurrentTime(), i = Math.floor((t*n) / d);
-      to.setRGBColor(_tar._values[i+1]);
-      from.setRGBColor(_tar._values[i]);
-      if (!!!_tar._keyTimes) {
-        var ti = d / n, ki =ti;
-        if (n === 1) {
-          ti = 0;
-        }
-      } else {
-        var ti = parseFloat(_tar._keyTimes[i]) * d;
-        var ki = parseFloat(_tar._keyTimes[i+1])*d - ti;
-      }
-      var tc = to.rgbColor, fc = from.rgbColor, num = CSSPrimitiveValue.CSS_NUMBER, di = (t - ti) / ki;
-      var r = fc.red.getFloatValue(num) + (tc.red.getFloatValue(num) - fc.red.getFloatValue(num)) * di;
-      var g = fc.green.getFloatValue(num) + (tc.green.getFloatValue(num) - fc.green.getFloatValue(num)) * di;
-      var b = fc.blue.getFloatValue(num) + (tc.blue.getFloatValue(num) - fc.blue.getFloatValue(num)) * di;
+      var fc = _tar._valueList[ii].rgbColor, tc = _tar._valueList[ii+1].rgbColor, di = (_tar._keyTimes[ii+1] - _tar._keyTimes[ii]) * d, durd = (tg-tar._keyTimes[ii]*d) / di, num = CSSPrimitiveValue.CSS_NUMBER;
+      var fr = fc.red.getFloatValue(num), fg = fc.green.getFloatValue(num), fb = fc.blue.getFloatValue(num);
+      var r = fr + (tc.red.getFloatValue(num) - fr) * durd;
+      var g = fg + (tc.green.getFloatValue(num) - fg) * durd;
+      var b = fb + (tc.blue.getFloatValue(num) - fb) * durd;
       style.setProperty(attrName, "rgb(" +Math.ceil(r)+ "," +Math.ceil(g)+ "," +Math.ceil(b)+ ")", null);
-      _tar = t = to = from = fc = tc = num = r = g = b = null;
+      _tar = d = n = tg = fc = tc = fr = fg = fb = num = r = g = b = null;
     }
   }, false);
   this.addEventListener("endEvent", function(evt) {
@@ -7688,6 +7761,8 @@
     if ("stop" in NAIBU) {
       clearInterval(NAIBU.stop);
     }
+    window.dettachEvent("onload", NAIBU._main);
+    window.onscroll = NAIBU.emptyFunction;
     Element = SVGElement = Attr = NamedNodeMap = CSS2Properties = CSSValue = CSSPrimitiveValue = NAIBU.xmlhttp = Node = Event = NAIBU = stlog = STLog = document = null;
     Array = ActiveXObject = null;
   } catch(e) {}
@@ -7787,6 +7862,7 @@
       s = null;
     }
   }
+  xmlhttp = null;
 });
 NAIBU.addEvent("load", NAIBU._main);
 NAIBU.utf16 = function ( /*string*/ s)  {




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