[Sie-announce] SIEコード [1737] path要素のd属性をいくつか修正

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 3月 16日 (火) 20:24:24 JST


Revision: 1737
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1737
Author:   dhrname
Date:     2010-03-16 20:24:24 +0900 (Tue, 16 Mar 2010)

Log Message:
-----------
path要素のd属性をいくつか修正

Modified Paths:
--------------
    branches/ufltima/dom/svg.js

Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js	2010-03-15 14:44:14 UTC (rev 1736)
+++ branches/ufltima/dom/svg.js	2010-03-16 11:24:24 UTC (rev 1737)
@@ -249,9 +249,10 @@
         }
       }
     }
-    evt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
-    tar.dispatchEvent(evt);                          //描画を開始するために、dispatchEventメソッドを使う
-    evt = name = tar = null;
+    var evtt = tar.ownerDocument.createEvent("MutationEvents");
+    evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
+    tar.dispatchEvent(evtt);                          //描画を開始するために、dispatchEventメソッドを使う
+    evtt = name = tar = null;
   }, false);
   return this;
 };
@@ -394,6 +395,7 @@
 
 function SVGNumberList() {
   /*readonly unsigned long*/ this.numberOfItems = 0;
+  this._list = []; //リストの本体
   return this;
 };
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
@@ -1628,6 +1630,7 @@
 };
 function SVGPathSegList() {
   /*readonly unsigned long*/ this.numberOfItems = 0;
+  this._list = []; //リストの本体
   return this;
 };
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
@@ -1729,19 +1732,20 @@
           tlist.appendItem(s);
         }
       }
+      D = null;
       /*以下の処理は、pathSegListからnormalizedPathSegListへの
        *変換をする処理。相対座標を絶対座標に変換して、M、L、Cコマンドに正規化していく
        */
