svnno****@sourc*****
svnno****@sourc*****
2010年 12月 24日 (金) 23:24:11 JST
Revision: 2243
http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2243
Author: dhrname
Date: 2010-12-24 23:24:11 +0900 (Fri, 24 Dec 2010)
Log Message:
-----------
0.66統合
Modified Paths:
--------------
trunk/sie.js
Property Changed:
----------------
trunk/sie.js
Modified: trunk/sie.js
===================================================================
--- trunk/sie.js 2010-12-24 14:09:16 UTC (rev 2242)
+++ trunk/sie.js 2010-12-24 14:24:11 UTC (rev 2243)
@@ -1,4 +1,4 @@
-/*SIE-SVG without Plugin under LGPL2.1 & GPL2.0 & Mozilla Public Lisence
+/*SIE-SVG without Plugin under LGPL2.1 & GPL2.0 & Mozilla Public Lisence
*公式ページは http://sie.sourceforge.jp/
*利用方法は <script defer="defer" type="text/javascript" src="sie.js"></script>
*http://sie.sourceforge.jp/
@@ -28,7 +28,7 @@
* respective copyright-holders):
* layout/svg/renderer/src/libart/nsSVGLibartBPathBuilder.cpp
*
- * Contributor(s):DHRNAME revulo
+ * Contributor(s):DHRNAME revulo bellbind
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
@@ -82,17 +82,17 @@
this.code = n;
var s = [
"", //数合わせのため
- "Index Size Error (入力値が大きすぎるか、マイナスの値ではありませんか)",
- "DOMString Size Error (テキストの指定範囲が文字数を超えていませんか)",
- "Hierarchy Request Error (先祖ノードを子ノードとして付け加えることができないようです)",
- "Wrong Document Error (ノードがどこのドキュメントノードに属しているかお確かめください)",
- "Invalid Character Error (入力された文字列に認識できない記号を使っているか、文字列が空ではないでしょうか)",
+ "Index Size Error",
+ "DOMString Size Error",
+ "Hierarchy Request Error",
+ "Wrong Document Error",
+ "Invalid Character Error",
"No Data Allowed Error",
"No Modification Allowed Error",
- "Not Found Error (お探しになっているノードが見つかりませんでした)",
+ "Not Found Error",
"Not Supported Error",
- "Inuse Attribute Error (その属性ノードはすでに他の要素へ属していないでしょうか)",
- "Invalid State Error (仕様や注意事項をよくお読みの上、正しくお使いください)",
+ "Inuse Attribute Error",
+ "Invalid State Error",
"Syntax Error",
"Invalid Modification Error",
"Namespace Error",
@@ -2488,11 +2488,11 @@
function SVGException(code) {
/*unsigned short*/ this.code = code;
if (this.code === SVGException.SVG_WRONG_TYPE_ERR) {
- this.message = "SVG Wrong Type Error (SVGの型が一致しないのではないでしょうか)";
+ this.message = "SVG Wrong Type Error";
} else if (this.code === SVGException.SVG_INVALID_VALUE_ERR) {
- this.message = "SVG Invalid Value Error (SVGに認識できない数値が使われていませんか)";
+ this.message = "SVG Invalid Value Error";
} else if (this.code === SVGException.SVG_MATRIX_NOT_INVERTABLE) {
- this.message = "SVG Matrix Not Invertable (SVGで指定された逆行列ができるかどうかお確かめください)";
+ this.message = "SVG Matrix Not Invertable";
}
return this;
};
@@ -2528,7 +2528,6 @@
var name = evt.attrName, tar = evt.target;
if (!!CSS2Properties[name] || name.indexOf("-") > -1) { //スタイルシートのプロパティならば
tar._attributeStyle.setProperty(name, evt.newValue, "");
- tar._currentStyle = null; //キャッシュは消しておく
}
if (evt.relatedNode.localName === "id") { //xml:idあるいはid属性ならば
tar.id = evt.newValue;
@@ -2592,7 +2591,6 @@
}
a = sc = null;
}
- tar._currentStyle = null;
} else if (name === "class") {
tar.className = evt.newValue;
} else if (name.indexOf("on") === 0) { //event属性ならば
@@ -2821,11 +2819,12 @@
throw (new DOMException(DOMException.INDEX_SIZE_ERR));
} else {
this._list.splice(index, 1);
+ --this.numberOfItems;
}
return newItem;
},
/*DOMString*/ appendItem : function(/*DOMString*/ newItem ){
- this._list[this._list.length] = newItem;
+ this._list[this.numberOfItems] = newItem;
++this.numberOfItems;
}
};
@@ -3349,12 +3348,11 @@
var doc = new ActiveXObject("MSXML2.DomDocument");
str = xmlhttp.responseText.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->");
doc.loadXML(str);
+ var ele = doc.documentElement;
+ tar._instance = tar.ownerDocument.importNode(ele, true);
if (id) {
- var ele = doc.getElementById(id);
- } else {
- var ele = doc.documentElement;
+ tar._instance = tar._instance.ownerDocument.getElementById(id);
}
- tar._instance = tar.ownerDocument.importNode(ele);
} else {
tar._text = xmlhttp.responseText;
}
@@ -3368,7 +3366,8 @@
/*IEのメモリリーク対策として、空関数を入力*/
xmlhttp.onreadystatechange = NAIBU.emptyFunction;
}
- }
+ };
+ xmlhttp.send(null);
}
}
}
@@ -3973,7 +3972,7 @@
dcp.coordsize = tview.width+ " " +tview.height;
sp.appendChild(dcp);
objei.parentNode.insertBefore(sp, objei);
- dcp.appendChild(sdt)
+ dcp.appendChild(sdt);
while (fi) { //子ノードを検索して、子供がいれば、importNodeメソッドを再帰的に実行する
n = s.importNode(fi, true);
tar.appendChild(n);
@@ -5048,6 +5047,7 @@
tar._tar.path = dat.join(" ");
tar._tar.coordsize = w + " " + h;
NAIBU._setPaint(tar, matrix);
+ delete tar._cacheMatrix, tar._currentStyle;
evt = tar = dat = w = h = matrix = tlist = x = y = _parseInt = ma = mb = mc = md = me = mf = vi = isZ = isM = isL = isC = null;
}, false);
evt = tar = null;
@@ -5409,6 +5409,7 @@
ele.path = dat;
ele.coordsize = w + " " + h;
NAIBU._setPaint(tar, ctm);
+ delete tar._cacheMatrix, tar._currentStyle;
evt = tar = list = dat = ele = vi = null;
}, false);
evt = tar = null;
@@ -5484,6 +5485,7 @@
ele.path = dat;
ele.coordsize = w + " " + h;
NAIBU._setPaint(tar, ctm);
+ delete tar._cacheMatrix, tar._currentStyle;
evt = tar = list = dat = ele = null;
}, false);
evt = tar = null;
@@ -5560,6 +5562,7 @@
ele.path = dat;
ele.coordsize = w + " " + h;
NAIBU._setPaint(tar, ctm);
+ delete tar._cacheMatrix, tar._currentStyle;
evt = ele = tar = dat = list = ctm = w = h = null;
}, false);
evt = tar = null;
@@ -5633,7 +5636,8 @@
ele.path = dat;
ele.coordsize = w + " " + h;
NAIBU._setPaint(tar, ctm);
- evt = ele = tar = dat = list = ctm = w = h = null;
+ delete tar._cacheMatrix, tar._currentStyle;
+ evt = ele = tar = dat = list = ctm = w = h = null;
}, false);
evt = tar = null;
}, false);
@@ -5714,6 +5718,7 @@
ele.path = dat;
ele.coordsize = w + " " + h;
NAIBU._setPaint(tar, ctm);
+ delete tar._cacheMatrix, tar._currentStyle;
evt = ele = tar = dat = list = ctm = w = h = null;
}, false);
evt = tar = null;
@@ -5795,6 +5800,7 @@
ele.path = dat;
ele.coordsize = w + " " + h;
NAIBU._setPaint(tar, ctm);
+ delete tar._cacheMatrix, tar._currentStyle;
evt = ele = tar = dat = list = ctm = w = h = null;
}, false);
evt = tar = null;
@@ -5823,6 +5829,7 @@
tar._tars = [];
var data = tar.data.replace(/^\s+/, "").replace(/\s+$/, "");
tar.data = data;
+ data = data.split('');
for (var i=0, tdli=data.length;i<tdli;++i) {
var d = document.createElement("div"), dstyle = d.style;
dstyle.position = "absolute";
@@ -5830,7 +5837,7 @@
dstyle.paddingTop = dstyle.paddingLeft = "0px";
dstyle.whiteSpace = "nowrap";
dstyle.textIndent = "0px";
- d.appendChild(document.createTextNode(data.charAt(i)));
+ d.appendChild(document.createTextNode(data[i]));
tar._tars[tar._tars.length] = d;
}
data = null;
@@ -6243,6 +6250,7 @@
backr.filled = "false";
ttp.appendChild(backr);
}
+ delete tar._cacheMatrix, tar._currentStyle;
isRect = evt = tar = style = null;
}, false);
evt = tar = null;
@@ -7552,11 +7560,34 @@
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);
+ /*_isExternalは外部から呼び出されたfont要素ならば、真(1)となる*/
+ /*boolean or number*/ this._isExternal = 0;
+ this.addEventListener("DOMNodeInserted", function(evt){
+ var tar = evt.target;
+ if (evt.eventPhase === Event.BUBBLING_PHASE) {
+ return;
+ }
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
+ var tar = evt.target, svgns = "http://www.w3.org/2000/svg", fontFace = tar.getElementsByTagNameNS(svgns, "font-face").item(0);
+ var nefunc = function(evt){
+ var svg = evt.target;
+ /*以下のtarはfont要素*/
+ var familyName = fontFace.getAttributeNS(null, "font-family");
+ var textElements = tar.ownerDocument.getElementsByTagNameNS(svgns, "text");
+ for (var i=0,_tar=tar,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, true);
+ }
+ }
+ evt = tar = svg = curt = textElments = svgns = _tar = null;
+ };
+ if (!fontFace.__isLinked || tar._isExternal) {
+ tar.ownerDocument.documentElement._svgload_limited = 0;
+ tar.ownerDocument.documentElement.addEventListener("SVGLoad", nefunc, false);
+ }
+ }, false);
+ }, false);
return this;
};
SVGFontElement.constructor = SVGElement;
@@ -7596,6 +7627,15 @@
function SVGFontFaceElement() {
SVGElement.apply(this);
+ /*boolean(or number)*/ this._isLinked = 0;
+ this.addEventListener("DOMNodeInserted", function(evt){
+ if (evt.eventPhase === Event.BUBBLING_PHASE) {
+ if (evt.target.localName === "font-face-uri") { //外部リンクがあれば
+ evt.currentTarget._isLinked = 1;
+ }
+ return; //強制終了させる
+ }
+ }, false);
return this;
};
SVGFontFaceElement.constructor = SVGElement;
@@ -7616,6 +7656,15 @@
}
evt.target.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");
}, false);
+ this.addEventListener("SVGLoad", function(evt){
+ var tar = evt.target, tpp = tar.parentNode.parentNode.parentNode;
+ if (tpp.localName === "defs") {
+ tpp = tar.parentNode.parentNode; //tppをfont-face要素としておく
+ }
+ tar._instance._isExternal = 1;
+ tpp.parentNode.appendChild(tar._instance);
+ evt = tar = tpp = null;
+ }, false);
SVGURIReference.apply(this);
return this;
};
@@ -7735,6 +7784,147 @@
pattern: SVGPatternElement
};
+NAIBU._fontSearchURI = function(evt){
+ var doc = evt.target.ownerDocument;
+ var tsrc = doc.getElementsByTagNameNS("http://www.w3.org/2000/svg", "font-face-uri");
+ for (var i=0;i<tsrc.length;++i) {
+ var src = tsrc[i].getAttributeNS("http://www.w3.org/1999/xlink", "href");
+ var ids = src.substring(src.indexOf("#")+1, src.length);
+ var xmlhttp = NAIBU.xmlhttp;
+ xmlhttp.open("GET", src.replace(/#.+$/, ""), true);
+ xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ xmlhttp.onreadystatechange = function() {
+ if ((xmlhttp.readyState === 4) && (xmlhttp.status === 200)) {
+ var doce = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml");
+ NAIBU._font({document:doce, docu:doc, id:ids});
+ xmlhttp = doc = doce = null;
+ }
+ };
+ xmlhttp.send(null);
+ }
+};
+/*_font関数は、SVGFontで使う*/
+NAIBU._font = function (data) {
+ var doc = data.document, svgns = "http://www.w3.org/2000/svg";
+ //getElementByIdは使えないので注意(DOMParserを使った場合、DTDでの指定が必要)
+ var font = doc.getElementsByTagNameNS(svgns, "font").item(0);
+ var familyName = font.getElementsByTagNameNS(svgns, "font-face").item(0).getAttributeNS(null, "font-family");
+ if (familyName && (font.getAttributeNS(null, "id") === data.id)) {
+ var textElements = data.docu.getElementsByTagNameNS(svgns, "text");
+ for (var i=0,tli=textElements.length;i<tli;++i) {
+ var ti = textElements[i], style = data.docu.defaultView.getComputedStyle(ti, '');
+ if (style.getPropertyValue("font-family", null).indexOf(familyName) > -1) {
+ NAIBU._noie_createFont(ti, font, false);
+ }
+ }
+ }
+ doc = data = null;
+};
+NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font, /*boolean*/ isMSIE) {
+ 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(svgns, "glyph");
+ var em = parseFloat(font.getElementsByTagNameNS(svgns, "font-face").item(0).getAttribute("units-per-em") || 1000);
+ var advX = parseFloat( (font.getAttributeNS(null, horizOrVert) || em) ); //字幅の設定
+ var dx = parseFloat(ti.getAttributeNS(null, "x") || 0), fontSize = parseFloat(style.getPropertyValue("font-size")), dy = parseFloat(ti.getAttributeNS(null, "y") || 0), fe = fontSize / em;
+ var ds = false, npdlist = ["fill",
+ "fill-opacity",
+ "stroke",
+ "stroke-width",
+ "stroke-linecap",
+ "stroke-linejoin",
+ "stroke-miterlimit",
+ "stroke-dasharray",
+ "stroke-opacity",
+ "opacity",
+ "cursor"];
+ if (isMSIE) {
+ /*IEのみ、font-sizeは自動で調整されているものを使った方がよい*/
+ fontSize = parseFloat(ti._tar.currentStyle.fontSize);
+ fe = fontSize / em;
+ }
+ if (/a/[-1] === 'a') { //Firefoxならば
+ ds = true;
+ } else if (isMSIE || isTategaki) {
+ ds = true;
+ }
+ if (ds){
+ while(node) {
+ data = node.data;
+ if (data !== void 0) { //dataがある場合
+ var advanceX = [], glyphData = [];
+ for (var i=0,gli=glyphs.length;i<gli;++i) {
+ var glyph = glyphs[i], unicode = glyph.getAttributeNS(null, "unicode") || "なし"; //unicode属性に指定がない場合、処理させないようにする
+ var orientation = glyph.getAttributeNS(null, "orientation"), isVert = true, isOrientationAttribute = true;
+ if (orientation) {
+ if (orientation === "h") {
+ isVert = false;
+ }
+ } else {
+ isOrientationAttribute = false;
+ }
+ if ( (isTategaki && isVert) || !(isTategaki || isVert) || !isOrientationAttribute){
+ //indexは該当する文字が何番目にあるかの数字
+ var index = data.indexOf(unicode);
+ while (index > -1) {
+ advanceX[index] = parseFloat(glyph.getAttributeNS(null, horizOrVert) || advX); //字幅を収納
+ glyphData[index] = glyph.getAttributeNS(null, "d");
+ index = data.indexOf(unicode, index+1);
+ }
+ }
+ }
+ for (var i=0,adv=0;i<data.length;++i) {
+ if (advanceX[i] !== void 0) { //配列に含まれていれば
+ var path = ti.ownerDocument.createElementNS(svgns, "path");
+ //advance、すなわち字幅の長さ分、ずらしていく
+ var matrix = ti.ownerDocument.documentElement.createSVGMatrix();
+ matrix.a = fe;
+ matrix.d = -fe;
+ for (var j=0;j<npdlist.length;++j){
+ 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;
+ if ("、。".indexOf(data.charAt(i)) > -1) { //句読点の場合
+ var fms = fontSize / Math.SQRT2;
+ x += fms;
+ y -= fms;
+ fms = null;
+ }
+ matrix.e = x;
+ matrix.f = y;
+ } else {
+ matrix.e = dx + adv*fe;
+ matrix.f = dy;
+ }
+ path.setAttributeNS(null, "transform", "matrix(" +matrix.a+ "," +matrix.b+ "," +matrix.c+ "," +matrix.d+ "," +matrix.e+ "," +matrix.f+ ")");
+ path.setAttributeNS(null, "d", glyphData[i]);
+ ti.parentNode.insertBefore(path, ti);
+ adv += advanceX[i];
+ matrix = null;
+ }
+ }
+ adv = advanceX = glyphData = null;
+ } else {
+ NAIBU._noie_createFont(node, font, isMSIE);
+ }
+ node = node.nextSibling;
+ }
+ if (isMSIE) {
+ var style = ti.ownerDocument.getOverrideStyle(ti, null);
+ style.setProperty("display", "none");
+ style = null;
+ } else {
+ ti.setAttributeNS(null, "opacity", "0");
+ }
+ }
+ data = isTategaki = horizOrVert = em = advX = dx = dy = fontSize = style = svgns = null;
+};
+
/*以下は、getComputedStyleメソッドで使うために、CSS2Propertiesの_listプロパティに、
*CSSprimitiveValueのリストを収納している。なお、その際に、writingModeなどはwriting-modeに変更している
*/
@@ -7773,16 +7963,17 @@
lis();
}
};
+
function unsvgtovml() {
try {
if ("stop" in NAIBU) {
clearInterval(NAIBU.stop);
}
- window.dettachEvent("onload", NAIBU._main);
window.onscroll = NAIBU.emptyFunction;
+ window.detachEvent("onload", NAIBU._main);
Element = SVGElement = Attr = NamedNodeMap = CSS2Properties = CSSValue = CSSPrimitiveValue = NAIBU.xmlhttp = Node = Event = NAIBU = stlog = STLog = document = null;
Array = ActiveXObject = null;
- } catch(e) {}
+ } catch(e) {console.log(e.message);}
}
/*_main関数
*一番最初に起動するべき関数
@@ -7861,8 +8052,8 @@
oba.setAttribute("id","_NAIBU_outline");
document.body.appendChild(oba);
var ob = document.getElementsByTagName("object"), em = document.getElementsByTagName("embed");
- var i = 0;
- for (s=[];i<ob.length;++i) {
+ var i = 0, s=[];
+ for (;i<ob.length;++i) {
s[s.length] = new GetSVGDocument(ob[i]);
}
for (i=0;i<em.length;++i) {
@@ -7878,6 +8069,16 @@
}
s = null;
}
+ } else {
+ var ob = document.getElementsByTagName("object");
+ for (var i=0;i<ob.length;++i) {
+ if (ob[i].contentDocument) {
+ NAIBU._fontSearchURI({target:{ownerDocument:ob[i].contentDocument}});
+ } else if (ob[i].getSVGDocument) {
+ ob[i].getSVGDocument().documentElement.addEventListener("SVGLoad", NAIBU._fontSearchURI, false);
+ } else {
+ }
+ }
}
xmlhttp = null;
});
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/053/sie.js:1354-1400
/branches/05x/054/sie.js:1403-1422
/branches/05x/055/sie.js:1424-1454
/branches/05x/056/sie.js:1456-1491
/branches/05x/057/sie.js:1496-1523
/branches/05x/058/sie.js:1526-1590
/branches/05x/sie.js:1183-1594
/branches/06x/060/sie.js:1603-1850
/branches/06x/sie.js:1599-2226
+ /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/054/sie.js:1403-1422
/branches/05x/055/sie.js:1424-1454
/branches/05x/056/sie.js:1456-1491
/branches/05x/057/sie.js:1496-1523
/branches/05x/058/sie.js:1526-1590
/branches/05x/sie.js:1183-1594
/branches/06x/060/sie.js:1603-1850
/branches/06x/sie.js:1599-2242