[Sie-announce] SIEコード [2221] IEにおけるSVG Fontの実装開始

Back to archive index

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;




Sie-announce メーリングリストの案内
Back to archive index