svnno****@sourc*****
svnno****@sourc*****
2010年 3月 6日 (土) 20:49:26 JST
Revision: 1703
http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1703
Author: dhrname
Date: 2010-03-06 20:49:26 +0900 (Sat, 06 Mar 2010)
Log Message:
-----------
transform属性の実装
Modified Paths:
--------------
branches/ufltima/dom/svg.js
Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js 2010-03-06 11:08:24 UTC (rev 1702)
+++ branches/ufltima/dom/svg.js 2010-03-06 11:49:26 UTC (rev 1703)
@@ -964,7 +964,53 @@
if (!!CSS2Properties[name] || name.indexOf("-") > -1) {
tar._attributeStyle.setProperty(name, evt.newValue, "");
} else if (evt.relatedNode.localName === "id") { //xml:idあるいはid属性ならば
- } else if (name === "transform") {
+ tar.id = evt.newValue;
+ } else if (name === "transform" && !!evt.transform) {
+ var tft = evt.newValue, degR = /[\-\d\.e]+/g, _parseFloat = parseFloat;
+ var coma = tft.match(/[A-Za-z]+(?=\s*\()/g); //コマンド文字にマッチ translate
+ var list = tft.match(/\([^\)]+\)/g); //カッコ内のリストにマッチ (10 20 30...)
+ var a,b,c,d,e,f,lis,deg,rad,degli;
+ for (var j=0,cli=coma.length;j<cli;j++) {
+ var s = evt.currentTarget.createSVGTransform();
+ lis = list[j], com = coma[j];
+ deg = lis.match(degR);
+ degli = deg.length;
+ if (degli === 6) {
+ var cm = s.matrix;
+ cm.a = _parseFloat(deg[0]);
+ cm.b = _parseFloat(deg[1]);
+ cm.c = _parseFloat(deg[2]);
+ cm.d = _parseFloat(deg[3]);
+ cm.e = _parseFloat(deg[4]);
+ cm.f = _parseFloat(deg[5]);
+ } else {
+ if (degli === 3) {
+ var degz = _parseFloat(deg[0]);
+ s.setRotate(degz, _parseFloat(deg[1]), _parseFloat(degi[2]))
+ } else if (degli <= 2) {
+ switch (com) {
+ case "translate":
+ s.setTranslate(degz)
+ break;
+ case "scale":
+ s.setScale(degz, _parseFloat(deg[1] || deg[0]));
+ break;
+ case "rotate":
+ s.setRotate(degz);
+ break;
+ case "skewX":
+ s.setSkewX(degz);
+ break;
+ case "skewY":
+ s.setSkewY(degz);
+ break;
+ }
+ }
+ }
+ tar.transform.appendItem(s);
+ lis = com = deg = rad = null;
+ }
+ list = coma = mat = null;
} else if (name === "style") {
tar.style.cssText = evt.newValue;
} else if (name === "class") {
@@ -1004,7 +1050,7 @@
return s;
};
/*SVGMatrix*/ SVGSVGElement.prototype.createSVGMatrix = function(){
- var s = new SVGMatrix(1,0,0,1,0,0); //単位行列を作成
+ var s = new SVGMatrix(); //単位行列を作成
return s;
};
/*SVGRect*/ SVGSVGElement.prototype.createSVGRect = function(){
@@ -1183,8 +1229,8 @@
};
SVGPoint.prototype.matrixTransform = function(/*SVGMatrix*/ matrix ) {
//整数にしているのは、VMLの設計上、小数点を扱えないときがあるため
- var x = parseInt(matrix.a * this.x + matrix.c * this.y + matrix.e);
- var y = parseInt(matrix.b * this.x + matrix.d * this.y + matrix.f);
+ var x = parseInt(matrix.a * this.x + matrix.c * this.y + matrix.e, 10);
+ var y = parseInt(matrix.b * this.x + matrix.d * this.y + matrix.f, 10);
if (-1 < x && x < 1) {x=1;}
if (-1 < y && y < 1) {y=1;}
var s = new SVGPoint();
@@ -1201,26 +1247,7 @@
for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
SVGPointList.prototype[prop] = SVGStringList.prototype[prop];
}
-//以下は独自の実装。リストを一度に処理できる
-SVGPointList.prototype._matrixTransform = function ( /*Matrix*/ ttm) {
- var F = this._list;
- for (var i = 0, Fli = F.length; i < Fli;) {
- if (isNaN(F[i])) { //コマンド文字は読み飛ばす
- ++i;
- continue;
- }
- var p = new SVGPoint();
- p.x = parseFloat(F[i]);
- p.y = parseFloat(F[i+1]);
- var pmt = p.matrixTransform(ttm);
- F[i++] = pmt.x;
- F[i++] = pmt.y;
- p = pmt = null;
- }
- var s = new SVGPointList();
- s._list = F;
- return s;
-}
+
/*SVGMatrix
*行列をあらわすオブジェクト。写像に用いる。以下のように表現できる
*[a c e]
@@ -1363,30 +1390,30 @@
SVGTransform.prototype = {
/*void*/ setMatrix : function(/*SVGMatrix*/ matrix ) {
this.type = SVGTransform.SVG_TRANSFORM_MATRIX;
- this.matrix.multiply(matrix);
+ this.matrix = this.matrix.multiply(matrix);
},
/*void*/ setTranslate : function(/*float*/ tx, /*float*/ ty ) {
this.type = SVGTransform.SVG_TRANSFORM_TRANSLATE;
- this.matrix.translate(tx, ty);
+ this.matrix = this.matrix.translate(tx, ty);
},
/*void*/ setScale : function(/*float*/ sx, /*float*/ sy ) {
this.type = SVGTransform.SVG_TRANSFORM_SCALE;
- this.matrix.scaleNonUniform(sx, sy);
+ this.matrix = this.matrix.scaleNonUniform(sx, sy);
},
/*void*/ setRotate : function(/*float*/ angle, /*float*/ cx, /*float*/ cy ) {
this.angle = angle;
this.type = SVGTransform.SVG_TRANSFORM_ROTATE;
- this.matrix.translate(cx, cy).rotate(angle).translate(-cx, -cy);
+ this.matrix = this.matrix.translate(cx, cy).rotate(angle).translate(-cx, -cy);
},
/*void*/ setSkewX : function(/*float*/ angle ) {
this.angle = angle;
this.type = SVGTransform.SVG_TRANSFORM_SKEWX;
- this.matrix.skewX(angle);
+ this.matrix = this.matrix.skewX(angle);
},
/*void*/ setSkewY : function(/*float*/ angle ) {
this.angle = angle;
this.type = SVGTransform.SVG_TRANSFORM_SKEWY;
- this.matrix.skewY(angle);
+ this.matrix = this.matrix.skewY(angle);
}
};