svnno****@sourc*****
svnno****@sourc*****
2009年 11月 7日 (土) 20:27:32 JST
Revision: 1396 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1396 Author: dhrname Date: 2009-11-07 20:27:32 +0900 (Sat, 07 Nov 2009) Log Message: ----------- Modified Paths: -------------- branches/05x/053/sie.js Modified: branches/05x/053/sie.js =================================================================== --- branches/05x/053/sie.js 2009-11-05 14:50:47 UTC (rev 1395) +++ branches/05x/053/sie.js 2009-11-07 11:27:32 UTC (rev 1396) @@ -1911,14 +1911,14 @@ var obj = document.getElementsByTagName("object"); for (var i=0;i<obj.length;++i) { var s, obji = obj[i]; - if (obji.getSVGDocument === void 0) { //void 0はundefinedのこと + if (obji.getSVGDocument !== void 0 && window.opera === void 0) { //Operaでなければ、かつ、void 0はundefinedのこと if (obji.contentDocument !== void 0) { //Firefoxの場合 s = obji.contentDocument; } else { s = obji.getSVGDocument(); } + NAIBU._fontSearchURI(s); } - NAIBU._fontSearchURI(s); NAIBU._fontSearchURI(document); } }; @@ -1947,25 +1947,38 @@ } }; NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font) { - var node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "glyph"); - var advanceX = [], advX = parseFloat(font.getAttribute("horiz-adv-x")), originX = parseFloat(font.getAttribute("horiz-origin-x") || 0), originY = parseFloat(font.getAttribute("horiz-origin-y") || 0); //字幅とフォントの原点の設定 - var dx = parseFloat((ti.getAttributeNS(null, "x") || 0)), dy = parseFloat((ti.getAttributeNS(null, "y") || 0)), fontSize = parseFloat((ti.getProperty("font-size") || 12)); - while(node) { + 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; + while(node) { data = node.data; if (data !== void 0) { //dataがある場合 + var advanceX = [], glyphData = []; for (var i=0,gli=glyphs.length;i<gli;++i) { - var index = data.indexOf(glyphs[i].getAttributeNS(null, "unicode")), path = document.createElementNS(NAIBU.svgNameSpace, "path"); - //fontSizeと文字数をかけた長さ分、ずらしていく - var x = dx + fontSize * index, y = dy; - advanceX[index] = parseFloat(glyphs[i].getAttribute("horiz-adv-x") || advX); - ti.insertBefore(path); - NAIBU.pathData(glyphs[i].getAttributeNS(null, "d"), path, false, x, y); + //indexは該当する文字が何番目にあるかの数字 + var index = data.indexOf(glyphs[i].getAttributeNS(null, "unicode")); + if (index > -1) { + advanceX[index] = parseFloat(glyphs[i].getAttributeNS(null, "horiz-adv-x") || advX); //字幅を収納 + glyphData[index] = glyphs[i].getAttributeNS(null, "d"); + } } + for (var i=0,adv=0;i<data.length;++i) { + if (advanceX[i] !== void 0) { //配列に含まれていれば + var path = document.createElementNS(NAIBU.svgNameSpace, "path"); + //advance、すなわち字幅の長さ分、ずらしていく + var x = dx + adv*fe; + ti.parentNode.insertBefore(path, ti); + NAIBU.pathData(glyphData[i], path, false, 0, 0, (new Matrix(fe, 0, 0, -fe, x, dy))); + adv += advanceX[i]; + } + } + advanceX = glyphData = null; } else { - NAIBU._ie_createFont(node, font); + NAIBU._noie_createFont(node, font); } node = node.nextSibling; } + ti.style.visibility = "hidden"; }; NAIBU.pathData = function(/*string*/ data, /*Element*/ p, /*boolean*/ t, /*float*/ w, h, /*Matrix*/ matrix) { //CTMでフォントを移動させておく