svnno****@sourc*****
svnno****@sourc*****
2010年 4月 28日 (水) 23:47:31 JST
Revision: 1806 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1806 Author: dhrname Date: 2010-04-28 23:47:31 +0900 (Wed, 28 Apr 2010) Log Message: ----------- Modified Paths: -------------- branches/ufltima/dom/svg.js Modified: branches/ufltima/dom/svg.js =================================================================== --- branches/ufltima/dom/svg.js 2010-04-27 14:46:35 UTC (rev 1805) +++ branches/ufltima/dom/svg.js 2010-04-28 14:47:31 UTC (rev 1806) @@ -1179,7 +1179,7 @@ var obje = document.getElementsByTagName("object"); for (var i=0, objli=1;i<objli;++i) { var objei = {style:{}};//obje[i]; - xmlhttp.open("GET", "../svggen/shapes-rect-01-t.svg", true);//objei.getAttribute("data"), true); + xmlhttp.open("GET", "../svggen/text-text-01-b.svg", true);//objei.getAttribute("data"), true); xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { @@ -2622,21 +2622,86 @@ /*readonly SVGAnimatedEnumeration*/ this.lengthAdjust = new SVGAnimatedEnumeration(SVGTextContentElement.LENGTHADJUST_UNKNOWN); this.addEventListener("DOMNodeInserted", function(evt){ var tar = evt.target; - if (evt.eventPhase === Event.BUBBLING_PHASE) { - if (tar.nodeType === Node.TEXT_NODE) { + if ((evt.eventPhase === Event.CAPTURING_PHASE) && (tar.nodeType === Node.TEXT_NODE) && !!!tar._tar) { //Textノードにdiv要素を格納したリストをプロパティとして蓄えておく tar._tar = []; for (var i=0, tdli=tar.data.length;i<tdli;++i) { var d = document.createElement("div"); + d.style.position = "absolute"; d.appendChild(document.createTextNode(tar.data.charAt(i))); tar._tar[tar._tar.length] = d; } - } - return; } evt = tar = null; - }, false); - return this; + }, true); + this.addEventListener("DOMNodeInserted", function(evt){ + if (evt.eventPhase === Event.BUBBLING_PHASE) { + return; //強制終了させる + } + var tar = evt.target; + tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) { + var tar = evt.target, ti = tar.firstChild, tp = tar.parentNode; + var x = y = n = 0; //現在のテキスト位置と順番 + var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null); + var isYokogaki = ((style.getPropertyValue("writing-mode")) === "lr-tb") ? true : false; + var fontSize = parseFloat(style.getPropertyValue("font-size")); + var tx = tar.x.baseVal, ty = tar.y.baseVal, tdx = tar.dx.baseVal, tdy = tar.dy.baseVal; + //親要素の属性も参照しておく + if ((tp.localName === "text") || (tp.localName === "tspan")) { + var ptx = tp.x.baseVal, pty = tp.y.baseVal, ptdx = tp.dx.baseVal, ptdy = tp.dy.baseVal; + } else { + var ptx = pty = ptdx = ptdy = {numberOfItems : 0}; + } + var kern = "fijlt.,:;1"; + while (ti) { + if (ti.nodeType === Node.TEXT_NODE) { + var tt = ti._tar; + for (var i=0, tli=tt.length;i<tli;++i) { + if (n < ptx.numberOfItems) { + x = ptx.getItem(n).value; + } else if (n < tx.numberOfItems) { + x = tx.getItem(n).value; + } + if (n < pty.numberOfItems) { + y = ptx.getItem(n).value; + } else if (n < ty.numberOfItems) { + y = ty.getItem(n).value; + } + if (n < ptdx.numberOfItems) { + x += ptdx.getItem(n).value; + } else if (n < tdx.numberOfItems) { + x += tdx.getItem(n).value; + } + if (n < ptdy.numberOfItems) { + y += ptdy.getItem(n).value; + } else if (n < tdy.numberOfItems) { + y += tdy.getItem(n).value; + } + var alm = 0; + if (isYokogaki) { + if (kern.indexOf(ti.data.charAt(i))) { //カーニングを求める + alm = fontSize/2; + } + x += fontSize; + x -= alm; + } else { + y += fontSize; + } + this._list[this._list.length] = x; + this._list[this._list.length] = y; + this._list[this._list.length] = fontSize - alm; + ++n; + } + } else if ((ti.localName === "tspan") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firtChild) { + this._list.concat(ti._list); + n += ti.getNumberOfChars(); + } + ti = ti.nextSibling; + } + this._isYokogaki = isYokogaki //getEndPositionOfCharメソッドで使う + }, false); + },false); + return this; }; SVGTextContentElement.constructor = SVGElement; SVGTextContentElement.prototype = new SVGElement(); @@ -2645,15 +2710,7 @@ /*unsigned short*/ SVGTextContentElement.LENGTHADJUST_SPACING = 1; /*unsigned short*/ SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2; /*long*/ SVGTextContentElement.prototype.getNumberOfChars = function() { - var s = 0; - while (ti) { - if (ti.nodeType === Node.TEXT_NODE) { - s += ti._tar.length; - } else if ((ti.localName === "tspan") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firtChild){ - s += ti.firstChild._tar.length; - } - } - return s; + return (this._list.length/2); }; /*float*/ SVGTextContentElement.prototype.getComputedTextLength = function() { this.getSubStringLength(0, this.getNumberOfChars()); @@ -2667,7 +2724,10 @@ if (charnum > this.getNumberOfChars() || charnum < 0) { throw (new DOMException(DOMException.INDEX_SIZE_ERR)); } else { - var s = this.ownerDocument.createSVGPoint(), t = this.firstChild; + var s = this.ownerDocument.createSVGPoint(); + s.x = this._list[charnum*3]; + s.y = this._list[charnum*3 + 1]; + s.matrixTransform(this.getScreenCTM()); return s; } }; @@ -2675,8 +2735,14 @@ if (charnum > this.getNumberOfChars() || charnum < 0) { throw (new DOMException(DOMException.INDEX_SIZE_ERR)); } else { - var s = this.ownerDocument.createSVGPoint(), t = this.firstChild; - return s; + var s = this.getStartPositionOfChar(charnum); + var n = this._list[charnum*3 + 2]; + if (this._isYokogaki) { + s.x += n; + } else { + s.y += n; + } + return s; } }; /*SVGRect*/ SVGTextContentElement.prototype.getExtentOfChar = function(/*unsigned long*/ charnum ) { @@ -2711,80 +2777,54 @@ function SVGTextElement() { SVGTextPositioningElement.apply(this, arguments); + this._tar = document.createElement("v:group"); this.addEventListener("DOMNodeInserted", function(evt){ if (evt.eventPhase === Event.BUBBLING_PHASE) { return; //強制終了させる } var tar = evt.target; + var ttp = tar._tar; + if (ttp) { + if (ttp.lastChild) { + if (ttp.lastChild.nodeName !== "rect") { + var backr = document.createElement("v:rect"); + var backrs = backr.style; //ずれを修正するためのもの + backrs.width = "1px"; + backrs.height = "1px"; + backrs.left = "0px"; + backrs.top = "0px"; + backr.stroked = "false"; + backr.filled = "false"; + ttp.appendChild(backr); + } + } + tar.parentNode._tar.appendChild(ttp); + } tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) { var tar = evt.target, ti = tar.firstChild; - var x = y = n = 0; //現在のテキスト位置と順番 - var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null); - var isYokogaki = ((style.getPropertyValue("writing-mode")) === "lr-tb") ? true : false; - var fontSize = parseFloat(style.getPropertyValue("font-size")); - var tx = tar.x.baseVal, ty = tar.y.baseVal, tdx = tar.dx.baseVal, tdy = tar.dy.baseVal; - while (ti) { - if (ti.nodeType === Node.TEXT_NODE) { - var tt = ti._tar; - for (var i=0, tli=tt.length;i<tli;++i) { - if (n < tx.numberOfItems) { - x = tx.getItem(n).value; - } - if (n < ty.numberOfItems) { - y = ty.getItem(n).value; - } - if (n < tdx.numberOfItems) { - x += tdx.getItem(n).value; - } - if (n < tdy.numberOfItems) { - y += tdy.getItem(n).value; - } - if (isYokogaki) { - x += fontSize; - } else { - y += fontSize; - } - this._list[this._list.length] = x; - this._list[this._list.length] = y; - ++n; + for (var i=0, j=0, tli=tar.getNumberOfChars();i<tli;++i) { + if (ti) { + var p = tar.getStartPositionOfChar(i-j); + if (!!ti._tar) { + var style = ti._tar[i].style; + style.left = p.x; + style.top = p.y; + style.width = "0px"; + style.height = "0px"; + tar._tar.appnedChild(ti._tar[i]); } - } else if ((ti.localName === "tspan") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firtChild){ - var tstyle = this.ownerDocument.defaultView.getComputedStyle(ti, null); - var tisYokogaki = ((tstyle.getPropertyValue("writing-mode")) === "lr-tb") ? true : false; - var tfontSize = parseFloat(tstyle.getPropertyValue("font-size")); - var tt = ti.firstChild._tar, ttx = tt.x.baseVal, tty = tt.y.baseVal, ttdx = tt.dx.baseVal, ttdy = tt.dy.baseVal; - for (var i=0, tli=tt.length;i<tli;++i) { - if (n < ttx.numberOfItems) { - x = ttx.getItem(n).value; - } else if (n < tx.numberOfItems) { - x = tx.getItem(n).value; + if (!!ti.data) { + if (ti.data.length <= i+1) { + j = j + i + 1; + ti = ti.nextSibling; } - if (n < tty.numberOfItems) { - y = ttx.getItem(n).value; - } else if (n < ty.numberOfItems) { - y = ty.getItem(n).value; - } - if (n < ttdx.numberOfItems) { - x += ttdx.getItem(n).value; - } else if (n < tdx.numberOfItems) { - x += tdx.getItem(n).value; - } - if (n < ttdy.numberOfItems) { - y += ttdx.getItem(n).value; - } else if (n < tdy.numberOfItems) { - y += tdy.getItem(n).value; - } - if (tisYokogaki) { - x += tfontSize; - } else { - y += tfontSize; - } - this._list[this._list.length] = x; - this._list[this._list.length] = y; - ++n; + } else if (!!ti.getNumberOfChars) { + if (ti.getNumberOfChars() <= i+1) { + j = j + i + 1; + ti = ti.nextSibling; + } } } - ti = ti.nextSibling; } }, false); },false);