[Sie-announce] SIEコード [1782] 1, NAIBU. setPaint関数の実装

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 4月 7日 (水) 23:48:38 JST


Revision: 1782
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1782
Author:   dhrname
Date:     2010-04-07 23:48:37 +0900 (Wed, 07 Apr 2010)

Log Message:
-----------
1, NAIBU.setPaint関数の実装
2, circle要素の実装

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

Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js	2010-04-06 14:12:00 UTC (rev 1781)
+++ branches/ufltima/dom/svg.js	2010-04-07 14:48:37 UTC (rev 1782)
@@ -1051,7 +1051,9 @@
 
 function SVGTitleElement() {
   SVGElement.apply(this, arguments);
-  this.ownerDocument.title = this.firstChild.nodeValue;
+  this.addEventListener("DOMCharacterDataModified", function(evt){
+    evt.target.ownerDocument.title = evt.target.firstChild.nodeValue;
+  }, false);
   return this;
 }
 SVGTitleElement.constructor = SVGElement;
@@ -1161,7 +1163,7 @@
     var obje = document.getElementsByTagName("object");
     for (var i=0, objli=1;i<objli;++i) {
       var objei = {style:{}};//obje[i];
-      xmlhttp.open("GET", "4wd.svg", true);//objei.getAttribute("data"), true);
+      xmlhttp.open("GET", "../svggen/shapes-circle-01-t.svg", true);//objei.getAttribute("data"), true);
       xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       xmlhttp.onreadystatechange = function() {
         if (xmlhttp.readyState === 4  &&  xmlhttp.status === 200) {
@@ -1697,6 +1699,99 @@
 for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
   SVGPathSegList.prototype[prop] = SVGStringList.prototype[prop];
 };
+//仮のfill属性とstroke属性の処理
+NAIBU._setPaint = function(tar, matrix) {
+  /*以下では、スタイルシートを用いて、fill-とstroke-関連の
+   *処理を行う。SVGPaintインターフェースをも用いる
+   */
+  var style = tar.ownerDocument.defaultView.getComputedStyle(tar, "");
+  var el = tar._tar, fill = style.getPropertyCSSValue("fill"), stroke = style.getPropertyCSSValue("stroke");
+  if (fill.paintType === SVGPaint.SVG_PAINTTYPE_RGBCOLOR || fill.paintType === SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR) {
+    var fillElement = !!tar._fillElement ? tar._fillElement : document.createElement("v:fill");
+    var fc = fill.rgbColor, num = CSSPrimitiveValue.CSS_NUMBER;
+    fillElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");
+    var fillOpacity = parseFloat(style.getPropertyValue("fill-opacity")) * parseFloat(style.getPropertyValue("opacity")); //opacityを掛け合わせる
+    if (fillOpacity < 1) {
+      fillElement.setAttribute("opacity", fillOpacity+"");
+    }
+    if (!!!tar._fillElement) {
+      el.appendChild(fillElement);
+      tar._fillElement = fillElement; //キャッシュを作る
+    }
+    fc = fillOpacity = null;
+  } else if (fill.uri) {
+    /*以下では、Gradation関連の要素に、イベントを渡すことで、
+     *この要素の、グラデーション描画を行う
+     */
+    var t = tar.ownerDocument.getElementById(fill.uri);
+    if (t) {
+      var evtt = tar.ownerDocument.createEvent("MutationEvents");
+      evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
+      evtt._tar = !!tar._fillElement ? tar._fillElement : document.createElement("v:fill");
+      evtt._style = style, evtt._ttar = tar;
+      t.dispatchEvent(evtt);
+      if (t.localName !== "radialGradient" && !!!tar._fillElement) {
+        el.appendChild(evtt._tar);
+        tar._fillElement = evtt._tar; //キャッシュを作る
+      }
+      t = evtt = null;
+    }
+  } else {
+    el.filled = "false";
+  }
+  if (stroke.paintType === SVGPaint.SVG_PAINTTYPE_RGBCOLOR || stroke.paintType === SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR) {
+    var strokeElement = !!tar._strokeElement ? tar._strokeElement : document.createElement("v:stroke");
+    var sw = tar.ownerDocument.documentElement.createSVGLength(parseFloat(style.getPropertyValue("stroke-width")));//, Math.sqrt((w*w + h*h) / 2));
+    var swx = sw.value * Math.sqrt(Math.abs(matrix._determinant()));
+    strokeElement.setAttribute("weight", swx + "px");
+    if (!stroke.uri) {
+      var fc = stroke.rgbColor, num = CSSPrimitiveValue.CSS_NUMBER;
+      strokeElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");
+      var strokeOpacity = parseFloat(style.getPropertyValue("stroke-opacity")) * parseFloat(style.getPropertyValue("opacity")); //opacityを掛け合わせる
+      if (swx < 1) {
+        strokeOpacity *= swx; //太さが1px未満なら色を薄くする
+      }
+      if (strokeOpacity < 1) {
+        strokeElement.setAttribute("opacity", strokeOpacity);
+      }
+      fc = num = strokeOpacity = null;
+    }
+    strokeElement.setAttribute("miterlimit", style.getPropertyValue("stroke-miterlimit"));
+    strokeElement.setAttribute("joinstyle", style.getPropertyValue("stroke-linejoin"));
+    if (style.getPropertyValue("stroke-linecap") === "butt") {
+      strokeElement.setAttribute("endcap", "flat");
+    } else {
+      strokeElement.setAttribute("endcap", style.getPropertyValue("stroke-linecap"));
+    }
+    var tsd = style.getPropertyValue("stroke-dasharray");
+    if (tsd !== "none") {
+      if (tsd.indexOf(",") > 0) { //コンマ区切りの文字列の場合
+        var strs = tsd.split(",");
+        for (var i = 0, sli = strs.length; i < sli; ++i) {
+          strs[i] = Math.ceil(parseFloat(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意
+        }
+        var strokedasharray = strs.join(" ");
+        if (strs.length % 2 === 1) {
+          strokedasharray += " " + strokedasharray;
+        }
+      }
+      strokeElement.setAttribute("dashstyle", strokedasharray);
+      tsd = strs = null;
+    }
+    el.appendChild(strokeElement);
+    if (!!!tar._strokeElement) {
+      tar._strokeElement = strokeElement;
+    }
+    sw = tsd = null;
+  } else {
+    el.stroked = "false";
+  }
+  var cursor = style.getPropertyValue("cursor");
+  if (cursor !== "default") {
+    el.style.cursor = cursor;
+  }
+  style = cursor = null;
+};
 
 function SVGPathElement() {
   SVGElement.apply(this, arguments);
@@ -2003,96 +2098,8 @@
       var w = vi.width.baseVal.value, h = vi.height.baseVal.value;
       tar._tar.path = dat + " e";
       tar._tar.coordsize = w + " " + h;
-      /*以下では、スタイルシートを用いて、fill-とstroke-関連の
-       *処理を行う。SVGPaintインターフェースをも用いる
-       */
-      var style = tar.ownerDocument.defaultView.getComputedStyle(tar, "");
-      var el = tar._tar, fill = style.getPropertyCSSValue("fill"), stroke = style.getPropertyCSSValue("stroke");
-      if (fill.paintType === SVGPaint.SVG_PAINTTYPE_RGBCOLOR || fill.paintType === SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR) {
-        var fillElement = !!tar._fillElement ? tar._fillElement : document.createElement("v:fill");
-        var fc = fill.rgbColor, num = CSSPrimitiveValue.CSS_NUMBER;
-        fillElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");
-        var fillOpacity = parseFloat(style.getPropertyValue("fill-opacity")) * parseFloat(style.getPropertyValue("opacity")); //opacityを掛け合わせる
-        if (fillOpacity < 1) {
-          fillElement.setAttribute("opacity", fillOpacity+"");
-        }
-        if (!!!tar._fillElement) {
-          el.appendChild(fillElement);
-          tar._fillElement = fillElement; //キャッシュを作る
-        }
-        fc = fillOpacity = null;
-      } else if (fill.uri) {
-        /*以下では、Gradation関連の要素に、イベントを渡すことで、
-         *この要素の、グラデーション描画を行う
-         */
-        var t = tar.ownerDocument.getElementById(fill.uri);
-        if (t) {
-          var evtt = tar.ownerDocument.createEvent("MutationEvents");
-          evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
-          evtt._tar = !!tar._fillElement ? tar._fillElement : document.createElement("v:fill");
-          evtt._style = style, evtt._ttar = tar;
-          t.dispatchEvent(evtt);
-          if (t.localName !== "radialGradient" && !!!tar._fillElement) {
-            el.appendChild(evtt._tar);
-            tar._fillElement = evtt._tar; //キャッシュを作る
-          }
-          t = evtt = null;
-        }
-      } else {
-        el.filled = "false";
-      }
-      if (stroke.paintType === SVGPaint.SVG_PAINTTYPE_RGBCOLOR || stroke.paintType === SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR) {
-        var strokeElement = !!tar._strokeElement ? tar._strokeElement : document.createElement("v:stroke");
-        var sw = tar.ownerDocument.documentElement.createSVGLength(parseFloat(style.getPropertyValue("stroke-width")));//, Math.sqrt((w*w + h*h) / 2));
-        var swx = sw.value * Math.sqrt(Math.abs(matrix._determinant()));
-        strokeElement.setAttribute("weight", swx + "px");
-        if (!stroke.uri) {
-          var fc = stroke.rgbColor, num = CSSPrimitiveValue.CSS_NUMBER;
-          strokeElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");
-          var strokeOpacity = parseFloat(style.getPropertyValue("stroke-opacity")) * parseFloat(style.getPropertyValue("opacity")); //opacityを掛け合わせる
-          if (swx < 1) {
-            strokeOpacity *= swx; //太さが1px未満なら色を薄くする
-          }
-          if (strokeOpacity < 1) {
-            strokeElement.setAttribute("opacity", strokeOpacity);
-          }
-          fc = num = strokeOpacity = null;
-        }
-        strokeElement.setAttribute("miterlimit", style.getPropertyValue("stroke-miterlimit"));
-        strokeElement.setAttribute("joinstyle", style.getPropertyValue("stroke-linejoin"));
-        if (style.getPropertyValue("stroke-linecap") === "butt") {
-          strokeElement.setAttribute("endcap", "flat");
-        } else {
-          strokeElement.setAttribute("endcap", style.getPropertyValue("stroke-linecap"));
-        }
-        var tsd = style.getPropertyValue("stroke-dasharray");
-        if (tsd !== "none") {
-          if (tsd.indexOf(",") > 0) { //コンマ区切りの文字列の場合
-            var strs = tsd.split(",");
-            for (var i = 0, sli = strs.length; i < sli; ++i) {
-              strs[i] = Math.ceil(parseFloat(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意
-            }
-            var strokedasharray = strs.join(" ");
-            if (strs.length % 2 === 1) {
-              strokedasharray += " " + strokedasharray;
-            }
-          }
-          strokeElement.setAttribute("dashstyle", strokedasharray);
-          tsd = strs = null;
-        }
-        el.appendChild(strokeElement);
-        if (!!!tar._strokeElement) {
-          tar._strokeElement = strokeElement;
-        }
-        sw = tsd = null;
-      } else {
-        el.stroked = "false";
-      }
-      var cursor = style.getPropertyValue("cursor");
-      if (cursor !== "default") {
-        el.style.cursor = cursor;
-      }
-      cursor = w = h = matrix = dat = x = y = null;
+      NAIBU._setPaint(tar, matrix);
+      evt = tar = w = h = matrix = dat = x = y = null;
     }, false);
   }, false);
   return this;
@@ -2249,6 +2256,7 @@
 
 function SVGRectElement() {
   SVGElement.apply(this, arguments);
+  this._tar = document.createElement("v:shape");
   /*readonly SVGAnimatedLength*/ this.x = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.y = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.width = new SVGAnimatedLength();
@@ -2259,17 +2267,19 @@
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       return; //強制終了させる
     }
-    this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
+    var tar = evt.target;
+    tar.parentNode._tar.appendChild(tar._tar);
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
       var tar = evt.target;
       var rx = tar.hasAttributeNS(null, "rx"), ry = tar.hasAttributeNS(null, "ry");
-      var x = this.x.baseVal.value, y = this.y.baseVal.value, xw = x + this.width.baseVal.value, yh = y + this.height.baseVal.value;
+      var x = tar.x.baseVal.value, y = tar.y.baseVal.value, xw = x + tar.width.baseVal.value, yh = y + tar.height.baseVal.value;
       var list;
       if (rx || ry) {
-        var thrx = this.rx.baseVal, thry = thry.baseVal;
+        var thrx = tar.rx.baseVal, thry = tar.ry.baseVal;
         thrx.value = rx ? thrx.value : thry.value;
         thry.value = ry ? thry.value : thrx.value;
         //rx属性が幅より大きければ、幅の半分を属性に設定(ry属性は高さと比較する)
-        var twidth = this.width.baseVal.value, theight = this.height.baseVal.value;
+        var twidth = tar.width.baseVal.value, theight = tar.height.baseVal.value;
         if (thrx.value > twidth / 2) {
           thrx.value = twidth / 2;
         }
@@ -2290,12 +2300,14 @@
           ++i;
           continue;
         }
-        var p = par.createSVGPoint(list[i], list[i+1]);
+        var p = par.createSVGPoint();
+        p.x = list[i];
+        p.y = list[i+1];
         var pmt = p.matrixTransform(ctm);
-        ++i;
         list[i] = pmt.x;
         ++i;
         list[i] = pmt.y;
+        ++i;
         p = pmt = null;
       }
       var dat = list.join(" ");
@@ -2304,7 +2316,8 @@
       var w = vi.width, h = vi.hight;
       ele.path = dat;
       ele.coordsize = w + " " + h;
-      list = dat = ele = null;
+      NAIBU._setPaint(tar, ctm);
+      evt = tar = list = dat = ele = null;
     }, false);
   }, false);
   return this;
