[Sie-announce] SIEコード [2457] 軽量化のために、_listプロパティの削除と、SVGPathElementとNAIBU . _setPaintのグローバル変数をローカル化させておいた

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2011年 3月 2日 (水) 22:58:15 JST


Revision: 2457
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2457
Author:   dhrname
Date:     2011-03-02 22:58:14 +0900 (Wed, 02 Mar 2011)

Log Message:
-----------
軽量化のために、_listプロパティの削除と、SVGPathElementとNAIBU._setPaintのグローバル変数をローカル化させておいた

Modified Paths:
--------------
    branches/07x/072/org/w3c/dom/svg.js

Modified: branches/07x/072/org/w3c/dom/svg.js
===================================================================
--- branches/07x/072/org/w3c/dom/svg.js	2011-03-02 12:08:48 UTC (rev 2456)
+++ branches/07x/072/org/w3c/dom/svg.js	2011-03-02 13:58:14 UTC (rev 2457)
@@ -470,7 +470,6 @@
 };
 
 function SVGNumberList() {
-  this._list = []; //リストの本体
   return this;
 };
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
@@ -565,7 +564,6 @@
   return this;
 };
 function SVGLengthList() {
-  this._list = []; //リストの本体
   return this;
 };
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
@@ -1772,7 +1770,6 @@
 };
 
 function SVGPointList() { 
-  this._list = [];
   return this;
 };
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
@@ -1960,7 +1957,6 @@
 };
 
 function SVGTransformList() { 
-  this._list = [];
   return this;
 };
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
@@ -2218,12 +2214,14 @@
   return this;
 };
 function SVGPathSegList() {
-  this._list = []; //リストの本体
   return this;
 };
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
   SVGPathSegList.prototype[prop] = SVGStringList.prototype[prop];
 };
