[Sie-announce] SIEコード [1797]

Back to archive index

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;
   }
 };




Sie-announce メーリングリストの案内
Back to archive index