[Sie-announce] SIEコード [2016] 1, radialGradient要素の実装

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 9月 25日 (土) 20:58:00 JST


Revision: 2016
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2016
Author:   dhrname
Date:     2010-09-25 20:58:00 +0900 (Sat, 25 Sep 2010)

Log Message:
-----------
1, radialGradient要素の実装
2, グラデーションに関して、「オブジェクトがnullまたはundefinedです」という警告が出るバグの修正

Modified Paths:
--------------
    branches/06x/061/org/w3c/dom/svg.js

Modified: branches/06x/061/org/w3c/dom/svg.js
===================================================================
--- branches/06x/061/org/w3c/dom/svg.js	2010-09-25 11:04:05 UTC (rev 2015)
+++ branches/06x/061/org/w3c/dom/svg.js	2010-09-25 11:58:00 UTC (rev 2016)
@@ -308,10 +308,27 @@
 /*interface SVGLocatable*/
 /*SVGRect*/   SVGElement.prototype.getBBox = function(){
   var s = new SVGRect();
-  s.x      = this._tar.clientLeft;
-  s.y      = this._tar.clientTop;
-  s.width  = this._tar.clientWidth;
-  s.height = this._tar.clientHeight;
+  var data = this._tar.path.value, vi = this.ownerDocument.documentElement;
+  var el = vi.width.baseVal.value, et = vi.height.baseVal.value, er = 0, eb = 0;
+  /*要素の境界領域を求める(四隅の座標を求める)
+   *etは境界領域の上からビューポート(例えばsvg要素)の上端までの距離であり、ebは境界領域の下からビューポートの下端までの距離
+   *elは境界領域の左からビューポートの左端までの距離であり、erは境界領域の右からビューポートの右端までの距離
+   */
+  var degis = data.match(/[0-9\-]+/g);
+  for (var i=0,degisli=degis.length;i<degisli;i+=2) {
+    var nx = parseInt(degis[i]), ny = parseInt(degis[i+1]);
+    el = el > nx ? nx : el;
+    et = et > ny ? ny : et;
+    er = er > nx ? er : nx;
+    eb = eb > ny ? eb : ny;
+    nx = ny = null;
+  }
+  data = degis = null;
+  s.x      = et;
+  s.y      = el;
+  s.width  = er - el;
+  s.height = eb - et;
+  el = et = er = eb = vi = null;
   return s;
 };
 
@@ -3543,7 +3560,13 @@
         }
       }
       var color = style.getPropertyValue("fill");
-      tar._tar.style.color = color;
+      if (color === "none"){
+        tar._tar.style.color = "transparent";
+      } else if (color.indexOf("url") === -1) {
+        tar._tar.style.color = color;
+      } else {
+        tar._tar.style.color = "black";
+      }
       var cursor = style.getPropertyValue("cursor");
       if (cursor !== "auto" && cursor !== "") {
         tar._tar.style.cursor = cursor;
@@ -3757,8 +3780,13 @@
     if (grad) {
       var grad2 = grad;
       while (grad2 && !grad2.hasChildNodes()) { //stopを子要素に持つgradient要素を探す
-        grad2.getAttributeNS("http://www.w3.org/1999/xlink", "href").match(/#(.+)/);
-        grad2 = evt.target.ownerDocument.getElementById(RegExp.$1);
+        var href = grad2.getAttributeNS("http://www.w3.org/1999/xlink", "href");
+        if (href) {
+          href.match(/#(.+)/);
+          grad2 = evt.target.ownerDocument.getElementById(RegExp.$1);
+        } else {
+          break;
+        }
       }
       var stops = grad2.getElementsByTagNameNS("http://www.w3.org/2000/svg", "stop");
       if (!stops) {
@@ -3841,23 +3869,19 @@
        *四角だとおかしな模様が出てしまう。以下はそれを避ける処理
        */
       var cx = grad.cx.baseVal.value, cy = grad.cy.baseVal.value;
-      var r = rx = ry = grad.r.baseVal.value;
+      var r = grad.r.baseVal.value, rx, ry;
+      rx = ry = r;
       var tarrect = tar.getBBox();
       var vi = tar.ownerDocument.documentElement;
       var el = vi.width.baseVal.value, et = vi.height.baseVal.value, er = 0, eb = 0;
-      var data = tar._tar.path.value;
       var units = grad.getAttributeNS(null, "gradientUnits");
       if (!units || units === "objectBoundingBox") {
         //%の場合は小数点に変換(10% -> 0.1)
         cx = cx > 1 ? cx/100 : cx; cy = cy > 1 ? cy/100 : cy; r = r > 1 ? r/100 : r;
         //要素の境界領域を求める(四隅の座標を求める)
-        var nx = tarrect.x, ny = tarrect.y;
-        el = el > nx ? nx : el;
-        et = et > ny ? ny : et;
-        er = er > nx ? er : nx;
-        eb = eb > ny ? eb : ny;
-        nx = ny = null;
-        cx = cx*(er - el) + el; cy = cy*(eb - et) + et; rx = r*(er - el); ry = r*(eb - et);
+        var nx = tarrect.x, ny = tarrect.y, wid = tarrect.width, hei = tarrect.height;
+        cx = cx*wid + nx; cy = cy*hei + ny; rx = r*wid; ry = r*hei;
+        nx = ny = wid = hei = null;
       }
       var gt = grad.getAttributeNS(null, "gradientTransform");
       if (gt) {
@@ -3893,6 +3917,7 @@
       bstyle.filter = "progid:DXImageTransform.Microsoft.Compositor";
       background.filters.item('DXImageTransform.Microsoft.Compositor').Function = 23;
       var circle = '<v:shape style="display:inline-block; position:relative; antialias:false; top:0px; left:0px;" coordsize="' +w+ ' ' +h+ '" path="' +ellipse+ '" stroked="f">' +ele.outerHTML+ '</v:shape>';
+      var data = tar._tar.path.value;
       background.innerHTML = '<v:shape style="display:inline-block; position:relative; top:0px; left:0px;" coordsize="' +w+ ' ' +h+ '" path="' +data+ '" stroked="f" fillcolor="' +grad._color[grad._color.length-1]+ '" ></v:shape>';
       background.filters[0].apply();
       background.innerHTML = circle;
@@ -4828,7 +4853,8 @@
   tref:            SVGTRefElement,
   use:             SVGUseElement,
   view:            SVGViewElement,
-  vkern:           SVGVKernElement
+  vkern:           SVGVKernElement,
+  pattern:         SVGPatternElement
 };
 
 /*以下は、getComputedStyleメソッドで使うために、CSS2Propertiesの_listプロパティに、




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