[Sie-announce] SIEコード [1723] viewBox属性とpreserveAspectRatio属性のサポート

Zurück zum Archiv-Index

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に変換していく処理である。




Sie-announce メーリングリストの案内
Zurück zum Archiv-Index