@@ -2314,6 +2327,7 @@
 
 function SVGCircleElement() { 
   SVGElement.apply(this, arguments);
+  this._tar = document.createElement("v:shape");
   /*readonly SVGAnimatedLength*/ this.cx = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.cy = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.r = new SVGAnimatedLength();
@@ -2321,9 +2335,11 @@
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       return; //強制終了させる
     }
-    this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
+    var tar = evt.target;
+    tar.parentNode._tar.appendChild(tar._tar);
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
       var tar = evt.target;
-      var cx = this.cx.baseVal.value, cy = this.cy.baseVal.value, rx = ry = this.r.baseVal.value;
+      var cx = tar.cx.baseVal.value, cy = tar.cy.baseVal.value, rx = ry = tar.r.baseVal.value;
       var top = cy - ry, left = cx - rx, bottom = cy + ry, right = cx + rx;
         var rrx = rx * 0.55228, rry = ry * 0.55228;
         var list = ["m", cx,top, "c", cx-rrx,top, left,cy-rry, left,cy, left,cy+rry, cx-rrx,bottom, cx,bottom, cx+rrx,bottom, right,cy+rry, right,cy, right,cy-rry, cx+rrx,top, cx,top, "x e"];
@@ -2334,12 +2350,14 @@
             ++i;
             continue;
           }
