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) {