svnno****@sourc*****
svnno****@sourc*****
2011年 3月 2日 (水) 22:58:15 JST
Revision: 2457 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2457 Author: dhrname Date: 2011-03-02 22:58:14 +0900 (Wed, 02 Mar 2011) Log Message: ----------- 軽量化のために、_listプロパティの削除と、SVGPathElementとNAIBU._setPaintのグローバル変数をローカル化させておいた Modified Paths: -------------- branches/07x/072/org/w3c/dom/svg.js Modified: branches/07x/072/org/w3c/dom/svg.js =================================================================== --- branches/07x/072/org/w3c/dom/svg.js 2011-03-02 12:08:48 UTC (rev 2456) +++ branches/07x/072/org/w3c/dom/svg.js 2011-03-02 13:58:14 UTC (rev 2457) @@ -470,7 +470,6 @@ }; function SVGNumberList() { - this._list = []; //リストの本体 return this; }; for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う @@ -565,7 +564,6 @@ return this; }; function SVGLengthList() { - this._list = []; //リストの本体 return this; }; for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う @@ -1772,7 +1770,6 @@ }; function SVGPointList() { - this._list = []; return this; }; for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う @@ -1960,7 +1957,6 @@ }; function SVGTransformList() { - this._list = []; return this; }; for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う @@ -2218,12 +2214,14 @@ return this; }; function SVGPathSegList() { - this._list = []; //リストの本体 return this; }; for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う SVGPathSegList.prototype[prop] = SVGStringList.prototype[prop]; }; + +/*documentは引数の変数として登録しておく*/ +(function(_doc, _pInt, _math) { //仮のfill属性とstroke属性の処理 NAIBU._setPaint = function(tar, matrix) { /*以下では、スタイルシートを用いて、fill-とstroke-関連の @@ -2249,7 +2247,7 @@ } tgebtfill = null; } else { - var fillElement = document.createElement("v:fill"); + var fillElement = _doc.createElement("v:fill"); } var fc = fill.rgbColor, num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1; fillElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")"); @@ -2272,7 +2270,7 @@ if (t) { var evtt = tod.createEvent("MutationEvents"); evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null); - evtt._tar = !!tar._fillElement ? tar._fillElement : document.createElement("v:fill"); + evtt._tar = !!tar._fillElement ? tar._fillElement : _doc.createElement("v:fill"); evtt._style = style, evtt._ttar = tar; t.dispatchEvent(evtt); if (t.localName !== "radialGradient" && !!!tar._fillElement) { @@ -2297,11 +2295,11 @@ } tgebtstroke = null; } else { - var strokeElement = document.createElement("v:stroke"); + var strokeElement = _doc.createElement("v:stroke"); } var sgsw = style.getPropertyCSSValue("stroke-width"), w = tod.documentElement.viewport.width, h = tod.documentElement.viewport.height; - sgsw._percent = Math.sqrt((w*w + h*h) / 2); - var swx = sgsw.getFloatValue(CSSPrimitiveValue.CSS_NUMBER) * Math.sqrt(Math.abs(matrix._determinant())); + sgsw._percent = _math.sqrt((w*w + h*h) / 2); + var swx = sgsw.getFloatValue(CSSPrimitiveValue.CSS_NUMBER) * _math.sqrt(_math.abs(matrix._determinant())); strokeElement.setAttribute("weight", swx + "px"); sgsw = w = h = null; if (!stroke.uri) { @@ -2328,7 +2326,7 @@ if (tsd.indexOf(",") > 0) { //コンマ区切りの文字列の場合 var strs = tsd.split(","); for (var i = 0, sli = strs.length; i < sli; ++i) { - strs[i] = Math.ceil(+(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意 + strs[i] = _math.ceil(+(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意 } var strokedasharray = strs.join(" "); if (strs.length % 2 === 1) { @@ -2367,7 +2365,7 @@ function SVGPathElement() { SVGElement.apply(this); - this._tar = document.createElement("v:shape"); + this._tar = _doc.createElement("v:shape"); //interface SVGAnimatedPathData /*readonly SVGPathSegList*/ this.pathSegList = new SVGPathSegList(); this.animatedPathSegList = this.pathSegList; @@ -2546,50 +2544,50 @@ if (ti.r1 === 0 || ti.r2 === 0) { return; } - var r1 = Math.abs(ti.r1); - var r2 = Math.abs(ti.r2); + 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 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; + 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)); + 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 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; + dr -= 2*_math.PI; } else if (fS && dr < 0) { - dr += 2*Math.PI; + dr += 2*_math.PI; } - var sse = dr * 2 / Math.PI; - var seg = Math.ceil(sse<0 ? -1*sse : sse); + 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 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 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); + 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)); @@ -2690,11 +2688,11 @@ /*以下の処理は、normalizedpathSegListとCTMに基づいて、 *SVGのd属性をVMLに変換していく処理である。 */ - var tar = evt.target, matrix = tar.getScreenCTM(), tlist = tar.normalizedPathSegList, _parseInt = parseInt; + 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; for (var i=0, tli=tlist.numberOfItems;i<tli;++i) { - var ti = tlist.getItem(i), tps = ti.pathSegTypeAsLetter; + var ti = tlist[i], tps = ti.pathSegTypeAsLetter; var t = cname[tps]; if (isC[tps]) { /*CTM(mx)の行列と座標(x, y)の積を算出する。数学における表現は以下のとおり @@ -2762,7 +2760,7 @@ var seg = nl.getItem(i); if (seg.pathSegType === SVGPathSeg.PATHSEG_LINETO_ABS) { var ps = nl.getItem(i-1); - s += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2)); + s += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2)); } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS) { var ps = nl.getItem(i-1), dd = 0; /*2点のハンドルを結んだ線分の3辺と、 @@ -2772,14 +2770,14 @@ *本来は積分とシンプソン法などの解析を使って、媒介曲線であるベジェ曲線の距離を割り出すのが、 *精密であり望ましいが、ここでは時間がかかりすぎるので別の方法をとる */ - dd += Math.sqrt(Math.pow((seg.x1-ps.x), 2) + Math.pow((seg.y1-ps.y), 2)); - dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2)); - dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2)); - dd += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2)); + dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2)); + dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2)); + dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2)); + dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2)); s += dd / 2; } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CLOSEPATH) { var ps = nl.getItem(i-1), ms = nl.getItem(0); - s += Math.sqrt(Math.pow((ps.x-ms.x), 2) + Math.pow((ps.y-ms.y), 2)); + s += _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2)); } } @@ -2796,34 +2794,34 @@ } var ps = nl.getItem(segn-1); if (seg.pathSegType === SVGPathSeg.PATHSEG_LINETO_ABS) { - var segl = Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2)); + var segl = _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2)); var t = (segl + this._dis) / segl; s.x = ps.x + t * (seg.x-ps.x); s.y = ps.y + t * (seg.y-ps.y); } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS) { var dd = 0; - dd += Math.sqrt(Math.pow((seg.x1-ps.x), 2) + Math.pow((seg.y1-ps.y), 2)); - dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2)); - dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2)); - dd += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2)); + dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2)); + dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2)); + dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2)); + dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2)); var segl = dd / 2; var t = (segl + this._dis) / segl; /*以下はベジェ曲線の公式について、パラメータtによってまとめて整理したものを、 *使って、ポイントの座標を演算する */ - s.x = (3*seg.x1 + seg.x - 3*seg.x2 - ps.x) * Math.pow(t, 3) - +3*(ps.x - 2*seg.x1 + seg.x2) * Math.pow(t, 2) + s.x = (3*seg.x1 + seg.x - 3*seg.x2 - ps.x) * _math.pow(t, 3) + +3*(ps.x - 2*seg.x1 + seg.x2) * _math.pow(t, 2) +3*(seg.x1 - ps.x) * t +ps.x; - s.y = (3*seg.y1 + seg.y - 3*seg.y2 - ps.y) * Math.pow(t, 3) - +3*(ps.y - 2*seg.y1 + seg.y2) * Math.pow(t, 2) + s.y = (3*seg.y1 + seg.y - 3*seg.y2 - ps.y) * _math.pow(t, 3) + +3*(ps.y - 2*seg.y1 + seg.y2) * _math.pow(t, 2) +3*(seg.y1 - ps.y) * t +ps.y; } else if (seg.pathSegType === SVGPathSeg.MOVETO_ABS) { s.x = seg.x; s.y = seg.y; } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CLOSEPATH) { - var ms = nl.getItem(0), segl = Math.sqrt(Math.pow((seg.x-mx.x), 2) + Math.pow((seg.y-ms.y), 2)); + var ms = nl.getItem(0), segl = _math.sqrt(_math.pow((seg.x-mx.x), 2) + _math.pow((seg.y-ms.y), 2)); var t = (segl + this._dis) / segl; s.x = ms.x + t * (seg.x-ms.x); s.y = ms.y + t * (seg.y-ms.y); @@ -2836,18 +2834,18 @@ var seg = nl.getItem(i); if (seg.pathSegType === SVGPathSeg.PATHSEG_LINETO_ABS) { var ps = nl.getItem(i-1); - distance -= Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2)); + distance -= _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2)); } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS) { var ps = nl.getItem(i-1), dd = 0; - dd += Math.sqrt(Math.pow((seg.x1-ps.x), 2) + Math.pow((seg.y1-ps.y), 2)); - dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2)); - dd += Math.sqrt(Math.pow((seg.x2-seg.x1), 2) + Math.pow((seg.y2-seg.y1), 2)); - dd += Math.sqrt(Math.pow((seg.x-ps.x), 2) + Math.pow((seg.y-ps.y), 2)); + dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2)); + dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2)); + dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2)); + dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2)); distance -= dd / 2; dd = null; } else if (seg.pathSegType === SVGPathSeg.PATHSEG_CLOSEPATH) { var ps = nl.getItem(i-1), ms = nl.getItem(0); - distance -= Math.sqrt(Math.pow((ps.x-ms.x), 2) + Math.pow((ps.y-ms.y), 2)); + distance -= _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2)); } if (distance <= 0) { /*_disプロパティは前述のgetPointAtLengthメソッドで使う*/ @@ -3000,6 +2998,8 @@ s.y = y; return s; }; + NAIBU.SVGPathElement = SVGPathElement; //IE8では、SVGPathElementはローカル変数 +})(document, parseInt, Math); function SVGRectElement() { SVGElement.apply(this); @@ -5455,7 +5455,7 @@ Document: SVGDocument, svg: SVGSVGElement, g: SVGGElement, - path: SVGPathElement, + path: NAIBU.SVGPathElement, title: SVGTitleElement, desc: SVGDescElement, defs: SVGDefsElement,