svnno****@sourc*****
svnno****@sourc*****
2011年 3月 18日 (金) 23:27:42 JST
Revision: 2485
http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2485
Author: dhrname
Date: 2011-03-18 23:27:42 +0900 (Fri, 18 Mar 2011)
Log Message:
-----------
SVGPathElementの連続したvar文を整理して軽量化
Modified Paths:
--------------
branches/07x/073/org/w3c/dom/svg.js
Modified: branches/07x/073/org/w3c/dom/svg.js
===================================================================
--- branches/07x/073/org/w3c/dom/svg.js 2011-03-17 12:25:35 UTC (rev 2484)
+++ branches/07x/073/org/w3c/dom/svg.js 2011-03-18 14:27:42 UTC (rev 2485)
@@ -2416,7 +2416,9 @@
*
*SVG1.1 「8.3.9 The grammar for path data」の項目にある最後の文章を参照
*/
- var tnl = tar.normalizedPathSegList, tlist = tar.pathSegList, D = [];
+ var tnl = tar.normalizedPathSegList,
+ tlist = tar.pathSegList,
+ D = [];
if (tnl.numberOfItems > 0) {
tnl.clear();
tlist.clear();
@@ -2425,8 +2427,9 @@
*JSONにおける表現は以下のとおり
*D = [["M", 20, 30], ["L", 20 40]]
*/
- var taco = tar._com, sgs = taco.isSp;
- var dd = evt.newValue
+ var taco = tar._com,
+ sgs = taco.isSp,
+ dd = evt.newValue
.replace(taco.isRa, " -")
.replace(taco.isRb, " ")
.replace(taco.isRc, ",$1 ")
@@ -2506,11 +2509,13 @@
/*以下の処理は、pathSegListからnormalizedPathSegListへの
*変換をする処理。相対座標を絶対座標に変換して、M、L、Cコマンドに正規化していく
*/
- var cx = 0, cy = 0; //現在セグメントの終了点の絶対座標を示す (相対座標を絶対座標に変換するときに使用)
- var xn = 0, yn = 0; //T,tコマンドで仮想的な座標を算出するのに用いる。第一コントロール点
- var startx = 0, starty = 0; //M,mコマンドにおける始点座標(Z,zコマンドで用いる)
+ var cx = 0, cy = 0, //現在セグメントの終了点の絶対座標を示す (相対座標を絶対座標に変換するときに使用)
+ xn = 0, yn = 0, //T,tコマンドで仮想的な座標を算出するのに用いる。第一コントロール点
+ startx = 0, starty = 0; //M,mコマンドにおける始点座標(Z,zコマンドで用いる)
for (var j=0, tli=tlist.numberOfItems;j<tli;++j) {
- var ti = tlist.getItem(j), ts = ti.pathSegType, dii = ti.pathSegTypeAsLetter;
+ var ti = tlist.getItem(j),
+ ts = ti.pathSegType,
+ dii = ti.pathSegTypeAsLetter;
if (ts === SVGPathSeg.PATHSEG_UNKNOWN) {
} else {
var rx = cx, ry = cy; //rx, ryは前のセグメントの終了点
@@ -2576,19 +2581,23 @@
*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;
}
- 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;
+ var fS = ti.sweepFlag,
+ psai = ti.angle,
+ r1 = _math.abs(ti.r1),
+ r2 = _math.abs(ti.r2),
+ ctx = (rx - cx) / 2, cty = (ry - cy) / 2,
+ cpsi = _math.cos(psai * _math.PI / 180),
+ spsi = _math.sin(psai * _math.PI / 180),
+ rxd = cpsi*ctx + spsi*cty,
+ ryd = -1*spsi*ctx + cpsi*cty,
+ rxdd = rxd * rxd, rydd = ryd * ryd,
+ r1x = r1 * r1,
+ r2y = r2 * r2,
+ lamda = rxdd/r1x + rydd/r2y,
+ sds;
if (lamda > 1) {
r1 = _math.sqrt(lamda) * r1;
r2 = _math.sqrt(lamda) * r2;
@@ -2600,32 +2609,37 @@
}
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 txd = sds*r1*ryd / r2,
+ tyd = -1 * sds*r2*rxd / r1,
+ tx = cpsi*txd - spsi*tyd + (rx+cx)/2,
+ ty = spsi*txd + cpsi*tyd + (ry+cy)/2,
+ rad = _math.atan2((ryd-tyd)/r2, (rxd-txd)/r1) - _math.atan2(0, 1),
+ 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),
+ 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);
+ var sse = dr * 2 / _math.PI,
+ seg = _math.ceil(sse<0 ? -1*sse : sse),
+ segr = dr / seg,
+ t = 8/3 * _math.sin(segr/4) * _math.sin(segr/4) / _math.sin(segr/2),
+ cpsir1 = cpsi * r1, cpsir2 = cpsi * r2,
+ spsir1 = spsi * r1, spsir2 = spsi * r2,
+ mc = _math.cos(s1),
+ ms = _math.sin(s1),
+ 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);
+ var x3 = cpsir1*mc - spsir2*ms + tx,
+ y3 = spsir1*mc + cpsir2*ms + ty,
+ 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;
@@ -2635,13 +2649,15 @@
if (j !== 0) {
var tg = tnl.getItem(tnl.numberOfItems-1);
if (tg.pathSegTypeAsLetter === "C") {
- var x1 = 2*tg.x - tg.x2;
- var y1 = 2*tg.y - tg.y2;
+ var x1 = 2*tg.x - tg.x2,
+ y1 = 2*tg.y - tg.y2;
} else { //前のコマンドがCでなければ、現在の座標を第1コントロール点に用いる
- var x1 = rx, y1 = ry;
+ var x1 = rx,
+ y1 = ry;
}
} else {
- var x1 = rx, y1 = ry;
+ var x1 = rx,
+ y1 = ry;
}
tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, x1, y1, ti.x2, ti.y2));
x1 = y1 = null;
@@ -2649,13 +2665,15 @@
if (j !== 0) {
var tg = tnl.getItem(tnl.numberOfItems-1);
if (tg.pathSegTypeAsLetter === "C") {
- var x1 = 2*tg.x - tg.x2;
- var y1 = 2*tg.y - tg.y2;
+ var x1 = 2*tg.x - tg.x2,
+ y1 = 2*tg.y - tg.y2;
} else {
- var x1 = rx, y1 = ry;
+ var x1 = rx,
+ y1 = ry;
}
} else {
- var x1 = rx, y1 = ry;
+ var x1 = rx,
+ y1 = ry;
}
tnl.appendItem(tar.createSVGPathSegCurvetoCubicAbs(cx, cy, x1, y1, ti.x2+rx, ti.y2+ry));
x1 = y1 = null;
@@ -2693,7 +2711,9 @@
if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
return; //強制終了させる
}
- var tnext = tar.nextSibling, tpar = tar.parentNode, isLast = true;
+ var tnext = tar.nextSibling,
+ tpar = tar.parentNode,
+ isLast = true;
if (tnext && tnext._tar && tpar._tar && (tnext._tar.parentNode === tpar._tar)) {
tpar._tar.insertBefore(tar._tar, tnext._tar);
} else if (tnext && !tnext._tar && tpar._tar) {
@@ -2718,12 +2738,18 @@
/*以下の処理は、normalizedpathSegListとCTMに基づいて、
*SVGのd属性をVMLに変換していく処理である。
*/
- 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;
+ var tar = evt.target,
+ matrix = tar.getScreenCTM(),
+ tlist = tar.normalizedPathSegList,
+ _parseInt = _pInt,
+ dat = [],
+ ma = matrix.a, mb = matrix.b, mc = matrix.c, md = matrix.d, me = matrix.e, mf = matrix.f,
+ 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[i], tps = ti.pathSegTypeAsLetter;
- var t = cname[tps];
+ var ti = tlist[i],
+ tps = ti.pathSegTypeAsLetter,
+ t = cname[tps];
if (isC[tps]) {
/*CTM(mx)の行列と座標(x, y)の積を算出する。数学における表現は以下のとおり
*[ma mc me] [x]
@@ -2741,8 +2767,9 @@
}
dat[i] = t;
}
- var vi = tar.ownerDocument.documentElement;
- var w = vi.width.baseVal.value, h = vi.height.baseVal.value;
+ var vi = tar.ownerDocument.documentElement,
+ w = vi.width.baseVal.value,
+ h = vi.height.baseVal.value;
dat[dat.length] = " e";
tar._tar.path = dat.join(" ");
tar._tar.coordsize = w + " " + h;