+
+/*documentは引数の変数として登録しておく*/
+(function(_doc, _pInt, _math) {
 //仮のfill属性とstroke属性の処理
 NAIBU._setPaint = function(tar, matrix) {
   /*以下では、スタイルシートを用いて、fill-とstroke-関連の
@@ -2249,7 +2247,7 @@
       }
       tgebtfill = null;
     } else {
-      var fillElement = document.createElement("v:fill");
+      var fillElement = _doc.createElement("v:fill");
     }
     var fc = fill.rgbColor, num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1;
     fillElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");
@@ -2272,7 +2270,7 @@
     if (t) {
       var evtt = tod.createEvent("MutationEvents");
       evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
-      evtt._tar = !!tar._fillElement ? tar._fillElement : document.createElement("v:fill");
+      evtt._tar = !!tar._fillElement ? tar._fillElement : _doc.createElement("v:fill");
       evtt._style = style, evtt._ttar = tar;
       t.dispatchEvent(evtt);
       if (t.localName !== "radialGradient" && !!!tar._fillElement) {
@@ -2297,11 +2295,11 @@
       }
       tgebtstroke = null;
     } else {
-      var strokeElement = document.createElement("v:stroke");
+      var strokeElement = _doc.createElement("v:stroke");
     }
     var sgsw = style.getPropertyCSSValue("stroke-width"), w = tod.documentElement.viewport.width, h = tod.documentElement.viewport.height;
-    sgsw._percent = Math.sqrt((w*w + h*h) / 2);
-    var swx = sgsw.getFloatValue(CSSPrimitiveValue.CSS_NUMBER) * Math.sqrt(Math.abs(matrix._determinant()));
+    sgsw._percent = _math.sqrt((w*w + h*h) / 2);
+    var swx = sgsw.getFloatValue(CSSPrimitiveValue.CSS_NUMBER) * _math.sqrt(_math.abs(matrix._determinant()));
     strokeElement.setAttribute("weight", swx + "px");
     sgsw = w = h = null;
     if (!stroke.uri) {
@@ -2328,7 +2326,7 @@
       if (tsd.indexOf(",") > 0) { //コンマ区切りの文字列の場合
         var strs = tsd.split(",");
         for (var i = 0, sli = strs.length; i < sli; ++i) {
-          strs[i] = Math.ceil(+(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意
+          strs[i] = _math.ceil(+(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意
         }
         var strokedasharray = strs.join(" ");
         if (strs.length % 2 === 1) {
@@ -2367,7 +2365,7 @@
 
 function SVGPathElement() {
   SVGElement.apply(this);
-  this._tar = document.createElement("v:shape");
+  this._tar = _doc.createElement("v:shape");
   //interface SVGAnimatedPathData
   /*readonly SVGPathSegList*/ this.pathSegList = new SVGPathSegList();
   this.animatedPathSegList = this.pathSegList;
@@ -2546,50 +2544,50 @@
               if (ti.r1 === 0 || ti.r2 === 0) {
                 return;
               }
-              var r1 = Math.abs(ti.r1);
-              var r2 = Math.abs(ti.r2);
+              var r1 = _math.abs(ti.r1);
+              var r2 = _math.abs(ti.r2);
               var ctx = (rx - cx) / 2,  cty = (ry - cy) / 2;
-              var cpsi = Math.cos(psai * Math.PI / 180), spsi = Math.sin(psai * Math.PI / 180);
+              var cpsi = _math.cos(psai * _math.PI / 180), spsi = _math.sin(psai * _math.PI / 180);
               var rxd = cpsi*ctx + spsi*cty,  ryd = -1*spsi*ctx + cpsi*cty;
               var rxdd = rxd * rxd, rydd = ryd * ryd;
               var r1x = r1 * r1, r2y = r2 * r2;
               var lamda = rxdd/r1x + rydd/r2y;
               var sds;
               if (lamda > 1) {
-                r1 = Math.sqrt(lamda) * r1;
-                r2 = Math.sqrt(lamda) * r2;
+                r1 = _math.sqrt(lamda) * r1;
+                r2 = _math.sqrt(lamda) * r2;
                 sds = 0;
               }  else{
                 var seif = 1;
                 if (ti.largeArcFlag === fS) {
                   seif = -1;
                 }
-                sds = seif * Math.sqrt((r1x*r2y - r1x*rydd - r2y*rxdd) / (r1x*rydd + r2y*rxdd));
+                sds = seif * _math.sqrt((r1x*r2y - r1x*rydd - r2y*rxdd) / (r1x*rydd + r2y*rxdd));
               }
               var txd = sds*r1*ryd / r2,  tyd = -1 * sds*r2*rxd / r1;
               var tx = cpsi*txd - spsi*tyd + (rx+cx)/2, ty = spsi*txd + cpsi*tyd + (ry+cy)/2;
-              var rad = Math.atan2((ryd-tyd)/r2, (rxd-txd)/r1) - Math.atan2(0, 1);
-              var s1 = (rad >= 0) ? rad : 2 * Math.PI + rad;
-              rad = Math.atan2((-ryd-tyd)/r2, (-rxd-txd)/r1) - Math.atan2((ryd-tyd)/r2, (rxd-txd)/r1);
-              var dr = (rad >= 0) ? rad : 2 * Math.PI + rad;
+              var rad = _math.atan2((ryd-tyd)/r2, (rxd-txd)/r1) - _math.atan2(0, 1);
+              var s1 = (rad >= 0) ? rad : 2 * _math.PI + rad;
+              rad = _math.atan2((-ryd-tyd)/r2, (-rxd-txd)/r1) - _math.atan2((ryd-tyd)/r2, (rxd-txd)/r1);
+              var dr = (rad >= 0) ? rad : 2 * _math.PI + rad;
               if (!fS  &&  dr > 0) {
-                dr -=   2*Math.PI;
+                dr -=   2*_math.PI;
               } else if (fS  &&  dr < 0) {
-                dr += 2*Math.PI;
+                dr += 2*_math.PI;
               }
-              var sse = dr * 2 / Math.PI;
-              var seg = Math.ceil(sse<0 ? -1*sse  :  sse);
+              var sse = dr * 2 / _math.PI;
+              var seg = _math.ceil(sse<0 ? -1*sse  :  sse);
               var segr = dr / seg;
-              var t = 8/3 * Math.sin(segr/4) * Math.sin(segr/4) / Math.sin(segr/2);
+              var t = 8/3 * _math.sin(segr/4) * _math.sin(segr/4) / _math.sin(segr/2);
               var cpsir1 = cpsi * r1, cpsir2 = cpsi * r2;
               var spsir1 = spsi * r1, spsir2 = spsi * r2;
-              var mc = Math.cos(s1);
-              var ms = Math.sin(s1);
+              var mc = _math.cos(s1);
+              var ms = _math.sin(s1);
               var x2 = rx - t * (cpsir1*ms + spsir2*mc), y2 = ry - t * (spsir1*ms - cpsir2*mc);
               for (var n = 0; n < seg; ++n) {
                 s1 += segr;
-                mc = Math.cos(s1);
-                ms = Math.sin(s1);
+                mc = _math.cos(s1);
+                ms = _math.sin(s1);
                 var x3 = cpsir1*mc - spsir2*ms + tx, y3 = spsir1*mc + cpsir2*ms + ty;
                 var dx = -t * (cpsir1*ms + spsir2*mc), dy = -t * (spsir1*ms - cpsir2*mc);
                 tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(x3, y3, x2, y2, x3-dx, y3-dy));
@@ -2690,11 +2688,11 @@
       /*以下の処理は、normalizedpathSegListとCTMに基づいて、
        *SVGのd属性をVMLに変換していく処理である。
        */
-      var tar = evt.target, matrix = tar.getScreenCTM(), tlist = tar.normalizedPathSegList, _parseInt = parseInt;
+      var tar = evt.target, matrix = tar.getScreenCTM(), tlist = tar.normalizedPathSegList, _parseInt = _pInt;
       var dat = [], ma = matrix.a, mb = matrix.b, mc = matrix.c, md = matrix.d, me = matrix.e, mf = matrix.f;
       var cname = tar._com._nameCom, isZ = tar._com._isZ, isC = tar._com._isC;
       for (var i=0, tli=tlist.numberOfItems;i<tli;++i) {
-        var ti = tlist.getItem(i), tps = ti.pathSegTypeAsLetter;
+        var ti = tlist[i], tps = ti.pathSegTypeAsLetter;
         var t = cname[tps];
         if (isC[tps]) {
           /*CTM(mx)の行列と座標(x, y)の積を算出する。数学における表現は以下のとおり
@@ -2762,7 +2760,7 @@
       var seg = nl.getItem(i);
       if (seg.pathSegType === SVGPathSeg.PATHSEG_LINETO_ABS) {
         var ps = nl.getItem(i-1);
-        s += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2));
+        s += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
       } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS) {
         var ps = nl.getItem(i-1), dd = 0;
         /*2点のハンドルを結んだ線分の3辺と、
@@ -2772,14 +2770,14 @@
          *本来は積分とシンプソン法などの解析を使って、媒介曲線であるベジェ曲線の距離を割り出すのが、
          *精密であり望ましいが、ここでは時間がかかりすぎるので別の方法をとる
          */
-        dd += Math.sqrt(Math.pow((seg.x1-ps.x), 2) + Math.pow((seg.y1-ps.y), 2));
-        dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2));
-        dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2));
-        dd += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2));
+        dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2));
+        dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
+        dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
+        dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
         s += dd / 2;
       } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CLOSEPATH) {
         var ps = nl.getItem(i-1), ms = nl.getItem(0);
-        s += Math.sqrt(Math.pow((ps.x-ms.x), 2) + Math.pow((ps.y-ms.y), 2));
+        s += _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2));
       }
 
     }