-      var cx = cy = 0; //現在セグメントの終了点の絶対座標を示す (相対座標を絶対座標に変換するときに使用)
-      var xn = yn = 0; //subpath の始点の絶対座標を示す (SコマンドやTコマンドなどで使用)
-      for (var i=0, tli=tlist.numberOfItems;i<tli;++i) {
-        var ti = tlist.getItem(i), ts = ti.pathSegType, dii = ti.pathSegTypeAsLetter;
+      var cx = 0, cy = 0; //現在セグメントの終了点の絶対座標を示す (相対座標を絶対座標に変換するときに使用)
+      var xn = 0, yn = 0; //subpath の始点の絶対座標を示す (SコマンドやTコマンドなどで使用)
+      for (var j=0, tli=tlist.numberOfItems;j<tli;++j) {
+        var ti = tlist.getItem(j), ts = ti.pathSegType, dii = ti.pathSegTypeAsLetter;
         if (ts === SVGPathSeg.PATHSEG_UNKNOWN) {
         } else if (ts === SVGPathSeg.PATHSEG_CLOSEPATH) {
           tnl.appendItem(ti);
         } else {
+          var rx = cx, ry = cy; //rx, ryは前のセグメントの終了点
           if (ts % 2 === 1) {     //相対座標ならば
-            var rx = cx, ry = cy; //rx, ryは前のセグメントの終了点
             cx += ti.x;
             cy += ti.y;
           } else {
@@ -1749,132 +1753,134 @@
             cy = ti.y;
           }
           if (dii === "M") {
-            if (i !== 0) {
+            if (j !== 0) {
               /*Mコマンドが続いた場合は、2番目以降はLコマンドと解釈する
                *W3C SVG1.1の「8.3.2 The "moveto" commands」を参照
                *http://www.w3.org/TR/SVG11/paths.html#PathDataMovetoCommands
                */
-              var tg = tlis.getItem(i-1);
+              var tg = tlist.getItem(j-1);
               if (tg.pathSegTypeAsLetter === "M") {
-                tnl.appendItem(tar.createSVGPathSegLinetoABS(cx, cy));
+                tnl.appendItem(tar.createSVGPathSegLinetoAbs(cx, cy));
                 continue;
               }
             }
             tnl.appendItem(ti);
           } else if (dii === "m") {
-            if (i !== 0) {
-              var tg = tlist.getItem(i-1);
+            if (j !== 0) {
+              var tg = tlist.getItem(j-1);
               if (tg.pathSegTypeAsLetter === "m") {
-                tnl.appendItem(tar.createSVGPathSegLinetoABS(cx, cy));
+                tnl.appendItem(tar.createSVGPathSegLinetoAbs(cx, cy));
                 continue;
               }
             }
-            tnl.appendItem(tar.createSVGPathSegMovetoABS(cx, cy));
+            tnl.appendItem(tar.createSVGPathSegMovetoAbs(cx, cy));
           } else if (dii === "L") {
             tnl.appendItem(ti);
           } else if (dii === "l") {
-            tnl.appendItem(tar.createSVGPathSegLinetoABS(cx, cy));
+            tnl.appendItem(tar.createSVGPathSegLinetoAbs(cx, cy));
           } else if (dii === "C") {
             tnl.appendItem(ti);
           } else if (dii === "c") {
-            tnl.appendItem(tar.createSVGPathSegCurvetoCubicABS(cx, cy, ti.x1+rx, ti.y1+ry, ti.x2+rx, ti.y2+ry));
+            tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, ti.x1+rx, ti.y1+ry, ti.x2+rx, ti.y2+ry));
           } else if (dii === "Q") {
             //2次スプライン曲線は近似的な3次ベジェ曲線に変換している
-            tnl.appendItem(tar.createSVGPathSegCurvetoCubicABS(cx, cy, (rx + 2*ti.x1) / 3, (ry + 2*ti.y1) / 3, (2*ti.x1 + cx) / 3, (2*ti.y1 + cy) / 3));
+            tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, (rx + 2*ti.x1) / 3, (ry + 2*ti.y1) / 3, (2*ti.x1 + cx) / 3, (2*ti.y1 + cy) / 3));
           } else if (dii === "q") {
             var x1 = ti.x1 + rx, y1 = ti.y1 + ry;
-            tnl.appendItem(tar.createSVGPathSegCurvetoCubicABS(cx, cy, (rx + 2*x1) / 3, (ry + 2*y1) / 3, (2*x1 + cx) / 3, (2*y1 + cy) / 3));
+            tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, (rx + 2*x1) / 3, (ry + 2*y1) / 3, (2*x1 + cx) / 3, (2*y1 + cy) / 3));
             x1 = y1 = null;
           } else if (dii === "A" || dii === "a") {
-            /*以下は、Arctoを複数のCuvetoに変換する処理
-             *SVG 1.1 「F.6 Elliptical arc implementation notes」の章を参照
-             *http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
-             */
-            var fS = ti.sweepFlag, psai = ti.angle;
-            if (ti.r1 === 0 || ti.r2 === 0) {
-              continue;
-            }
-            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 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;
-              sds = 0;
-            }  else{
-              var seif = 1;
-              if (ti.largeArcFlag === fS) {
-                seif = -1;
+            (function(ti, cx, cy, rx, ry, tar) {            //変数を隠蔽するためのfunction
+              /*以下は、Arctoを複数のCuvetoに変換する処理
+               *SVG 1.1 「F.6 Elliptical arc implementation notes」の章を参照
+               *http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+               */
+              var fS = ti.sweepFlag, psai = ti.angle;
+              if (ti.r1 === 0 || ti.r2 === 0) {
+                return;
               }
-              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;
-            if (!fS  &&  dr > 0) {
-              dr -=   2*Math.PI;
-            } else if (fS  &&  dr < 0) {
-              dr += 2*Math.PI;
-            }
-            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 cpsir1 = cpsi * r1, cpsir2 = cpsi * r2;
-            var spsir1 = spsi * r1, spsir2 = spsi * r2;
-            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 i = 0; i < seg; ++i) {
-              s1 += segr;
-              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));
-              x2 = x3 + dx;
-              y2 = y3 + dy;
-            }
+              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 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;
+                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));
+              }
+              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;
+              if (!fS  &&  dr > 0) {
+                dr -=   2*Math.PI;
+              } else if (fS  &&  dr < 0) {
+                dr += 2*Math.PI;
+              }
+              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 cpsir1 = cpsi * r1, cpsir2 = cpsi * r2;
+              var spsir1 = spsi * r1, spsir2 = spsi * r2;
+              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);
+                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));
+                x2 = x3 + dx;
+                y2 = y3 + dy;
+              }
+            })(ti, cx, cy, rx, ry, tar);
           } else if (dii === "S") {
-            if (i !== 0) {
-              var tg = tlist.getItem(i-1);
+            if (j !== 0) {
+              var tg = tlist.getItem(j-1);
               if (tg.pathSegTypeAsLetter === "C" || tg.pathSegTypeAsLetter === "c") {
                 var x1 = 2*tg.x - tg.x2;
                 var y1 = 2*tg.y - tg.y2;
-                tnl.appendItem(tar.createSVGPathSegCurvetoCubicABS(cx, cy, x1, y1, ti.x2, ti.y2));
+                tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, x1, y1, ti.x2, ti.y2));
               }
             }
           } else if (dii === "s") {
-            if (i !== 0) {
-              var tg = tlist.getItem(i-1);
+            if (j !== 0) {
+              var tg = tlist.getItem(j-1);
               if (tg.pathSegTypeAsLetter === "C" || tg.pathSegTypeAsLetter === "c") {
                 var x1 = 2*tg.x - tg.x2;
                 var y1 = 2*tg.y - tg.y2;
-                tnl.appendItem(tar.createSVGPathSegCurvetoCubicABS(cx, cy, x1, y1, ti.x2+rx, ti.y2+ry));
+                tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, x1, y1, ti.x2+rx, ti.y2+ry));
               }
             }
           } else if (dii === "T" || dii === "t") {
-            if (i !== 0) {
-              var tg = tlist.getItem(i-1);
+            if (j !== 0) {
+              var tg = tlist.getItem(j-1);
               if (tg.pathSegTypeAsLetter === "Q" || tg.pathSegTypeAsLetter === "q") {
                 var x1 = 2*tg.x - tg.x1;
                 var y1 = 2*tg.y - tg.y1;
-                tnl.appendItem(tar.createSVGPathSegCurvetoCubicABS(cx, cy, (rx + 2*x1) / 3, (ry + 2*y1) / 3, (2*x1 + cx) / 3, (2*y1 + cy) / 3));
+                tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, (rx + 2*x1) / 3, (ry + 2*y1) / 3, (2*x1 + cx) / 3, (2*y1 + cy) / 3));
               }
             }
           } else if (dii === "H" || dii === "h") {
-            tnl.appendItem(tar.createSVGPathSegLinetoABS(cx, ry));
+            tnl.appendItem(tar.createSVGPathSegLinetoAbs(cx, ry));
           } else if (dii === "V" || dii === "v") {
-            tnl.appendItem(tar.createSVGPathSegLinetoABS(rx, cy));
+            tnl.appendItem(tar.createSVGPathSegLinetoAbs(rx, cy));
           }
         }
       }
