svnno****@sourc*****
svnno****@sourc*****
2010年 3月 11日 (木) 23:28:29 JST
Revision: 1723 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1723 Author: dhrname Date: 2010-03-11 23:28:28 +0900 (Thu, 11 Mar 2010) Log Message: ----------- viewBox属性とpreserveAspectRatio属性のサポート Modified Paths: -------------- branches/ufltima/dom/svg.js Modified: branches/ufltima/dom/svg.js =================================================================== --- branches/ufltima/dom/svg.js 2010-03-11 11:11:19 UTC (rev 1722) +++ branches/ufltima/dom/svg.js 2010-03-11 14:28:28 UTC (rev 1723) @@ -772,7 +772,7 @@ /*DOMString*/ this.contentStyleType = "text/css"; /*readonly SVGRect*/ this.viewport = this.createSVGRect(); /*boolean*/ this.useCurrentView = false; //ズームなど加工がされていれば、true - /*readonly SVGViewSpec*/ this.currentView = new SVGViewSpec(); + /*readonly SVGViewSpec*/ this.currentView = new SVGViewSpec(this); /*もし、画像をズームやパンしたとき、どのような倍率になるかを *以下のプロパティを使って次の行列で示すことができる *2x3 行列 [a b c d e f] = [currentScale 0 0 currentScale currentTranslate.x currentTranslate.y] @@ -788,6 +788,50 @@ /*DOMAttrModifiedイベントを利用して、 *随時、属性の値をDOMプロパティに変換しておくリスナー登録 */ + this.addEventListener("DOMAttrModified", function(evt){ + var tar = evt.target, name = evt.attrName; + if (name === "viewBox") { + var tv = tar.vewBox.baseVal; + var ovb = vb.replace(/^\s+|\s+$/g, "").split(/[\s,]+/); + tv.x = parseFloat(ovb[0]); + tv.y = parseFloat(ovb[1]); + tv.width = parseFloat(ovb[2]); + tv.height = parseFloat(ovb[3]); + } else if (name === "preserveAspectRatio") { + var par = evt.newValue, tp = tar.preserveAspectRatio.baseVal; + var sa = 1, mos = SVGPreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN; + if (!!par.match(/x(Min|Mid|Max)Y(Min|Mid|Max)(?:\s+(meet|slice))?/)) { + switch (RegExp.$1) { + case "Min": + sa += 1; + break; + case "Mid": + sa += 2; + break; + case "Max": + sa += 3; + break; + } + switch (RegExp.$2) { + case "Min": + break; + case "Mid": + sa += 3; + break; + case "Max": + sa += 6; + break; + } + if (RegExp.$3 === "slice") { + mos = SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE; + } else { + mos = SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET; + } + } + tp.align = sa; + tp.meetOrSlice = mos; + } + }, false); this.addEventListener("DOMNodeInsertedIntoDocument", function(evt){ var tar = evt.target; tar.getScreenCTM(); //this._tx, _tyプロパティを設定するために呼び出す @@ -920,7 +964,6 @@ /*readonly DOMString*/ this.preserveAspectRatioString = ""; /*readonly DOMString*/ this.transformString = ""; /*readonly DOMString*/ this.viewTargetString = ""; - this._tar = ele; return this; }; SVGViewSpec.constructor = SVGFitToViewBox; @@ -1050,7 +1093,7 @@ var obje = document.getElementsByTagName("object"); for (var i=0, objli=1;i<objli;++i) { var objei = {};//obje[i]; - xmlhttp.open("GET", "4wd.svg", true);//objei.getAttribute("data"), true); + xmlhttp.open("GET", "tiger.svg", true);//objei.getAttribute("data"), true); xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { @@ -1787,6 +1830,7 @@ if (evt.eventPhase === Event.BUBBLING_PHASE) { return; //強制終了させる } + tar.parentNode._tar.appendChild(tar._tar); evt.target.addEventListener("DOMNodeInsertedIntoDocument", function(evt){ /*以下の処理は、normalizedpathSegListとCTMに基づいて、 *SVGのd属性をVMLに変換していく処理である。