[Sie-announce] SIEコード [1810] text要素の実装

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 4月 30日 (金) 23:33:45 JST


Revision: 1810
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1810
Author:   dhrname
Date:     2010-04-30 23:33:45 +0900 (Fri, 30 Apr 2010)

Log Message:
-----------
text要素の実装

Modified Paths:
--------------
    branches/ufltima/dom/svg.js

Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js	2010-04-30 14:33:16 UTC (rev 1809)
+++ branches/ufltima/dom/svg.js	2010-04-30 14:33:45 UTC (rev 1810)
@@ -468,6 +468,7 @@
     n = this._percent;
     _s = "%"
   } else if (unitType === SVGLength.SVG_LENGTHTYPE_EMS) {
+    n = this._percent * 100;
     _s = "em";
   } else if (unitType === SVGLength.SVG_LENGTHTYPE_EXS) {
     _s = "ex";
@@ -2691,9 +2692,9 @@
             } else {
               y += fontSize;
             }
-            this._list[this._list.length] = x;
-            this._list[this._list.length] = y;
-            this._list[this._list.length] = fontSize - alm;
+            tar._list[tar._list.length] = x;
+            tar._list[tar._list.length] = y;
+            tar._list[tar._list.length] = fontSize - alm;
             ++n;
           }
         } else if ((ti.localName === "tspan") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firtChild) {
@@ -2728,7 +2729,7 @@
   if (charnum > this.getNumberOfChars() || charnum < 0) {
     throw (new DOMException(DOMException.INDEX_SIZE_ERR));
   } else {
-    var s = this.ownerDocument.createSVGPoint();
+    var s = this.ownerDocument.documentElement.createSVGPoint();
     s.x = this._list[charnum*3];
     s.y = this._list[charnum*3 + 1];
     s.matrixTransform(this.getScreenCTM());
@@ -2740,7 +2741,8 @@
     throw (new DOMException(DOMException.INDEX_SIZE_ERR));
   } else {
     var s = this.getStartPositionOfChar(charnum);
-    var n = this._list[charnum*3 + 2];
+    //アドバンス値(すなわちフォントの大きさ)をCTMの行列式を用いて、算出する
+    var n = this._list[charnum*3 + 2] * Math.sqrt(Math.abs(this.getScreenCTM().determinant()));
     if (this._isYokogaki) {
       s.x += n;
     } else {
@@ -2770,8 +2772,47 @@
   /*readonly SVGAnimatedLengthList*/ this.dy = new SVGAnimatedLengthList();
   /*readonly SVGAnimatedNumberList*/ this.rotate = new SVGAnimatedNumberList();
   this.addEventListener("DOMAttrModified", function(evt){
-    var tar = evt.target, name = evt.attrName;
+    var tar = evt.target, name = evt.attrName, tod = tar.ownerDocument.documentElement;
+    var _parseFloat = parseFloat;
     if ((name === "x") || (name === "y") || (name === "dx") || (name === "dy")) {
+      var enr = evt.newValue.replace(/^\s+|\s+$/g, "").split(/[\s,]+/), teas = tar[name].baseVal;
+      for (var i=0, tli=enr.length;i<tli;++i) {
+        var tea = tod.createSVGLength();
+        var n = enr[i].match(/\D+$/), type = 0;
+        if (!n) {
+          type = SVGLength.SVG_LENGTHTYPE_NUMBER;
+        } else if (n === "%") {
+          if ((name === "x") || (name === "dx")) {
+            tea._percent *= tod.viewport.width;
+          } else if ((name === "y") || (name === "dy")) {
+            tea._percent *= tod.viewport.height;
+          }
+          type = SVGLength.SVG_LENGTHTYPE_PERCENTAGE;
+        } else if (n === "em") {
+          var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null);
+          tea._percent *= _parseFloat(style.getPropertyValue("font-size"));
+          style = null;
+          type = SVGLength.SVG_LENGTHTYPE_EMS;
+        } else if (n === "ex") {
+          type = SVGLength.SVG_LENGTHTYPE_EXS;
+        } else if (n === "px") {
+          type = SVGLength.SVG_LENGTHTYPE_PX;
+        } else if (n === "cm") {
+          type = SVGLength.SVG_LENGTHTYPE_CM;
+        } else if (n === "mm") {
+          type = SVGLength.SVG_LENGTHTYPE_MM;
+        } else if (n === "in") {
+          type = SVGLength.SVG_LENGTHTYPE_IN;
+        } else if (n === "pt") {
+          type = SVGLength.SVG_LENGTHTYPE_PT;
+        } else if (n === "pc") {
+          type = SVGLength.SVG_LENGTHTYPE_PC;
+        }
+        var s = _parseFloat(enr[i]);
+        s = isNaN(s) ? 0 : s;
+        tea.newValueSpecifiedUnits(type, s);
+        teas.appendItem(tea);
+      }
      }
   }, false);
   return this;
@@ -2806,6 +2847,8 @@
     }
     tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
       var tar = evt.target, ti = tar.firstChild;
+      var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null);
+      tar._tar.style.fontSize = style.getPropertyValue("font-size") + "px";
       for (var i=0, j=0, tli=tar.getNumberOfChars();i<tli;++i) {
         if (ti) {
           var p = tar.getStartPositionOfChar(i-j);
@@ -2815,7 +2858,7 @@
             style.top = p.y;
             style.width = "0px";
             style.height = "0px";
-            tar._tar.appnedChild(ti._tar[i]);
+            tar._tar.appendChild(ti._tar[i]);
           }
           if (!!ti.data) {
             if (ti.data.length <= i+1) {




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