-          var p = par.createSVGPoint(list[i], list[i+1]);
+          var p = par.createSVGPoint();
+          p.x = list[i];
+          p.y = list[i+1];
           var pmt = p.matrixTransform(ctm);
-          ++i;
           list[i] = pmt.x;
           ++i;
           list[i] = pmt.y;
+          ++i;
           p = pmt = null;
         }
         var dat = list.join(" ");
@@ -2348,8 +2366,8 @@
         var w = vi.width, h = vi.hight;
         ele.path = dat;
         ele.coordsize = w + " " + h;
-        list = dat = ele = null;
-        dat = list = pl = plm = w = h = null; //解放
+        NAIBU._setPaint(tar, ctm);
+        evt = tar = list = dat = ele = null;
     }, false);
   }, false);
   return this;
@@ -2359,6 +2377,7 @@
 
 function SVGEllipseElement() { 
   SVGElement.apply(this, arguments);
+  this._tar = document.createElement("v:shape");
   /*readonly SVGAnimatedLength*/ this.cx = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.cy = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.rx = new SVGAnimatedLength();
@@ -2367,7 +2386,9 @@
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       return; //強制終了させる
     }
-    this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
+    var tar = evt.target;
+    tar.parentNode._tar.appendChild(tar._tar);
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
     }, false);
   }, false);
   return this;
