svnno****@sourc*****
svnno****@sourc*****
2010年 12月 14日 (火) 23:26:27 JST
Revision: 2221 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2221 Author: dhrname Date: 2010-12-14 23:26:27 +0900 (Tue, 14 Dec 2010) Log Message: ----------- IEにおけるSVG Fontの実装開始 Modified Paths: -------------- branches/06x/066/org/w3c/dom/svg.js Modified: branches/06x/066/org/w3c/dom/svg.js =================================================================== --- branches/06x/066/org/w3c/dom/svg.js 2010-12-13 10:47:01 UTC (rev 2220) +++ branches/06x/066/org/w3c/dom/svg.js 2010-12-14 14:26:27 UTC (rev 2221) @@ -5185,11 +5185,42 @@ SVGExternalResourcesRequired, SVGStylable*/ { SVGElement.apply(this); - this.addEventListener("SVGLoad", function(evt){ - var tar = evt.target, ctar = evt.currentTarget; - ctar._instance = tar._instance; - evt = tar = ctar = null; - }, true); + this.addEventListener("DOMNodeInserted", function(evt){ + var tar = evt.target; + if (evt.eventPhase === Event.BUBBLING_PHASE) { + if (tar.localName === "font-face-uri" && tar.hasAttributeNS(null, "xlink:href")) { + evt.currentTarget.addEventListener("SVGLoad", function(evt){ + var tar = evt.target, svgns = "http://www.w3.org/2000/svg"; + var familyName = evt.currentTarget.getElementsByTagNameNS(svgns, "font-face").item(0).getAttributeNS(null, "font-family"); + var textElements = tar.ownerDocument.getElementsByTagNameNS(svgns, "text"); + for (var i=0,tli=textElements.length;i<tli;++i) { + var ti = textElements[i], style = tar.ownerDocument.defaultView.getComputedStyle(ti, ''); + if (style.getPropertyValue("font-family", null).indexOf(familyName) > -1) { + NAIBU._noie_createFont(ti, tar._instance); + } + } + tar.ownerDocument.documentElement.__isExternalFont = 1; + evt = tar = curt = textElments = svgns = null; + }, true); + } + return; + } + tar.ownerDocument.documentElement.addEventListener("SVGLoad", function(evt){ + var svg = evt.target, svgns = "http://www.w3.org/2000/svg"; + if (!svg.__isExternalFont) { + /*以下のtarはfont要素*/ + var familyName = tar.getElementsByTagNameNS(svgns, "font-face").item(0).getAttributeNS(null, "font-family"); + var textElements = tar.ownerDocument.getElementsByTagNameNS(svgns, "text"); + for (var i=0,tli=textElements.length;i<tli;++i) { + var ti = textElements[i], style = tar.ownerDocument.defaultView.getComputedStyle(ti, ''); + if (style.getPropertyValue("font-family", null).indexOf(familyName) > -1) { + NAIBU._noie_createFont(ti, tar); + } + } + evt = tar = svg = curt = textElments = svgns = null; + } + }, false); + }, false); return this; }; SVGFontElement.constructor = SVGElement; @@ -5229,6 +5260,7 @@ function SVGFontFaceElement() { SVGElement.apply(this); + /*string*/ this._familyName = ""; return this; }; SVGFontFaceElement.constructor = SVGElement; @@ -5405,14 +5437,24 @@ doc = data = null; }; NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font) { - var style = ti.ownerDocument.defaultView.getComputedStyle(ti, ''); + var style = ti.ownerDocument.defaultView.getComputedStyle(ti, ''), svgns = "http://www.w3.org/2000/svg"; //isTategakiは縦書きならば真 var isTategaki = ti.getAttributeNS(null, "writing-mode") || ti.parentNode.getAttributeNS(null, "writing-mode"), horizOrVert = isTategaki ? "vert-adv-y" : "horiz-adv-x"; - var node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "glyph"); - var em = parseFloat(font.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face").item(0).getAttribute("units-per-em") || 0); + var node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(svgns, "glyph"); + var em = parseFloat(font.getElementsByTagNameNS(svgns, "font-face").item(0).getAttribute("units-per-em") || 0); var advX = parseFloat( (font.getAttributeNS(null, horizOrVert) || em) ); //字幅の設定 var dx = parseFloat(ti.getAttributeNS(null, "x") || 0), fontSize = parseFloat(style.fontSize), dy = parseFloat(ti.getAttributeNS(null, "y") || 0), fe = fontSize / em; - var ds = false, npdlist = NAIBU.PaintColor.prototype.defaultsList; + var ds = false, npdlist = ["fill", + "fill-opacity", + "stroke", + "stroke-width", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-dasharray", + "stroke-opacity", + "opacity", + "cursor"]; if (/a/[-1] === 'a') { //Firefoxならば ds = true; } else { @@ -5447,12 +5489,16 @@ } for (var i=0,adv=0;i<data.length;++i) { if (advanceX[i] !== void 0) { //配列に含まれていれば - var path = ti.ownerDocument.createElementNS(NAIBU.svgNameSpace, "path"); + var path = ti.ownerDocument.createElementNS(svgns, "path"); //advance、すなわち字幅の長さ分、ずらしていく - var matrix = new Matrix(fe, 0, 0, -fe, 0, 0); + var matrix = ti.ownerDocument.createSVGMatrix(); + matrix.a = fe; + matrix.d = -fe; for (var j=0;j<npdlist.length;++j){ - var nj = npdlist[j].replace(/(fill|stroke)(\w)/, "$1-$2"); - path.setAttributeNS(null, nj, ti.getAttributeNS(null, nj)); + var nj = npdlist[j], tg = ti.getAttributeNS(null, nj); + if (tg) { + path.setAttributeNS(null, nj, tg); + } } if (isTategaki) { var y= dy + adv*fe, x = dx; @@ -5483,7 +5529,7 @@ } ti.style.opacity = "0"; } - data = isTategaki = horizOrVert = em = advX = dx = dy = fontSize = style = null; + data = isTategaki = horizOrVert = em = advX = dx = dy = fontSize = style = svgns = null; }; /*以下は、getComputedStyleメソッドで使うために、CSS2Propertiesの_listプロパティに、 @@ -5633,7 +5679,11 @@ } else { var ob = document.getElementsByTagName("object"); for (var i=0;i<ob;++i) { - ob[i].getSVGDocument().addEventListener("SVGLoad", NAIBU.fontSearchURI, false); + if (ob[i].contentDocument) { + ob[i].contentDocument.documentElement.addEventListener("SVGLoad", NAIBU._fontSearchURI, false); + } else if (ob[i].getSVGDocument) { + ob[i].getSVGDocument().documentElement.addEventListener("SVGLoad", NAIBU._fontSearchURI, false); + } } } xmlhttp = null;