@@ -1900,25 +1906,19 @@
         if (tps === "z" || tps === "Z") {
           dat += " x ";
         } else {
-          /*CTM(maなど)の行列と座標(x, y)の積を算出する。数学における表現は以下のとおり
-           *[ma mc me]   [x]
-           *[mb md mf] * [y]
-           *[0  0  1 ]   [1]
-           */
-          var x = _parseInt(ma * ti.x + mc * ti.y + me, 10); //_parseIntはparseIntのエイリアスであり、値を丸めるのに使う
-          var y = _parseInt(mb * ti.x * md * ti.y + mf, 10);
-          x += " "; //文字列型に変換しておき、空白で区切りを付ける
-          y += " ";
-          dat += x;
-          dat += y;
           if (tps === "M") {
-            dat = "m" + dat;
+            dat += "m";
           } else if (tps === "L") {
-            dat = "l" + dat;
+            dat += "l";
           } else if (tps === "C") {
-            dat = "c" + dat;
-            x = _parseInt(ma * ti.x1 + mc * ti.y1 + me, 10);
-            y = _parseInt(mb * ti.x1 * md * ti.y1 + mf, 10);
+            dat += "c";
+            /*CTM(maなど)の行列と座標(x, y)の積を算出する。数学における表現は以下のとおり
+             *[ma mc me]   [x]
+             *[mb md mf] * [y]
+             *[0  0  1 ]   [1]
+             */
+            var x = _parseInt(ma * ti.x1 + mc * ti.y1 + me, 10);
+            var y = _parseInt(mb * ti.x1 * md * ti.y1 + mf, 10);
             x += " ";
             y += " ";
             dat += x;
@@ -1930,6 +1930,12 @@
             dat += x;
             dat += y;
           }
+          var x = _parseInt(ma * ti.x + mc * ti.y + me, 10); //_parseIntはparseIntのエイリアスであり、値を丸めるのに使う
+          var y = _parseInt(mb * ti.x * md * ti.y + mf, 10);
+          x += " "; //文字列型に変換しておき、空白で区切りを付ける
+          y += " ";
+          dat += x;
+          dat += y;
         }
       }
       var vi = tar.ownerDocument.documentElement.viewport;
@@ -1953,10 +1959,11 @@
     
   };
   /*SVGPathSegClosePath*/    SVGPathElement.prototype.createSVGPathSegClosePath = function() {
-    return (new SVGPathSegClosePath());
+    var _SVGPathSegClosePath = SVGPathSegClosePath;
+    return (new _SVGPathSegClosePath());
   };
   /*SVGPathSegMovetoAbs*/    SVGPathElement.prototype.createSVGPathSegMovetoAbs = function(/*float*/ x, /*float*/ y ) {
-    var s = new SVGPathSegMovetoAbs();
+    var _SVGPathSegMovetoAbs = SVGPathSegMovetoAbs, s = new _SVGPathSegMovetoAbs();
     s.x = x;
     s.y = y;
     return s;
@@ -1980,7 +1987,7 @@
     return s;
   };
   /*SVGPathSegCurvetoCubicAbs*/    SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1, /*float*/ x2, /*float*/ y2 ) {
-    var s = new SVGPathSegCurvetoCubicAbs();
+    var _SVGPathSegCurvetoCubicAbs = SVGPathSegCurvetoCubicAbs, s = new _SVGPathSegCurvetoCubicAbs();
     s.x = x;
     s.y = y;
     s.x1 = x1;




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