@@ -2796,34 +2794,34 @@
     }
     var ps = nl.getItem(segn-1);
     if (seg.pathSegType === SVGPathSeg.PATHSEG_LINETO_ABS) {
-      var segl = Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2));
+      var segl = _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
       var t = (segl + this._dis) / segl;
       s.x = ps.x + t * (seg.x-ps.x);
       s.y = ps.y + t * (seg.y-ps.y);
     } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS) {
       var dd = 0;
-      dd += Math.sqrt(Math.pow((seg.x1-ps.x), 2) + Math.pow((seg.y1-ps.y), 2));
-      dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2));
-      dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2));
-      dd += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2));
+      dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2));
+      dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
+      dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
+      dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
       var segl = dd / 2;
       var t = (segl + this._dis) / segl;
       /*以下はベジェ曲線の公式について、パラメータtによってまとめて整理したものを、
        *使って、ポイントの座標を演算する
        */
-      s.x = (3*seg.x1 + seg.x - 3*seg.x2 - ps.x) * Math.pow(t, 3)
-           +3*(ps.x - 2*seg.x1 + seg.x2) * Math.pow(t, 2)
+      s.x = (3*seg.x1 + seg.x - 3*seg.x2 - ps.x) * _math.pow(t, 3)
+           +3*(ps.x - 2*seg.x1 + seg.x2) * _math.pow(t, 2)
            +3*(seg.x1 - ps.x) * t
            +ps.x;
