svnno****@sourc*****
svnno****@sourc*****
2011年 2月 27日 (日) 23:04:42 JST
Revision: 2441 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2441 Author: dhrname Date: 2011-02-27 23:04:42 +0900 (Sun, 27 Feb 2011) Log Message: ----------- SVGElementのプロパティを整理 Modified Paths: -------------- branches/07x/072/org/w3c/dom/svg.js Modified: branches/07x/072/org/w3c/dom/svg.js =================================================================== --- branches/07x/072/org/w3c/dom/svg.js 2011-02-25 14:49:35 UTC (rev 2440) +++ branches/07x/072/org/w3c/dom/svg.js 2011-02-27 14:04:42 UTC (rev 2441) @@ -132,18 +132,11 @@ */ function SVGElement() { Element.call(this); - /*String*/ this.id = null; //id属性の値 - /*String*/ this.xmlbase = null; //xml:base属性の値 - /*SVGSVGElement*/ this.ownerSVGElement; //ルート要素であるsvg要素 - /*readonly SVGElement*/ this.viewportElement; //ビューポートを形成する要素(多くはsvg要素) SVGStylable.call(this); //ElementCSSInlineStyleのインタフェースを継承 - /*readonly attribute SVGElement*/ this.nearestViewportElement = null; - /*readonly attribute SVGElement*/ this.farthestViewportElement = null; /*interface SVGTransformable : SVGLocatable *TransformListはtransform属性を行列で表現したあとのリスト構造 */ /*readonly attribute SVGAnimatedTransformList*/ this.transform = new SVGAnimatedTransformList(); - this._cacheMatrix = null; //描画の際、SVGStylabaleで指定しておいたプロパティの処理をする this.addEventListener("DOMAttrModified", function(evt){ if (evt.eventPhase === Event.BUBBLING_PHASE) { @@ -293,86 +286,100 @@ SVGElement.constructor = Element; SVGElement.prototype = new Element(); -SVGElement.prototype._degReg = /[\-\d\.e]+/g; -SVGElement.prototype._comaReg = /[A-Za-z]+(?=\s*\()/g; -SVGElement.prototype._strReg = /\([^\)]+\)/g; -SVGElement.prototype._syouReg = /^[^a-z\-]+/; -SVGElement.prototype._conReg = /\:\s+/g; -SVGElement.prototype._bouReg = /\s*;[^a-z\-]*/g; -SVGElement.prototype._NaNReg = /\D+$/; - -/*interface SVGLocatable*/ -/*SVGRect*/ SVGElement.prototype.getBBox = function(){ - var s = new SVGRect(); - var data = this._tar.path.value, vi = this.ownerDocument.documentElement.viewport; - var el = vi.width, et = vi.height, er = 0, eb = 0; - /*要素の境界領域を求める(四隅の座標を求める) - *etは境界領域の上からビューポート(例えばsvg要素)の上端までの距離であり、ebは境界領域の下からビューポートの下端までの距離 - *elは境界領域の左からビューポートの左端までの距離であり、erは境界領域の右からビューポートの右端までの距離 +(function(){ + /*以下の正規表現は属性のパーサの際に用いる*/ + this._degReg = /[\-\d\.e]+/g; + this._comaReg = /[A-Za-z]+(?=\s*\()/g; + this._strReg = /\([^\)]+\)/g; + this._syouReg = /^[^a-z\-]+/; + this._conReg = /\:\s+/g; + this._bouReg = /\s*;[^a-z\-]*/g; + this._NaNReg = /\D+$/; + /*_cacheMatrixプロパティはSVGMatrixのキャッシュとして、 + *getCTMメソッドで使う */ - var degis = data.match(/[0-9\-]+/g); - for (var i=0,degisli=degis.length;i<degisli;i+=2) { - var nx = +(degis[i]), ny = +(degis[i+1]); - el = el > nx ? nx : el; - et = et > ny ? ny : et; - er = er > nx ? er : nx; - eb = eb > ny ? eb : ny; - nx = ny = null; - } - data = degis = null; - s.x = el; - s.y = et; - s.width = er - el; - s.height = eb - et; - el = et = er = eb = vi = null; - return s; -}; + this._cacheMatrix = null; -/*getCTMメソッド - *CTMとは現在の利用座標系に対する変換行列 - *注意点として、SVG1.1とSVG Tiny1.2では内容が異なる。たとえば、 - *1.2ではgetCTMが言及されていない - *もし、要素の中心座標を取得したい人がいれば、transformプロパティのconsolidateメソッドを使うこと - */ -/*SVGMatrix*/ SVGElement.prototype.getCTM = function() { - var s; - if (!!this._cacheMatrix) { //キャッシュがあれば - s = this._cacheMatrix; - } else { - var m = this.transform.baseVal.consolidate(); - if (m) { - m = m.matrix; - } else { - m = this.ownerDocument.documentElement.createSVGMatrix(); + /*String*/ this.id = null; //id属性の値 + /*String*/ this.xmlbase = null; //xml:base属性の値 + /*SVGSVGElement*/ this.ownerSVGElement; //ルート要素であるsvg要素 + /*readonly SVGElement*/ this.viewportElement; //ビューポートを形成する要素(多くはsvg要素) + /*readonly attribute SVGElement*/ this.nearestViewportElement = null; + /*readonly attribute SVGElement*/ this.farthestViewportElement = null; + + /*interface SVGLocatable*/ + /*SVGRect*/ this.getBBox = function(){ + var s = new SVGRect(); + var data = this._tar.path.value, vi = this.ownerDocument.documentElement.viewport; + var el = vi.width, et = vi.height, er = 0, eb = 0; + /*要素の境界領域を求める(四隅の座標を求める) + *etは境界領域の上からビューポート(例えばsvg要素)の上端までの距離であり、ebは境界領域の下からビューポートの下端までの距離 + *elは境界領域の左からビューポートの左端までの距離であり、erは境界領域の右からビューポートの右端までの距離 + */ + var degis = data.match(/[0-9\-]+/g); + for (var i=0,degisli=degis.length;i<degisli;i+=2) { + var nx = +(degis[i]), ny = +(degis[i+1]); + el = el > nx ? nx : el; + et = et > ny ? ny : et; + er = er > nx ? er : nx; + eb = eb > ny ? eb : ny; + nx = ny = null; } - if (this.parentNode && !!this.parentNode.getCTM) { - s = this.parentNode.getCTM().multiply(m); + data = degis = null; + s.x = el; + s.y = et; + s.width = er - el; + s.height = eb - et; + el = et = er = eb = vi = null; + return s; + }; + + /*getCTMメソッド + *CTMとは現在の利用座標系に対する変換行列 + *注意点として、SVG1.1とSVG Tiny1.2では内容が異なる。たとえば、 + *1.2ではgetCTMが言及されていない + *もし、要素の中心座標を取得したい人がいれば、transformプロパティのconsolidateメソッドを使うこと + */ + /*SVGMatrix*/ this.getCTM = function() { + var s; + if (!!this._cacheMatrix) { //キャッシュがあれば + s = this._cacheMatrix; } else { - s = m; + var m = this.transform.baseVal.consolidate(); + if (m) { + m = m.matrix; + } else { + m = this.ownerDocument.documentElement.createSVGMatrix(); + } + if (this.parentNode && !!this.parentNode.getCTM) { + s = this.parentNode.getCTM().multiply(m); + } else { + s = m; + } + m = null; + this._cacheMatrix = s; //キャッシュをためて次回で使う } - m = null; - this._cacheMatrix = s; //キャッシュをためて次回で使う - } - return s; -}; + return s; + }; -/*SVGMatrix*/ SVGElement.prototype.getScreenCTM = function(){ - if (!this.parentNode) { - return null; - } - var view = this.nearestViewportElement || this.ownerDocument.documentElement; - var s = view.getScreenCTM().multiply(this.getCTM()); - return s; -}; + /*SVGMatrix*/ this.getScreenCTM = function(){ + if (!this.parentNode) { + return null; + } + var view = this.nearestViewportElement || this.ownerDocument.documentElement; + var s = view.getScreenCTM().multiply(this.getCTM()); + return s; + }; -/*getTransformToElementメソッド - *これは、あるelementへの変換行列を計算して返す - *たとえばある要素から別の要素への引越しをする際の変換行列を算出することが可能 - */ -/*SVGMatrix*/ SVGElement.prototype.getTransformToElement = function(/*SVGElement*/ element ){ - var s = this.getScreenCTM().inverse().multiply(element.getScreenCTM()); - return s; -}; + /*getTransformToElementメソッド + *これは、あるelementへの変換行列を計算して返す + *たとえばある要素から別の要素への引越しをする際の変換行列を算出することが可能 + */ + /*SVGMatrix*/ this.getTransformToElement = function(/*SVGElement*/ element ){ + var s = this.getScreenCTM().inverse().multiply(element.getScreenCTM()); + return s; + }; +}).apply(SVGElement.prototype); function SVGAnimatedBoolean() { /*boolean*/ this.animVal = this.baseVal = true;