[Sie-announce] SIEコード [1688] SVGPathElementのd属性をVMLに変換する処理を追加

Zurück zum Archiv-Index

svnno****@sourc***** svnno****@sourc*****
2010年 2月 28日 (日) 23:27:42 JST


Revision: 1688
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1688
Author:   dhrname
Date:     2010-02-28 23:27:42 +0900 (Sun, 28 Feb 2010)

Log Message:
-----------
SVGPathElementのd属性をVMLに変換する処理を追加

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

Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js	2010-02-28 11:12:02 UTC (rev 1687)
+++ branches/ufltima/dom/svg.js	2010-02-28 14:27:42 UTC (rev 1688)
@@ -1303,7 +1303,15 @@
   /*readonly SVGPathSegList*/ this.animatedPathSegList = this.pathSegList = new SVGPathSegList();
   /*readonly SVGPathSegList*/ this.animatedNormalizedPathSegList = this.normalizedPathSegList = new SVGPathSegList();
   /*readonly SVGAnimatedNumber*/ this.pathLength = new SVGAnimatedNumber();
-  this.addEventListener("DOMAttrModified", function(evt){});
+  this.addEventListener("DOMAttrModified", function(evt){
+    var tar = evt.target;
+    if (evt.attrName === "d") {
+      var tnlist = tar.normalizedPathSegList, tlist = tar.pathSegList;
+      for (var i=0, tli=tlist.numberOfItems;i<tli;++i) {
+      }
+      evt.stopPropagation();
+    }
+  });
   /*以下の処理は、このpath要素ノードがDOMツリーに追加されて初めて、
    *描画が開始されることを示す。つまり、appendChildで挿入されない限り、描画をしない。
    */
@@ -1312,9 +1320,45 @@
       return; //強制終了させる
     }
     evt.target.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
-      var tar = evt.target, matrix = tar.getScreenCTM(), tlist = this.normalizedPathSegList;
-      for (var i=0, tli=tlist.length;i<tli;++i) {
+      /*以下の処理は、normalizedpathSegListとCTMに基づいて、
+       *SVGのd属性をVMLに変換していく処理である。
+       */
+      var tar = evt.target, matrix = tar.getScreenCTM(), tlist = tar.normalizedPathSegList;
+      var dat = "", ma = matrix.a, mb = matrix.b, mc = matrix.c, md = matrix.d, me = matrix.e, mf = matrix.f,;
+      for (var i=0, tli=tlist.numberOfItems;i<tli;++i) {
+        var ti = tlist.getItem(i);
+        if (ti.pathSegTypeAsLetter === "z") {
+          dat += "x e";
+        } else {
+          var x = ma * ti.x + mc * ti.y + me;
+          var y = mb * ti.x * md * ti.y + mf;
+          x += " "; //文字列型に変換しておき、空白で区切りを付ける
+          y += " ";
+          dat += x;
+          dat += y;
+          if (ti.pathSegTypeAsLetter === "M") {
+            dat = "m" + dat;
+          } else if (ti.pathSegTypeAsLetter === "L") {
+            dat = "l" + dat;
+          } else if (ti.pathSegTypeAsLetter === "C") {
+            dat = "c" + dat;
+            x = ma * ti.x1 + mc * ti.y1 + me;
+            y = mb * ti.x1 * md * ti.y1 + mf;
+            x += " ";
+            y += " ";
+            dat += x;
+            dat += y;
+            x = ma * ti.x2 + mc * ti.y2 + me;
+            y = mb * ti.x2 * md * ti.y2 + mf;
+            x += " ";
+            y += " ";
+            dat += x;
+            dat += y;
+          }
+        }
       }
+      tar._tar.path = dat;
+      matrix = dat = x = y = null;
     });
   });
   return this;




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