[Sie-announce] SIEコード [1728] svg要素の枠の「画像切り取り」処理を追加

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 3月 13日 (土) 21:56:38 JST


Revision: 1728
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1728
Author:   dhrname
Date:     2010-03-13 21:56:38 +0900 (Sat, 13 Mar 2010)

Log Message:
-----------
svg要素の枠の「画像切り取り」処理を追加

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

Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js	2010-03-13 12:07:38 UTC (rev 1727)
+++ branches/ufltima/dom/svg.js	2010-03-13 12:56:38 UTC (rev 1728)
@@ -972,6 +972,18 @@
 function SVGGElement() {
   SVGElement.apply(this, arguments);
   this._tar = document.createElement("v:group");
+  /*以下の処理は、このpath要素ノードがDOMツリーに追加されて初めて、
+   *描画が開始されることを示す。つまり、appendChildで挿入されない限り、描画をしない。
+   */
+  this.addEventListener("DOMNodeInserted", function(evt){
+    var tar = evt.target;
+    if (evt.eventPhase === Event.BUBBLING_PHASE) {
+      return; //強制終了させる
+    }
+    tar.parentNode._tar.appendChild(tar._tar);
+    evt.target.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
+    }, false);
+  }, false);
   return this;
 };
 SVGGElement.constructor = SVGElement;
@@ -1102,7 +1114,7 @@
     //HTML内のobject要素を探し出して、メソッドを結びつける
     var obje = document.getElementsByTagName("object");
     for (var i=0, objli=1;i<objli;++i) {
-      var objei = {};//obje[i];
+      var objei = {style:{}};//obje[i];
       xmlhttp.open("GET", "tiger.svg", true);//objei.getAttribute("data"), true);
       xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       xmlhttp.onreadystatechange = function() {
@@ -1113,6 +1125,40 @@
             str = xmlhttp.responseText.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->");
             doc.loadXML(str);
             var s = DOMImplementation.createDocument("http://www.w3.org/2000/svg", "svg");
+            var tar = s.documentElement, sdt = s.documentElement._tar;
+            document.body.insertBefore(sdt, document.body.lastChild);
+            /*以下では、VMLの要素とHTMLのCSSのプロパティを用いて、背景を
+             *作り出す作業を行う。これは必須
+             */
+            var backr = document.createElement("v:rect");
+            var w = tar.viewport.width, h = tar.viewport.height, sw = tar.width.baseVal, sh = tar.height.baseVal;
+            backr.style.position = "absolute";
+            backr.style.width = w+ "px";
+            backr.style.height = h+ "px";
+            backr.style.zIndex = -1;
+            backr.stroked = "false";
+            backr.filled = "false";
+            tar._tar.appendChild(backr);
+            var trstyle = tar._tar.style;
+            var tpstyle = objei.style;
+            trstyle.visibility = "visible";
+            //以下、画像を切り取り
+            trstyle.overflow = "hidden";
+            var backrs = backr.currentStyle;
+            var viewWidth = w > sw ? sw : w, viewHeight = h > sh ? sh : h; //ウィンドウ枠の長さを決定する
+            var bfl = parseFloat(backrs.left), bft = parseFloat(backrs.top);
+            var bl = -tar._tx, bt = -tar._ty;
+            if (bfl !== 0 && !isNaN(bfl)) { //内部の図形にずれが生じたとき(isNaNはIE8でautoがデフォルト値のため)
+              bl = bfl;
+              tpstyle.left = -bl+ "px";
+            }
+            if (bft !== 0 && !isNaN(bfl)) {
+              bt = bft;
+              tpstyle.top = -bt+ "px";
+            }
+            var backright = bl + viewWidth + 1;
+            var backdown = bt + viewHeight + 1;
+            trstyle.clip = "rect(" +bt+ "px " +backright+ "px " +backdown+ "px " +bl+ "px)";
             s.importNode(doc.documentElement, true);
             return s;
           };




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