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,