-      s.y = (3*seg.y1 + seg.y - 3*seg.y2 - ps.y) * Math.pow(t, 3)
-           +3*(ps.y - 2*seg.y1 + seg.y2) * Math.pow(t, 2)
+      s.y = (3*seg.y1 + seg.y - 3*seg.y2 - ps.y) * _math.pow(t, 3)
+           +3*(ps.y - 2*seg.y1 + seg.y2) * _math.pow(t, 2)
            +3*(seg.y1 - ps.y) * t
            +ps.y;
     } else if (seg.pathSegType === SVGPathSeg.MOVETO_ABS) {
       s.x = seg.x;
       s.y = seg.y;
     } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CLOSEPATH) {
-      var ms = nl.getItem(0), segl = Math.sqrt(Math.pow((seg.x-mx.x), 2) + Math.pow((seg.y-ms.y), 2));
+      var ms = nl.getItem(0), segl = _math.sqrt(_math.pow((seg.x-mx.x), 2) + _math.pow((seg.y-ms.y), 2));
       var t = (segl + this._dis) / segl;
       s.x = ms.x + t * (seg.x-ms.x);
       s.y = ms.y + t * (seg.y-ms.y);
@@ -2836,18 +2834,18 @@
       var seg = nl.getItem(i);
       if (seg.pathSegType === SVGPathSeg.PATHSEG_LINETO_ABS) {
         var ps = nl.getItem(i-1);
-        distance -= Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2));
+        distance -= _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
       } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS) {
         var ps = nl.getItem(i-1), dd = 0;
-        dd += Math.sqrt(Math.pow((seg.x1-ps.x), 2) + Math.pow((seg.y1-ps.y), 2));
-        dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2));
-        dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2));
-        dd += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2));
+        dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2));
+        dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
+        dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
+        dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
         distance -= dd / 2;
         dd = null;
       } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CLOSEPATH) {
         var ps = nl.getItem(i-1), ms = nl.getItem(0);
-        distance -= Math.sqrt(Math.pow((ps.x-ms.x), 2) + Math.pow((ps.y-ms.y), 2));
+        distance -= _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2));
       }
       if (distance <= 0) {
         /*_disプロパティは前述のgetPointAtLengthメソッドで使う*/
@@ -3000,6 +2998,8 @@
     s.y = y;
     return s;
   };
+  NAIBU.SVGPathElement = SVGPathElement; //IE8では、SVGPathElementはローカル変数
+})(document, parseInt, Math);
 
 function SVGRectElement() {
   SVGElement.apply(this);
@@ -5455,7 +5455,7 @@
   Document:        SVGDocument,
   svg:             SVGSVGElement,
   g:               SVGGElement,
-  path:            SVGPathElement,
+  path:            NAIBU.SVGPathElement,
   title:           SVGTitleElement,
   desc:            SVGDescElement,
   defs:            SVGDefsElement,




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