[Sie-announce] SIEコード [2548] SVGPathElementのアルゴリズムを見直して、軽量化

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2011年 4月 2日 (土) 23:21:18 JST


Revision: 2548
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2548
Author:   dhrname
Date:     2011-04-02 23:21:18 +0900 (Sat, 02 Apr 2011)

Log Message:
-----------
SVGPathElementのアルゴリズムを見直して、軽量化

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

Modified: branches/07x/074/org/w3c/dom/svg.js
===================================================================
--- branches/07x/074/org/w3c/dom/svg.js	2011-04-01 14:55:52 UTC (rev 2547)
+++ branches/07x/074/org/w3c/dom/svg.js	2011-04-02 14:21:18 UTC (rev 2548)
@@ -2552,8 +2552,7 @@
      *SVG1.1 「8.3.9 The grammar for path data」の項目にある最後の文章を参照
      */
     var tnl = tar.normalizedPathSegList,
-        tlist = tar.pathSegList,
-        D = [];
+        tlist = tar.pathSegList;
     if (tnl.numberOfItems > 0) {
       tnl.clear();
       tlist.clear();
@@ -2571,77 +2570,75 @@
     .replace(taco.isRd, ",$1 1")
     .replace(taco.isRe, "")
     .split(","),
-        dli=dd.length;
+        dli=dd.length,
+        isZ = taco._isZ,
+        isM = taco._isM,
+        isC = taco._isC,
+        isL = taco._isL;
     for (var i=0;i<dli;++i) {
-      D[i] = dd[i].match(sgs);
-      for (var j=1, dili=D[i].length;j<dili;++j) {
-        D[i][j] = +(D[i][j]);
-      }
-    }
-    sgs = dd = null;
-    var isZ = taco._isZ, isM = taco._isM, isC = taco._isC, isL = taco._isL;
-    for (var i=0; i < dli; ++i) {
-      var di = D[i], s;
+      var di = dd[i].match(sgs),
+          s,
+          tcc = tar.createSVGPathSegCurvetoCubicAbs;
       for (var j=1, dii=di[0], dili=di.length; j < dili; ++j) {
-        if (isM[dii]) {
-          s = tar.createSVGPathSegMovetoAbs(di[j], di[j+1]);
+        if (isC[dii]) {
+          s = tcc(+di[j+4], +di[j+5], +di[j], +di[j+1], +di[j+2], +di[j+3]);
+          j += 5;
+        } else if (isL[dii]) {
+          s = tar.createSVGPathSegLinetoAbs(+di[j], +di[j+1]);
           ++j;
+        } else if (dii === "A") {
+          s = tar.createSVGPathSegArcAbs(+di[j+5], +di[j+6], +di[j], +di[j+1], +di[j+2], +di[j+3], +di[j+4]);
+          j += 6;
+        } else if (isM[dii]) {
+          s = tar.createSVGPathSegMovetoAbs(+di[j], +di[j+1]);
+          ++j;
+        } else if (isZ[dii]) {
+          s = tar.createSVGPathSegClosePath();
         } else if (dii === "m") {
-          s = tar.createSVGPathSegMovetoRel(di[j], di[j+1]);
+          s = tar.createSVGPathSegMovetoRel(+di[j], +di[j+1]);
           ++j;
-        } else if (isL[dii]) {
-          s = tar.createSVGPathSegLinetoAbs(di[j], di[j+1]);
-          ++j;
         } else if (dii === "l") {
-          s = tar.createSVGPathSegLinetoRel(di[j], di[j+1]);
+          s = tar.createSVGPathSegLinetoRel(+di[j], +di[j+1]);
           ++j;
-        } else if (isC[dii]) {
-          s = tar.createSVGPathSegCurvetoCubicAbs(di[j+4], di[j+5], di[j], di[j+1], di[j+2], di[j+3]);
-          j += 5;
         } else if (dii === "c") {
-          s = tar.createSVGPathSegCurvetoCubicRel(di[j+4], di[j+5], di[j], di[j+1], di[j+2], di[j+3]);
+          s = tar.createSVGPathSegCurvetoCubicRel(+di[j+4], +di[j+5], +di[j], +di[j+1], +di[j+2], +di[j+3]);
           j += 5;
         } else if (dii === "Q") {
-          s = tar.createSVGPathSegCurvetoQuadraticAbs(di[j+2], di[j+3], di[j], di[j+1]);
+          s = tar.createSVGPathSegCurvetoQuadraticAbs(+di[j+2], +di[j+3], +di[j], +di[j+1]);
           j += 3;
         } else if (dii === "q") {
-          s = tar.createSVGPathSegCurvetoQuadraticRel(di[j+2], di[j+3], di[j], di[j+1]);
+          s = tar.createSVGPathSegCurvetoQuadraticRel(+di[j+2], +di[j+3], +di[j], +di[j+1]);
           j += 3;
-        } else if (dii === "A") {
-          s = tar.createSVGPathSegArcAbs(di[j+5], di[j+6], di[j], di[j+1], di[j+2], di[j+3], di[j+4]);
-          j += 6;
         } else if (dii === "a") {
-          s = tar.createSVGPathSegArcRel(di[j+5], di[j+6], di[j], di[j+1], di[j+2], di[j+3], di[j+4]);
+          s = tar.createSVGPathSegArcRel(+di[j+5], +di[j+6], +di[j], +di[j+1], +di[j+2], +di[j+3], +di[j+4]);
           j += 6;
-        } else if (isZ[dii]) {
-          s = tar.createSVGPathSegClosePath();
         } else if (dii === "S") {
-          s = tar.createSVGPathSegCurvetoCubicSmoothAbs(di[j+2], di[j+3], di[j], di[j+1]);
+          s = tar.createSVGPathSegCurvetoCubicSmoothAbs(+di[j+2], +di[j+3], +di[j], +di[j+1]);
           j += 3;
         } else if (dii === "s") {
-          s = tar.createSVGPathSegCurvetoCubicSmoothRel(di[j+2], di[j+3], di[j], di[j+1]);
+          s = tar.createSVGPathSegCurvetoCubicSmoothRel(+di[j+2], +di[j+3], +di[j], +di[j+1]);
           j += 3;
         } else if (dii === "T") {
-          s = tar.createSVGPathSegCurvetoQuadraticSmoothAbs(di[j], di[j+1]);
+          s = tar.createSVGPathSegCurvetoQuadraticSmoothAbs(+di[j], +di[j+1]);
           ++j;
         } else if (dii === "t") {
-          s = tar.createSVGPathSegCurvetoQuadraticSmoothRel(di[j], di[j+1]);
+          s = tar.createSVGPathSegCurvetoQuadraticSmoothRel(+di[j], +di[j+1]);
           ++j;
         } else if (dii === "H") {
-          s = tar.createSVGPathSegLinetoHorizontalAbs(di[j]);
+          s = tar.createSVGPathSegLinetoHorizontalAbs(+di[j]);
         } else if (dii === "h") {
-          s = tar.createSVGPathSegLinetoHorizontalRel(di[j]);
+          s = tar.createSVGPathSegLinetoHorizontalRel(+di[j]);
         } else if (dii === "V") {
-          s = tar.createSVGPathSegLinetoVerticalAbs(di[j]);
+          s = tar.createSVGPathSegLinetoVerticalAbs(+di[j]);
         } else if (dii === "v") {
-          s = tar.createSVGPathSegLinetoVerticalRel(di[j]);
+          s = tar.createSVGPathSegLinetoVerticalRel(+di[j]);
         } else {
           s = new SVGPathSeg();
         }
         tlist.appendItem(s);
       }
     }
-    D = null;
+    di = s = tcc = sgs = dd = null;
     /*以下の処理は、pathSegListからnormalizedPathSegListへの
      *変換をする処理。相対座標を絶対座標に変換して、M、L、Cコマンドに正規化していく
      */
@@ -2780,6 +2777,7 @@
               x2 = x3 + dx;
               y2 = y3 + dy;
             }
+            ti= cx= cy= rx= ry= tar= tnl = null;
           })(ti, cx, cy, rx, ry, tar, tnl);
         } else if (dii === "S") {
           if (j !== 0) {




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