svnno****@sourc*****
svnno****@sourc*****
2009年 11月 12日 (木) 22:53:42 JST
Revision: 1404 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1404 Author: dhrname Date: 2009-11-12 22:53:42 +0900 (Thu, 12 Nov 2009) Log Message: ----------- 0.53統合 Modified Paths: -------------- trunk/sie.js Property Changed: ---------------- trunk/sie.js Modified: trunk/sie.js =================================================================== --- trunk/sie.js 2009-11-12 13:49:19 UTC (rev 1403) +++ trunk/sie.js 2009-11-12 13:53:42 UTC (rev 1404) @@ -44,6 +44,9 @@ //これを頭に付けたら、内部処理用 var NAIBU = {}; +SIE = { + version : 0.53 +}; //documentを速くするために /*@cc_on _d=document;eval('var document=_d')@*/ //bookmarkletから呼び出されたらtrue @@ -88,13 +91,16 @@ document.body.appendChild(oba); NAIBU.STObject.next(); success = true; - } else if (/a/[-1] === 'a'){ //Firefoxだったらtrueを返す - NAIBU.STObject.ffnext(); + } else { + if (/a/[-1] === 'a'){ //Firefoxだったらtrueを返す + NAIBU.STObject.ffnext(); + _noie_svgfont(); + } } } //他のページに移動する際に起動 function unsvgtovml() { - NAIBU = stlog = STLog = null; + NAIBU = stlog = STLog = SIE = null; } //vmlの名前空間をセット(必須) @@ -120,7 +126,7 @@ } else { window['on'+evt] = lis; } -} +}; NAIBU.addEvent("load",svgtovml); NAIBU.addEvent("unload",unsvgtovml); @@ -138,7 +144,7 @@ if (this.jo) { this.p.innerHTML += "<p>"+code+":"+e.message+"</p>"; } -} +}; //SVGtoVML 本体。SVGDocumentの代わりを担う //object要素の幅と高さがwとh(単位はpxに統一)。svg要素の幅と高さがswi.valueとshi.value。svg要素にwidth属性が指定されていない場合、swi.value=wである。 @@ -156,7 +162,7 @@ var mat = this.vi.set(sw, sh, ob); //返り値はMatrix型 this.chset(this.rootElement, mat, sw, sh); } catch(n) {stlog.add(n,109);} -} +}; SVGtoVML.prototype.getObject = function stvgetob( /*string*/ tag, /*object*/ st, /*string*/nodes, /*float*/w, h) { try { var li = this.rootElement.getElementsByTagName(tag); @@ -167,7 +173,7 @@ this[nodes] = la; li = null; } catch(e) {stlog.add(e,129);} -} +}; SVGtoVML.prototype.set = function stvset(ob) { var w = this.w, h = this.h, c = this.children; var sw = this.swi.value, sh = this.shi.value; @@ -221,19 +227,19 @@ } } } catch(e) {stlog.add(e,138);} -} +}; SVGtoVML.prototype.setObject = function stvsetob( /*SVGElement*/ arr, /*float*/ sw, /*float*/ sh) { try { for (var i=0,arri=arr.length;i<arri;++i) { arr[i].set(sw,sh); } } catch(e) {stlog.add(e,170);} -} +}; //chset childNodesで要素を作成していく SVGtoVML.prototype.chset = function _s_chset( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, /*float*/h){ var nods = ele.childNodes, s = null; - var name = "group|shape|defs|STOP|fill|stroke|DIV|SPAN|A|image|rect|USE", gname = "DIV|group"; //要素名に合致させる文字列 + var name = "group|shape|defs|STOP|fill|stroke|DIV|SPAN|A|image|rect|USE|FONTFACEURI", gname = "DIV|group"; //要素名に合致させる文字列 var cmatrix = matrix; //子要素に継がせるCTM var te = nods[0]; if (te !== void 0) { @@ -294,7 +300,7 @@ } while (te); } nods = name = gname = matrix = cmatrix = w = h = null; -} +}; //object要素とembed要素の取得を総括して行う function Objectembeds(){ @@ -318,9 +324,10 @@ getURL(this.emd[n].src,ca,this.emd,n+1); } catch(e) {stlog.add(e,185);this.next();} } else { //全要素の読み込みが終われば + _ie_svgfont(); } } catch(e) {stlog.add(e,293);this.onumber++;this.next();} -} +}; //embed要素をobject要素に変える(Firefoxのみ) Objectembeds.prototype.ffnext = function(){ try{ @@ -332,10 +339,10 @@ var tep = tei.parentNode; tep.insertBefore(s,tei); tep.removeChild(tei); - teli--; + teli--; } } catch(e) {stlog.add(e,294);} -} +}; //g要素の処理 function STGroupElement( /*element*/ g, /*Matrix*/ matrix, /*float*/w, h) { @@ -353,7 +360,7 @@ try{ stvsetob(this.children,sw,sh); this.children = this.transformable = null; - } catch(e){stlog.addd(e,3145)} + } catch(e){stlog.addd(e,3145);} }; STGroupElement.prototype.chset = SVGtoVML.prototype.chset; @@ -379,7 +386,7 @@ txts.top = "0px"; txts.textDecoration = "none"; } catch(e) {stlog.add(e,204);} -} +}; //text要素の処理 function STText( /*element*/ te, /*Matrix*/ matrix, /*float*/w, h) { @@ -406,6 +413,8 @@ var ttm = this.transformable; var p = new Point(this.x.value,this.y.value); var ptm = p.matrixTransform(ttm); + this.tar.w = w; + this.tar.h = h; var tts = this.tar.style; tts.position = "absolute"; var ttp = this.tar.parentNode; @@ -469,7 +478,7 @@ } catch(e) {stlog.add(e,2831);} p = ptm = tancx = tancy = null; this.textLength = textLength; -} +}; //fontset フォントの大きさを幅と高さを使ってpx単位に変換 function fontset( /*float*/ f, /*float*/ w, /*float*/ h, /*Matrix*/ ttm) { try { @@ -509,9 +518,9 @@ } p = ptm = w = h = null; //ずれの値を返す - return {dx : parseFloat(tts.left), dy : parseFloat(tts.top)} + return {dx : parseFloat(tts.left), dy : parseFloat(tts.top)}; } catch(e) {stlog.add(e,304);} -} +}; //line要素の処理 function STLine( /*element*/ li, /*Matrix*/ matrix, /*float*/w, h) { @@ -537,7 +546,7 @@ this.paint.set(w, h, ttm); list = pl = plm = dat = this.paint = ttm = this.transformable = w = h = null; } catch(e) {stlog.add(e,257);} -} +}; //path要素の処理 function STPath( /*element*/ ele, /*Matrix*/ matrix) { @@ -655,7 +664,7 @@ x = x2; y = y2; } return F; -} +}; //前回の座標を反転させる。それを挿入 NAIBU.nst = function ( /*int*/ skip, /*Array*/ F, /*float*/ x1, /*float*/ y1) { @@ -666,7 +675,7 @@ F.splice(i, 0, x1, y1); } return F; -} +}; //相対座標を絶対座標に変換 NAIBU.reltoabs = function (/*float*/ x, /*float*/ y, /*Array*/ F) { @@ -683,7 +692,7 @@ } } return F; -} +}; //polygon要素を処理 function STPolygon( /*element*/ ele, /*Matrix*/ matrix) { @@ -709,7 +718,7 @@ ele.coordsize = w + " " + h; this.paint.set(w, h, ttm); } catch(e) {stlog.add(e,406);} -} +}; //polyline要素を処理 function STPolyline( /*element*/ ele, /*Matrix*/ matrix) { @@ -735,7 +744,7 @@ ele.coordsize = w + " " + h; this.paint.set(w, h, ttm); } catch(e) {stlog.add(e,440);} -} +}; //circle要素を処理 function STCircle( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, h) { @@ -769,7 +778,7 @@ this.paint.set(w, h, ttm); dat = list = pl = plm = this.paint = ttm = this.transformable = w = h = null; //解放 } catch(e) {stlog.add(e,479);} -} +}; //ellipse要素を処理 function STEllipse( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, h) { @@ -803,7 +812,7 @@ this.paint.set(w, h, ttm); dat = list = pl = plm = this.paint = ttm = this.transformable = w = h = null; //解放 } catch(e) {stlog.add(e,519);} -} +}; //rect要素を処理 function STRectElement( /*element*/ rect, /*Matrix*/ matrix, /*float*/ w, h) { @@ -854,7 +863,7 @@ this.paint.set(w, h, ttm); dat = list = pl = plm = this.paint = ttm = this.transformable = w = h = null; //解放 } catch(ee) {stlog.add(ee,576);} -} +}; //image要素の処理 function STImage( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, h){ @@ -867,7 +876,7 @@ this.xlink = new NAIBU.XLink(ele); this.paint = new NAIBU.PaintColor(ele); this.transformable = NAIBU.transformToCTM(ele,matrix); - w = h = null + w = h = null; return this; } STImage.prototype.set = function imagesets(w,h){ @@ -896,13 +905,13 @@ this.xlink.set(); dat = pt = this.xlink = this.paint = ttm = this.transformable = w = h = null; //解放 } catch(e) {stlog.set(e,21896);} -} +}; /*use要素の処理*/ function STUseElement( /*element*/ ele, /*float*/w, h){ this.tar = ele; var tns = ele.nextSibling; - tns.setAttribute("xlink:show", "embed") + tns.setAttribute("xlink:show", "embed"); this.x = new STLength((tns.getAttribute("x") || 0), w); this.y = new STLength((tns.getAttribute("y") || 0), h); this.width = new STLength(tns.getAttribute("svgwidth"), w); @@ -923,7 +932,7 @@ this.paint.setStyle(); this.paint = this.xlink = null; } catch(e) {stlog.add(e,85436);} -} +}; //色のキーワード //PaintColor 色、線などをすべてコントロール @@ -1002,7 +1011,7 @@ //内部プロパティを、styleに設定する NAIBU.PaintColor.prototype.setStyle = function() { try { - var tst = this.tar + var tst = this.tar; for (var i in this) { if ((typeof this[i]) === "string") { //string型以外は除く tst.style[i] = this[i]; @@ -1359,7 +1368,7 @@ td["text-anchor"] = "start"; NAIBU.PaintColor.apply(this,arguments); return this; -} +}; NAIBU.FontStyle.prototype = new NAIBU.PaintColor(false); //キャッシュ用 NAIBU.FontStyle.prototype.cache = {}; @@ -1377,12 +1386,12 @@ } } catch(e){stlog.add(e,1179);} return cache[id]; -} +}; //内部プロパティを、styleに設定する NAIBU.FontStyle.prototype.setStyle = function() { try { - var tst = this.tar + var tst = this.tar; for (var i in this) { var ti = this[i]; if ((typeof ti) === "string") { //string型以外は除く @@ -1396,7 +1405,7 @@ } } } catch(e) {stlog.add(e,1396); return "";} -} +}; NAIBU.FontStyle.prototype.fset = function( /*float*/ w, /*float*/ h, /*Matrix*/ matrix) { try{ this.setStyle(); @@ -1411,9 +1420,9 @@ this.writingMode = tts.writingMode; tts.marginTop = (this.writingMode === "tb-rl") ? "0px" : -parseFloat(tts.fontSize)+ "px"; tts.textIndent = "0px"; - tts.lineHeight = this.fontSize+ "px" + tts.lineHeight = this.fontSize+ "px"; } catch(e){stlog.add(e,1185);} -} +}; //NAIBU.transformToCTM transform属性を処理。Matrix型に変換 //あらかじめ正規表現オブジェクトを生成しておく @@ -1502,7 +1511,7 @@ } var s = new PList(F); return s; -} +}; //SVGMatrixを参照。行列 function Matrix(a,b,c,d,e,f) { //引数はすべてNumber型 @@ -1620,7 +1629,7 @@ var m = new Matrix(xr, 0, 0, yr, 0, 0); return m; } catch(e) {stlog.add(e,1031);} -} +}; //SVGRectを参照 function STRect(x,y,w,h) { //引数はすべてNumber型 @@ -1644,19 +1653,19 @@ s.D = plst.matrixTransform(matrix).list; plst = null; return s; -} +}; //2つの点から角度を算出 STArc.prototype.CVAngle = function starccvangle(ux,uy,vx,vy) { var rad = Math.atan2(vy, vx) - Math.atan2(uy, ux); return (rad >= 0) ? rad : 2 * Math.PI + rad; -} +}; //弧をベジェ曲線に変換 STArc.prototype.set = function starcset(x1,y1,rx,ry,psai,fA,fS,x4,y4) { - var fS = parseFloat(fS), rx = parseFloat(rx), ry = parseFloat(ry), psai = parseFloat(psai), x1 = parseFloat(x1), x4 = parseFloat(x4), y1 = parseFloat(y1), y4 = parseFloat(y4); + var fS = parseFloat(fS), rx = parseFloat(rx), ry = parseFloat(ry), psai = parseFloat(psai), x1 = parseFloat(x1), x4 = parseFloat(x4), y1 = parseFloat(y1), y4 = parseFloat(y4); if (rx === 0 || ry === 0) {throw "line";} rx = Math.abs(rx); ry = Math.abs(ry); var ccx = (x1 - x4) / 2, ccy = (y1 - y4) / 2; - var cpsi = Math.cos(psai*Math.PI/180), spsi = Math.sin(psai*Math.PI/180); + var cpsi = Math.cos(psai*Math.PI/180), spsi = Math.sin(psai*Math.PI/180); var x1d = cpsi*ccx + spsi*ccy, y1d = -1*spsi*ccx + cpsi*ccy; var x1dd = x1d * x1d, y1dd = y1d * y1d; var rxx = rx * rx, ryy = ry * ry; @@ -1675,8 +1684,8 @@ } var cxd = sds*rx*y1d / ry, cyd = -1 * sds*ry*x1d / rx; var cx = cpsi*cxd - spsi*cyd + (x1+x4)/2, cy = spsi*cxd + cpsi*cyd + (y1+y4)/2; - var s1 = this.CVAngle(1,0,(x1d-cxd)/rx,(y1d-cyd)/ry); - var dr = this.CVAngle((x1d-cxd)/rx,(y1d-cyd)/ry,(-x1d-cxd)/rx,(-y1d-cyd)/ry); + var s1 = this.CVAngle(1,0,(x1d-cxd)/rx, (y1d-cyd)/ry); + var dr = this.CVAngle((x1d-cxd)/rx, (y1d-cyd)/ry, (-x1d-cxd)/rx, (-y1d-cyd)/ry); if (!fS && dr > 0) { dr -= 2*Math.PI; } else if (fS && dr < 0) { @@ -1687,22 +1696,17 @@ var segr = dr / seg; var nea = []; var t = 8/3 * Math.sin(segr/4) * Math.sin(segr/4) / Math.sin(segr/2); - var cpsirx = cpsi * rx; - var cpsiry = cpsi * ry; - var spsirx = spsi * rx; - var spsiry = spsi * ry; + var cpsirx = cpsi * rx, cpsiry = cpsi * ry; + var spsirx = spsi * rx, spsiry = spsi * ry; var mc = Math.cos(s1); var ms = Math.sin(s1); - var x2 = x1 - t * (cpsirx * ms + spsiry * mc); - var y2 = y1 - t * (spsirx * ms - cpsiry * mc); + var x2 = x1 - t * (cpsirx * ms + spsiry * mc), y2 = y1 - t * (spsirx * ms - cpsiry * mc); for (var i = 0; i < seg; ++i) { s1 += segr; mc = Math.cos(s1); ms = Math.sin(s1); - var x3 = cpsirx * mc - spsiry * ms + cx; - var y3 = spsirx * mc + cpsiry * ms + cy; - var dx = -t * (cpsirx * ms + spsiry * mc); - var dy = -t * (spsirx * ms - cpsiry * mc); + var x3 = cpsirx * mc - spsiry * ms + cx, y3 = spsirx * mc + cpsiry * ms + cy; + var dx = -t * (cpsirx * ms + spsiry * mc), dy = -t * (spsirx * ms - cpsiry * mc); nea = nea.concat([x2, y2, x3 - dx, y3 - dy, x3, y3]); x2 = x3 + dx; y2 = y3 + dy; @@ -1710,14 +1714,14 @@ this.D = (this.D ? this.D.concat(nea) : nea); nea = null; return true; -} +}; //setをできるだけ繰り返す STArc.prototype.sset = function starcsset( /*float*/ nox, /*float*/ noy, /*array*/ f, /*float*/ rx, /*float*/ ry) { for (var i=1,fli=f.length;i<fli+1;i+=7){ this.set(nox,noy,f[i],f[i+1],f[i+2],f[i+3],f[i+4],f[i+5]+rx,f[i+6]+ry); nox = f[i+5]+rx; noy = f[i+6]+ry; } -} +}; //SVGLengthを参照 function STLength( /*string or number*/ d, /*float*/ wort, /*float*/ f) { @@ -1742,7 +1746,7 @@ d = wort = f = v = tani = ut = null; //解放 } catch(e) {stlog.add(e,1133); this.value = 1000;} return this; -} +}; STLength.prototype._dR = /\D+$/; //RegExpオブジェクトをあらかじめ生成 STLength.prototype._n = [1, 0.01, 1, 1, 1, 35.43307, 3.543307, 90, 1.25, 15]; //利用単位への変換値 STLength.prototype._tani = { //単位に番号を振る @@ -1755,7 +1759,7 @@ "ex": 4, "px": 5, "%": 2 -} +}; STLength.prototype.newValueSpecifiedUnits = function ( /*number*/ ut, /*number*/ value) { this.unitType = ut; this.value = value * this._n[ut-1]; @@ -1802,7 +1806,7 @@ this.href = null; } return this; -} +}; NAIBU.XLink.prototype.set = function() { try { if (this.href) { @@ -1836,8 +1840,165 @@ } } } catch(e) {stlog.add(e,17155);} -} +}; +function _ie_svgfont() { + try { + var tsrc = document.getElementsByTagName("FONTFACEURI"); + for (var i=0;i<tsrc.length;++i) { + var src = tsrc[i].getAttribute("xlink:href"), ids = src.substring(src.indexOf("#")+1, src.length); + getURL(src.replace(/#.+$/, ""), _ie_font, [ {id : ids, style:{}} ], 1); + } + } catch (e) {stlog.add(e,1847);} +}; +NAIBU.svgNameSpace = "http://www.w3.org/2000/svg"; +function _ie_font(data) { + if (data.success) { + //responsXMLはDTD処理を行う可能性があるため、ここでは使わない + var doc = new ActiveXObject("MSXML2.DomDocument"); + str = data.content.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->"); + doc.loadXML(str); + //getElementByIdは使えないので注意(DTDでの指定が必要) + var font = doc.getElementsByTagName("font").item(0); + var familyName = font.getElementsByTagName("font-face").item(0).getAttribute("font-family"); + if (familyName && font.getAttribute("id") === data.obj[0].id) { + var textElements = document.getElementsByTagName("div"); + for (var i=0,tli=textElements.length;i<tli;++i) { + var ti = textElements[i], ts = ti.style, tsff = (!!ts.fontFamily) ? ts.fontFamily : "serif"; + if (tsff.indexOf(familyName) > -1) { + NAIBU._ie_createFont(ti, font); + } + } + } + } +}; +NAIBU._ie_createFont = function(/*Element*/ ti, /*Element*/ font) { + var node = ti.firstChild, data, glyphs = font.getElementsByTagName("glyph"), em = parseFloat(font.getElementsByTagName("font-face").item(0).getAttribute("units-per-em") || 0); + var 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.style.left), fontSize = parseFloat(ti.style.fontSize), dy = parseFloat(ti.style.top) - fontSize * 0.25, fe = fontSize / em; //0.25はディセンダの調整をあらかじめしているため + while(node) { + data = node.data; + if (data !== void 0) { //dataがある場合 + var advanceX = [], glyphData = []; + for (var i=0,gli=glyphs.length;i<gli;++i) { + //indexは該当する文字が何番目にあるかの数字 + var index = data.indexOf(glyphs[i].getAttribute("unicode")); + if (index > -1) { + advanceX[index] = parseFloat(glyphs[i].getAttribute("horiz-adv-x") || advX); //字幅を収納 + glyphData[index] = glyphs[i].getAttribute("d"); + } + } + for (var i=0,adv=0;i<data.length;++i) { + if (advanceX[i] !== void 0) { //配列に含まれていれば + var path = document.createElement("v:shape"); + //advance、すなわち字幅の長さ分、ずらしていく + var x = dx + adv*fe; + 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))); + adv += advanceX[i]; + } + } + advanceX = glyphData = null; + } else { + NAIBU._ie_createFont(node, font); + } + node = node.nextSibling; + } + ti.style.visibility = "hidden"; +}; +//IE以外、Firefox用 +function _noie_svgfont() { + var obj = document.getElementsByTagName("object"); + for (var i=0;i<obj.length;++i) { + var s, obji = obj[i]; + 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(document); + } +}; +//font-face-uri要素に書かれたuriを手がかりに、Ajaxを使ってファイルを読み込む +NAIBU._fontSearchURI = function(doc){ + 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 : {}, docu : doc} ], 1); + } +}; +function _noie_font(data) { + if (data.success) { + 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 = data.obj[0].docu.getElementsByTagNameNS(NAIBU.svgNameSpace, "text"); + for (var i=0,tli=textElements.length;i<tli;++i) { + 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") || 0), fontSize = parseFloat(style.fontSize), dy = parseFloat(ti.getAttributeNS(null, "y") || 0), 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) { + //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 = ti.ownerDocument.createElementNS(NAIBU.svgNameSpace, "path"); + //advance、すなわち字幅の長さ分、ずらしていく + var x = dx + adv*fe; + 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))); + adv += advanceX[i]; + } + } + advanceX = glyphData = null; + } else { + NAIBU._noie_createFont(node, font); + } + node = node.nextSibling; + } + ti.style.opacity = "0"; +}; +NAIBU.pathData = function(/*string*/ data, /*Element*/ p, /*boolean*/ t, /*float*/ w, h, /*Matrix*/ matrix) { + //CTMでフォントを移動させておく + if (t) { //IEならば + var s = new STPath(p, matrix); + s.d = data; + s.set(w,h); + s = null; + } else { + p.setAttributeNS(null, "transform", "matrix(" +matrix.a+ "," +matrix.b+ "," +matrix.c+ "," +matrix.d+ "," +matrix.e+ "," +matrix.f+ ")"); + p.setAttributeNS(null, "d", data); + } + matrix = data = null; +}; + function utf16( /*string*/ s) { return unescape(s); } @@ -1940,7 +2101,9 @@ .replace(/<use\s/g, "<use /><v:group ") .replace(/\/use>/g, "/v:group>") .replace(/<defs(?=\s|>)/g, "<dn:defs") - .replace(/\/defs>/g, "/dn:defs>"); + .replace(/\/defs>/g, "/dn:defs>") + .replace(/<font-face-?/g, "<fontface") + .replace(/<\/font-face-?/g, "</fontface"); var ob = document.createElement("v:group"); var obst = ob.style; ob.innerHTML = dc; @@ -1977,7 +2140,7 @@ fn({success:true,content:xmlhttp.responseText,obj:ob,num:n}); xmlhttp = null; } - } + }; xmlhttp.send(null); } else { fn({success:false}); Property changes on: trunk/sie.js ___________________________________________________________________ Modified: svn:mergeinfo - /branches/04x/040/sie.js:812-829 /branches/04x/041/sie.js:891-923 /branches/04x/042/sie.js:927-967 /branches/04x/043/sie.js:969-1013 /branches/04x/044/sie.js:1015-1067 /branches/04x/045/sie.js:1069-1078 /branches/04x/046/sie.js:1080-1129 /branches/04x/047/sie.js:1131-1164 /branches/04x/048/sie.js:1166-1180 /branches/04x/sie.js:830-1181 /branches/05x/050/sie.js:1183-1201 /branches/05x/051/sie.js:1207-1323 /branches/05x/052/sie.js:1325-1352 /branches/05x/sie.js:1183-1355 + /branches/04x/040/sie.js:812-829 /branches/04x/041/sie.js:891-923 /branches/04x/042/sie.js:927-967 /branches/04x/043/sie.js:969-1013 /branches/04x/044/sie.js:1015-1067 /branches/04x/045/sie.js:1069-1078 /branches/04x/046/sie.js:1080-1129 /branches/04x/047/sie.js:1131-1164 /branches/04x/048/sie.js:1166-1180 /branches/04x/sie.js:830-1181 /branches/05x/050/sie.js:1183-1201 /branches/05x/051/sie.js:1207-1323 /branches/05x/052/sie.js:1325-1352 /branches/05x/053/sie.js:1354-1400 /branches/05x/sie.js:1183-1403