svnno****@sourc*****
svnno****@sourc*****
2010年 1月 10日 (日) 22:55:09 JST
Revision: 1567 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1567 Author: dhrname Date: 2010-01-10 22:55:09 +0900 (Sun, 10 Jan 2010) Log Message: ----------- Modified Paths: -------------- branches/05x/058/sie.js Modified: branches/05x/058/sie.js =================================================================== --- branches/05x/058/sie.js 2010-01-10 13:46:31 UTC (rev 1566) +++ branches/05x/058/sie.js 2010-01-10 13:55:09 UTC (rev 1567) @@ -1383,109 +1383,109 @@ } //linearGradient、radialGradient要素を処理 NAIBU.PaintColor.prototype.gradient = function( /*element*/ ele, /*string*/ id, /*Matrix*/ matrix) { - var grad = document.getElementById(id); + var grad = document.getElementById(id), _s = false; if (grad) { - var grad2 = grad; - while (grad2 && !grad2.hasChildNodes()) { //stopを子要素に持つgradient要素を探す - grad2.getAttribute("xlink:href").match(/#(.+)/); - grad2 = document.getElementById(RegExp.$1); - } - var stops = grad2.getElementsByTagName("stop"); - if (!stops) { - grad = grad2 = stops = null; - return false; - } - var length = stops.length; - var color = [], colors = [], opacity = []; - for (var i = 0; i < length; ++i) { - var stop = stops[i]; - color[i] = this.color(stop.style.stopcolor || stop.getAttribute("stopcolor")) || "black"; - colors[i] = stop.getAttribute("offset") + " " + color[i]; - opacity[i] = (stop.style.stopopacity || stop.getAttribute("stopopacity") || 1) * this.fillopacity * this.opacity; - } - ele.setAttribute("method", "none"); - ele.setAttribute("color", color[0]); - ele.setAttribute("color2", color[length-1]); - ele.setAttribute("colors", colors.join(",")); - // 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]); - var type = grad.getAttribute("type"), toNumber = this.toNumber; - if (type === "gradient") { - try { - var angle; - var x1 = toNumber((grad.getAttribute("x1") || "0")); - var y1 = toNumber((grad.getAttribute("y1") || "0")); - var x2 = toNumber((grad.getAttribute("x2") || "100")); - var y2 = toNumber((grad.getAttribute("y2") || "0")); - angle = 270 - Math.atan2(y2-y1, x2-x1) * 180 / Math.PI; - if (angle >= 360) { - angle -= 360; + var grad2 = grad; + while (grad2 && !grad2.hasChildNodes()) { //stopを子要素に持つgradient要素を探す + grad2.getAttribute("xlink:href").match(/#(.+)/); + grad2 = document.getElementById(RegExp.$1); } - } catch(e) {stlog.add(e,749); angle = 270;} - ele.setAttribute("type", "gradient"); - ele.setAttribute("angle", angle + ""); - x1 = y1 = x2 = y2 = angle = null; - } else if (type === "gradientRadial") { - try{ - ele.setAttribute("type", "gradientTitle"); - ele.setAttribute("focus", "100%"); - ele.setAttribute("focusposition", "0.5 0.5"); - if (this.tar.getAttribute("tag") === "rect") { - var cx = toNumber((grad.getAttribute("cx") || "0.5")); - var cy = toNumber((grad.getAttribute("cy") || "0.5")); - var r = rx = ry = toNumber((grad.getAttribute("r") || "0.5")); - var el = this.w, et = this.h, er = 0, eb = 0; - var data = this.tar.path.value; - var units = grad.getAttribute("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 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; + var stops = grad2.getElementsByTagName("stop"); + if (!stops) { + grad = grad2 = stops = null; + return false; + } + var length = stops.length; + var color = [], colors = [], opacity = []; + for (var i = 0; i < length; ++i) { + var stop = stops[i]; + color[i] = this.color(stop.style.stopcolor || stop.getAttribute("stopcolor")) || "black"; + colors[i] = stop.getAttribute("offset") + " " + color[i]; + opacity[i] = (stop.style.stopopacity || stop.getAttribute("stopopacity") || 1) * this.fillopacity * this.opacity; + } + ele.setAttribute("method", "none"); + ele.setAttribute("color", color[0]); + ele.setAttribute("color2", color[length-1]); + ele.setAttribute("colors", colors.join(",")); + // 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]); + var type = grad.getAttribute("type"), toNumber = this.toNumber; + if (type === "gradient") { + try { + var angle; + var x1 = toNumber((grad.getAttribute("x1") || "0")); + var y1 = toNumber((grad.getAttribute("y1") || "0")); + var x2 = toNumber((grad.getAttribute("x2") || "100")); + var y2 = toNumber((grad.getAttribute("y2") || "0")); + angle = 270 - Math.atan2(y2-y1, x2-x1) * 180 / Math.PI; + if (angle >= 360) { + angle -= 360; } - degis = null; - cx = cx*(er - el) + el; cy = cy*(eb - et) + et; rx = r*(er - el); ry = r*(eb - et); - } - var gt = grad.getAttribute("gradientTransform"); - if (gt) { - grad.setAttribute("transform",gt); - matrix = NAIBU.transformToCTM(grad, matrix); - } - 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(" "); - var outline = document.getElementById("_NAIBU_outline"); - var background = document.createElement("div"), bstyle = background.style; - bstyle.position = "absolute"; - bstyle.textAlign = "left"; bstyle.top = "0px"; bstyle.left = "0px"; bstyle.width = this.w+ "px"; bstyle.height = this.h+ "px"; - outline.appendChild(background); - bstyle.filter = "progid:DXImageTransform.Microsoft.Compositor"; - background.filters.item('DXImageTransform.Microsoft.Compositor').Function = 23; - var circle = '<v:shape style="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="position:relative; top:0px; left:0px;" coordsize="' +this.w+ ' ' +this.h+ '" path="' +data+ '" stroked="f" fillcolor="' +color[color.length-1]+ '" ></v:shape>'; - background.filters[0].apply(); - background.innerHTML = circle; - background.filters[0].play(); - this.tar.parentNode.insertBefore(background, this.tar); - this.tar.filled = "false"; - ellipse = circle = data = list = pl = plm = gt = cx = cy = r = null; - return true; + } catch(e) {stlog.add(e,749); angle = 270;} + ele.setAttribute("type", "gradient"); + ele.setAttribute("angle", angle + ""); + x1 = y1 = x2 = y2 = angle = null; + } else if (type === "gradientRadial") { + try{ + ele.setAttribute("type", "gradientTitle"); + ele.setAttribute("focus", "100%"); + ele.setAttribute("focusposition", "0.5 0.5"); + if (this.tar.getAttribute("tag") === "rect") { + var cx = toNumber((grad.getAttribute("cx") || "0.5")); + var cy = toNumber((grad.getAttribute("cy") || "0.5")); + var r = rx = ry = toNumber((grad.getAttribute("r") || "0.5")); + var el = this.w, et = this.h, er = 0, eb = 0; + var data = this.tar.path.value; + var units = grad.getAttribute("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 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; + } + degis = null; + cx = cx*(er - el) + el; cy = cy*(eb - et) + et; rx = r*(er - el); ry = r*(eb - et); + } + var gt = grad.getAttribute("gradientTransform"); + if (gt) { + grad.setAttribute("transform",gt); + matrix = NAIBU.transformToCTM(grad, matrix); + } + 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(" "); + var outline = document.getElementById("_NAIBU_outline"); + var background = document.createElement("div"), bstyle = background.style; + bstyle.position = "absolute"; + bstyle.textAlign = "left"; bstyle.top = "0px"; bstyle.left = "0px"; bstyle.width = this.w+ "px"; bstyle.height = this.h+ "px"; + outline.appendChild(background); + bstyle.filter = "progid:DXImageTransform.Microsoft.Compositor"; + background.filters.item('DXImageTransform.Microsoft.Compositor').Function = 23; + var circle = '<v:shape style="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="position:relative; top:0px; left:0px;" coordsize="' +this.w+ ' ' +this.h+ '" path="' +data+ '" stroked="f" fillcolor="' +color[color.length-1]+ '" ></v:shape>'; + background.filters[0].apply(); + background.innerHTML = circle; + background.filters[0].play(); + this.tar.parentNode.insertBefore(background, this.tar); + this.tar.filled = "false"; + ellipse = circle = data = list = pl = plm = gt = cx = cy = r = null; + _s = true; + } + } catch(e) {stlog.add(e,1175);} } - } catch(e) {stlog.add(e,1175);} + stops = type = lengh = color = colors = opacity = null; } - } - stops = type = lengh = color = colors = opacity = null; - return false; + return _s; }; //font属性、関連プロパティを処理する