svnno****@sourc*****
svnno****@sourc*****
2010年 9月 24日 (金) 22:07:59 JST
Revision: 2012 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2012 Author: dhrname Date: 2010-09-24 22:07:58 +0900 (Fri, 24 Sep 2010) Log Message: ----------- SVGRadialGradientElementオブジェクトの修正 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-22 12:33:29 UTC (rev 2011) +++ branches/06x/061/org/w3c/dom/svg.js 2010-09-24 13:07:58 UTC (rev 2012) @@ -3705,7 +3705,7 @@ }; function SVGColorProfileElement() { - SVGElement.apply(this, arguments); + SVGElement.apply(this); /*DOMString*/ this._local; // raises DOMException on setting // (NOTE: is prefixed by "_" @@ -3720,7 +3720,7 @@ SVGColorProfileElement.prototype = new SVGElement(); function SVGColorProfileRule() { - SVGCSSRule.apply(this, arguments); + SVGCSSRule.apply(this); /*DOMString*/ this.src; /*DOMString*/ this.name; /*unsigned short*/ this.renderingIntent; @@ -3766,6 +3766,8 @@ // When colors attribute is used, the meanings of opacity and o:opacity2 are reversed. ele.setAttribute("opacity", opacity[length-1]+ ""); ele.setAttribute("o:opacity2", opacity[0]+ ""); + /*SVGRadialGradientElementインターフェースで利用する*/ + grad._color = color; grad = ele = stops = lengh = color = colors = opacity = null; } evt = t = null; @@ -3827,7 +3829,8 @@ var cx = grad.cx.baseVal.value, cy = grad.cy.baseVal.value; var r = rx = ry = grad.r.baseVal.value; var tarrect = tar.getBBox(); - var el = tar.ownerDocument.documentElement.viewport.width, et = tar.ownerDocument.documentElement.viewport.height, er = 0, eb = 0; + var el = tar.ownerDocument.documentElement.viewBox.baseVal.width, et = tar.ownerDocument.documentElement.viewBox.baseVal.height, er = 0, eb = 0; + var data = tar._tar.path.value; var units = grad.getAttributeNS(null, "gradientUnits"); if (!units || units === "objectBoundingBox") { //%の場合は小数点に変換(10% -> 0.1) @@ -3843,31 +3846,45 @@ } var gt = grad.getAttributeNS(null, "gradientTransform"); if (gt) { - grad.setAttributeNS(null, "transform",gt); - matrix = grad.getCTM(); + grad.setAttributeNS(null, "transform", gt); } + matrix = tar.getScreenCTM().multiply(grad.getCTM()); el = cx - rx; et = cy - ry; er = cx + rx; eb = cy + ry; var rrx = rx * 0.55228, rry = ry * 0.55228; var list = ["m", cx,et, "c", cx-rrx,et, el,cy-rry, el,cy, el,cy+rry, cx-rrx,eb, cx,eb, cx+rrx,eb, er,cy+rry, er,cy, er,cy-rry, cx+rrx,et, cx,et, "x e"]; - var pl = new PList(list); - var plm = pl.matrixTransform(matrix); - var ellipse = plm.list.join(" "); + for (var i = 0, lili = list.length; i < lili;) { + if (isNaN(list[i])) { //コマンド文字は読み飛ばす + ++i; + continue; + } + var p = grad.ownerDocument.documentElement.createSVGPoint(); + p.x = parseFloat(list[i]); + p.y = parseFloat(list[i+1]); + var pmt = p.matrixTransform(matrix); + list[i] = pmt.x; + i++; + list[i] = pmt.y; + i++; + p = pmt = null; + } + var ellipse = list.join(" "); var outline = document.getElementById("_NAIBU_outline"); var background = document.createElement("div"), bstyle = background.style; bstyle.position = "absolute"; bstyle.display = "inline-block"; - bstyle.textAlign = "left"; bstyle.top = "0px"; bstyle.left = "0px"; bstyle.width = this.w+ "px"; bstyle.height = this.h+ "px"; + var w = tar.ownerDocument.documentElement.viewBox.baseVal.width, h = tar.ownerDocument.documentElement.viewBox.baseVal.height; + bstyle.textAlign = "left"; bstyle.top = "0px"; bstyle.left = "0px"; bstyle.width = w+ "px"; bstyle.height = h+ "px"; outline.appendChild(background); 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="' +this.w+ ' ' +this.h+ '" path="' +ellipse+ '" stroked="f">' +ele.outerHTML+ '</v:shape>'; - background.innerHTML = '<v:shape style="display:inline-block; position:relative; top:0px; left:0px;" coordsize="' +this.w+ ' ' +this.h+ '" path="' +data+ '" stroked="f" fillcolor="' +color[color.length-1]+ '" ></v:shape>'; + 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>'; + 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; background.filters[0].play(); - ele.parentNode.insertBefore(background, ele); - ele.parentNode.filled = "false"; - ellipse = circle = data = list = pl = plm = gt = cx = cy = r = null; + tar._tar.insertBefore(background, tar._tar.firstChild); + tar._tar.filled = "false"; + ellipse = circle = data = list = gt = cx = cy = r = w = h = null; } else if (!ele.parentNode){ tar._tar.appendChild(ele); }