svnno****@sourc*****
svnno****@sourc*****
2010年 4月 20日 (火) 22:34:49 JST
Revision: 1797 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1797 Author: dhrname Date: 2010-04-20 22:34:48 +0900 (Tue, 20 Apr 2010) Log Message: ----------- Modified Paths: -------------- branches/ufltima/dom/svg.js Modified: branches/ufltima/dom/svg.js =================================================================== --- branches/ufltima/dom/svg.js 2010-04-19 14:31:17 UTC (rev 1796) +++ branches/ufltima/dom/svg.js 2010-04-20 13:34:48 UTC (rev 1797) @@ -2634,7 +2634,7 @@ this.getSubStringLength(0, this.getNumberOfChars()); }; /*getSubStringLengthメソッド - *charnum番目の文字からnchars+charnum-1番目までの長さ + *charnum番目の文字からnchars+charnum-1番目までの文字列の長さを求めて返す */ /*float*/ SVGTextContentElement.prototype.getSubStringLength = function(/*unsigned long*/ charnum, /*unsigned long*/ nchars ) { var style = this.ownerDocument.defaultView.getComputedStyle(this, null); @@ -2643,26 +2643,29 @@ *つまり、CTMの行列式の2乗を掛け合わせることにより、fontの大きさにCTMを組み入れる */ var fontSize = parseFloat(style.getPropertyValue("font-size")); - var matrix = this.getScreenCTM(); - fontSize = fontSize * Math.sqrt(Math.abs(matrix.determinant())); - //startとendはそのノードの始まりと終わりの文字のポジション番号。dは検索用の変数。 - var s = 0, start = end = 0, d = charnum, t = this.firstChild, f = /[fijlt.,:;1]/g; + /*変数startとendはそのノードの始まりと終わりの文字におけるポジション番号。 + *たとえば、<text>ab<tspan>cd</tspan>e</text>のtspan要素ノードにおいて、文字cのポジション番号は + *2であり、startに2という数値が格納される。endは3。 + * + *また、isStartは開始されたかどうかのBooleanで、fはカーニング用文字に一致させるための正規表現オブジェクト + */ + var s = 0, start = end = 0, t = this.firstChild, isStart = false, f = /[fijlt.,:;1]/g; while (t) { if (t.nodeName === "#text") { var n = t.length, echar = charnum + nchars - 1, data; end = start + n - 1; if (((charnum<start) && (echar<start)) || ((charnum>end) && (echar>end))) { - } else { + isStart = false; + } else { //もし、ノードの中に該当する文字番号があれば + isStart = true; s += n * fontSize; - var cs = charnum - start, ee = end - echar; - if ((cs>0) && (end>charnum)) { - s -= cs * fontSize; - } - if ((ee>0) && (start<echar)) { - s -= ee * fontSize; - } - var ec = echar > end ? end : echar, cha = charnum < start ? start : charnum; + var ec = echar >= end ? end : echar, cha = charnum <= start ? start : charnum; + s -= (cha-start) * fontSize; + s -= (end-ec) * fontSize; data = t.substringData(cha, ec); + /*j,iなどは通常のアルファベットの半分(半角)に相当するため、 + *カーニングとしてその差分を文字の長さsから引いておく + */ if (isYokogaki) { var kerning = data.match(f).length; } else { @@ -2676,14 +2679,25 @@ var n = t.getNumberOfChars(), echar = charnum + nchars - 1, data; end = start + n - 1; if (((charnum<start) && (echar<start)) || ((charnum>end) && (echar>end))) { + isStart = false; } else { var ec = echar > end ? end : echar, cha = charnum < start ? start : charnum; s += t.getSubStringLength(cha, ec-cha); } + if (isStart) { + if (isYokogaki) { + var td = t.dx; + } else { + var td = t.dy; + } + s += td.baseVal.getItem(0).value; //dx(dy)属性の分だけ増やす + } start = end + 1; } t = t.nextSibling; } + //CTMの行列式の2乗を掛け合わせることにより、sの長さにCTMを組み入れる + s = s * Math.sqrt( Math.abs((this.getScreenCTM()).determinant()) ); return s; } /*SVGPoint*/ SVGTextContentElement.prototype.getStartPositionOfChar = function (/*unsigned long*/ charnum ) { @@ -2731,30 +2745,28 @@ if (charnum > this.getNumberOfChars() || charnum < 0) { throw (new DOMException(DOMException.INDEX_SIZE_ERR)); } else { - var s = this.ownerDocument.createSVGPoint(), d = charnum + 1, t = this.firstChild, f = /[fijlt.,:;1]/g; + var s = this.ownerDocument.createSVGPoint(), t = this.firstChild; var x = y = 0; + var h = this.getSubStringLength(0, charnum), n = m = 0, xory; var isYokogaki = ((style.getPropertyValue("writing-mode")) === "lr-tb") ? true : false; if (isYokogaki) { x = h; + xory = "y"; } else { y = h; + xory = "x"; } - /*続けて、求めておいた相対座標(x, y)に、絶対座標を付け加えることによって、 - *文字の位置の絶対座標を割り出すことができる。そのためにはx属性とy属性を計算に入れることが肝要 - */ var txb = this.x.baseVal, tyb = this.y.baseVal; if (txb.numberOfItems > charnum) { x = txb.getItem(charnum).value; } else { - x += txb.getItem(txb.numberOfItems-1).value; + x = txb.getItem(txb.numberOfItems-1).value; } if (tyb.numberOfItems > charnum) { y = tyb.getItem(charnum).value; } else { - y += tyb.getItem(tyb.numberOfItems-1).value; + y = tyb.getItem(tyb.numberOfItems-1).value; } - s.x = x; - s.y = y; return s; } };