svnno****@sourc*****
svnno****@sourc*****
2009年 11月 18日 (水) 18:02:03 JST
Revision: 1417 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1417 Author: dhrname Date: 2009-11-18 18:02:03 +0900 (Wed, 18 Nov 2009) Log Message: ----------- SVGFontの縦書きへの対応 Modified Paths: -------------- branches/05x/054/sie.js Modified: branches/05x/054/sie.js =================================================================== --- branches/05x/054/sie.js 2009-11-16 11:23:41 UTC (rev 1416) +++ branches/05x/054/sie.js 2009-11-18 09:02:03 UTC (rev 1417) @@ -1932,9 +1932,12 @@ }; NAIBU._ie_createFont = function(/*Element*/ ti, /*Element*/ font) { var node = ti.firstChild, data, glyphs = font.getElementsByTagName("glyph"); + var tistyle = ti.style; + //isTategakiは縦書きならば真 + var isTategaki = ( tistyle.writingMode.indexOf("tb") === 0 ), horizOrVert = isTategaki ? "vert-adv-y" : "horiz-adv-x"; var em = parseFloat(font.getElementsByTagName("font-face").item(0).getAttribute("units-per-em") || 0); - var advX = parseFloat(font.getAttribute("horiz-adv-x")); //字幅の設定 - var dx = parseFloat(ti.style.left), fontSize = parseFloat(ti.style.fontSize), dy = parseFloat(ti.style.top) - fontSize * 0.25, fe = fontSize / em; //0.25はディセンダの調整をあらかじめしているため + var advX = parseFloat( (font.getAttribute(horizOrVert) || em) ); //字幅の設定 + var dx = parseFloat(tistyle.left), fontSize = parseFloat(tistyle.fontSize), dy = parseFloat(tistyle.top) - fontSize * 0.25, fe = fontSize / em; //0.25はディセンダの調整をあらかじめしているため while(node) { data = node.data; if (data !== void 0) { //dataがある場合 @@ -1943,7 +1946,7 @@ //indexは該当する文字が何番目にあるかの数字 var index = data.indexOf(glyphs[i].getAttribute("unicode")); if (index > -1) { - advanceX[index] = parseFloat(glyphs[i].getAttribute("horiz-adv-x") || advX); //字幅を収納 + advanceX[index] = parseFloat(glyphs[i].getAttribute(horizOrVert) || advX); //字幅を収納 glyphData[index] = glyphs[i].getAttribute("d"); } } @@ -1951,10 +1954,14 @@ if (advanceX[i] !== void 0) { //配列に含まれていれば var path = document.createElement("v:shape"); //advance、すなわち字幅の長さ分、ずらしていく - var x = dx + adv*fe; + if (isTategaki) { + var y= dy + adv*fe, x = dx; + } else { + var x = dx + adv*fe, y= dy; + } ti.parentNode.insertBefore(path, ti); path.style.cssText = ti.style.cssText; - NAIBU.pathData(glyphData[i], path, true, ti.w, ti.h, (new Matrix(fe, 0, 0, -fe, x, dy))); + NAIBU.pathData(glyphData[i], path, true, ti.w, ti.h, (new Matrix(fe, 0, 0, -fe, x, y))); adv += advanceX[i]; } } @@ -2010,10 +2017,12 @@ } }; NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font) { - var style = ti.ownerDocument.defaultView.getComputedStyle(ti, '') + var style = ti.ownerDocument.defaultView.getComputedStyle(ti, ''); + //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 advX = parseFloat(font.getAttributeNS(null, "horiz-adv-x")); //字幅の設定 + 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; while(node) { data = node.data; @@ -2023,7 +2032,7 @@ //indexは該当する文字が何番目にあるかの数字 var index = data.indexOf((glyphs[i].getAttributeNS(null, "unicode") || "なし")); //unicode属性に指定がない場合、処理させないようにする if (index > -1) { - advanceX[index] = parseFloat(glyphs[i].getAttributeNS(null, "horiz-adv-x") || advX); //字幅を収納 + advanceX[index] = parseFloat(glyphs[i].getAttributeNS(null, horizOrVert) || advX); //字幅を収納 glyphData[index] = glyphs[i].getAttributeNS(null, "d"); } } @@ -2031,10 +2040,14 @@ if (advanceX[i] !== void 0) { //配列に含まれていれば var path = ti.ownerDocument.createElementNS(NAIBU.svgNameSpace, "path"); //advance、すなわち字幅の長さ分、ずらしていく - var x = dx + adv*fe; + if (isTategaki) { + var y= dy + adv*fe, x = dx; + } else { + var x = dx + adv*fe, y= dy; + } ti.parentNode.insertBefore(path, ti); path.style.cssText = style.cssText; - NAIBU.pathData(glyphData[i], path, false, 0, 0, (new Matrix(fe, 0, 0, -fe, x, dy))); + NAIBU.pathData(glyphData[i], path, false, 0, 0, (new Matrix(fe, 0, 0, -fe, x, y))); adv += advanceX[i]; } }