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