@@ -2377,6 +2398,7 @@
 
 function SVGLineElement() { 
   SVGElement.apply(this, arguments);
+  this._tar = document.createElement("v:shape");
   /*readonly SVGAnimatedLength*/ this.x1 = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.y1 = new SVGAnimatedLength();
   /*readonly SVGAnimatedLength*/ this.x2 = new SVGAnimatedLength();
@@ -2385,7 +2407,9 @@
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       return; //強制終了させる
     }
-    this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
+    var tar = evt.target;
+    tar.parentNode._tar.appendChild(tar._tar);
+    tar.target.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
     }, false);
   }, false);
   return this;
@@ -2395,13 +2419,16 @@
 
 function SVGPolylineElement() {
   SVGElement.apply(this, arguments);
+  this._tar = document.createElement("v:shape");
   //interface SVGAnimatedPoints
   /*readonly SVGPointList*/   this.animatedPoints = this.points = new SVGPointList();
   this.addEventListener("DOMNodeInserted", function(evt){
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       return; //強制終了させる
     }
-    this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
+    var tar = evt.target;
+    tar.parentNode._tar.appendChild(tar._tar);
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
     }, false);
   }, false);
   return this;
@@ -2411,13 +2438,16 @@
 
 function SVGPolygonElement() {
   SVGElement.apply(this, arguments);
+  this._tar = document.createElement("v:shape");
   //interface SVGAnimatedPoints
   /*readonly SVGPointList*/   this.animatedPoints = this.points = new SVGPointList();
   this.addEventListener("DOMNodeInserted", function(evt){
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       return; //強制終了させる
     }
-    this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
+    var tar = evt.target;
+    tar.parentNode._tar.appendChild(tar._tar);
+    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
     }, false);
   }, false);
   return this;




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