svnno****@sourc*****
svnno****@sourc*****
2009年 11月 7日 (土) 23:23:28 JST
Revision: 1398 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1398 Author: dhrname Date: 2009-11-07 23:23:28 +0900 (Sat, 07 Nov 2009) Log Message: ----------- 1, Firefoxでの_noie_createFontの実装を進めた 2, スタイル情報の取得は、動的に取得のできるdefaultView.getComputedStyleを用いることにした Modified Paths: -------------- branches/05x/053/sie.js Modified: branches/05x/053/sie.js =================================================================== --- branches/05x/053/sie.js 2009-11-07 11:29:39 UTC (rev 1397) +++ branches/05x/053/sie.js 2009-11-07 14:23:28 UTC (rev 1398) @@ -1926,30 +1926,32 @@ var tsrc = doc.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face-uri"); for (var i=0;i<tsrc.length;++i) { var src = tsrc[i].getAttributeNS("http://www.w3.org/1999/xlink", "href"), ids = src.substring(src.indexOf("#")+1, src.length); - getURL(src.replace(/#.+$/, ""), _noie_font, [ {id : ids, style:{}} ], 1); + getURL(src.replace(/#.+$/, ""), _noie_font, [ {id : ids, style : {}, docu : doc} ], 1); } }; function _noie_font(data) { if (data.success) { - var doc = (new DOMParser()).parseFromString(data.content); + var doc = (new DOMParser()).parseFromString(data.content, "text/xml"); //getElementByIdは使えないので注意(DTDでの指定が必要) var font = doc.getElementsByTagNameNS(NAIBU.svgNameSpace, "font").item(0); var familyName = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face").item(0).getAttributeNS(null, "font-family"); if (familyName && font.getAttributeNS(null, "id") === data.obj[0].id) { - var textElements = document.getElementByTagNameNS(NAIBU.svgNameSpace, "text"); + var textElements = data.obj[0].docu.getElementsByTagNameNS(NAIBU.svgNameSpace, "text"); for (var i=0,tli=textElements.length;i<tli;++i) { - var ti = textElements[i]; - if ((ti.getProperty("font-family") || "serif").indexOf(familyName) > -1) { - NAIBU._ie_createFont(ti, font); + var ti = textElements[i], style = data.obj[0].docu.defaultView.getComputedStyle(ti, ''); + if (style.fontFamily.indexOf(familyName) > -1) { + NAIBU._noie_createFont(ti, font); } } } + doc = data = null; } }; NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font) { + var style = ti.ownerDocument.defaultView.getComputedStyle(ti, '') var node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "glyph"), em = parseFloat(font.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face").item(0).getAttribute("units-per-em") || 0); var advX = parseFloat(font.getAttributeNS(null, "horiz-adv-x")), originX = parseFloat(font.getAttributeNS(null, "horiz-origin-x") || 0), originY = parseFloat(font.getAttributeNS(null, "horiz-origin-y") || 0); //字幅とフォントの原点の設定 - var dx = parseFloat(ti.getAttributeNS(null, "x")), fontSize = parseFloat(ti.getProperty("font-size")), dy = parseFloat(ti.getAttributeNS(null, "y")), fe = fontSize / em; + var dx = parseFloat(ti.getAttributeNS(null, "x")), fontSize = parseFloat(style.fontSize), dy = parseFloat(ti.getAttributeNS(null, "y")), fe = fontSize / em; while(node) { data = node.data; if (data !== void 0) { //dataがある場合 @@ -1964,7 +1966,7 @@ } for (var i=0,adv=0;i<data.length;++i) { if (advanceX[i] !== void 0) { //配列に含まれていれば - var path = document.createElementNS(NAIBU.svgNameSpace, "path"); + var path = ti.ownerDocument.createElementNS(NAIBU.svgNameSpace, "path"); //advance、すなわち字幅の長さ分、ずらしていく var x = dx + adv*fe; ti.parentNode.insertBefore(path, ti);