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;