+
+ //0 ~ 360の範囲に収める.
+ function X_Node_CSS_ieMathRangeFix( a ){
+ a %= 360;
+ return a < 0 ? 360 + a : a;
+ };
+
+/*
+ * http://p2b.jp/200912-CSS3-Transform-for-IE8
+ * http://rtilabs.rti-giken.jp/files/2011_09_16/rotate.html
+ */
+ function X_Node_CSS_IETransform( elm, params ){
+ var PI_180 = Math.PI / 180,
+
+ rotate = X_Node_CSS_ieMathRangeFix( params[ 2 ] ),//回転
+ radian = rotate * PI_180,
+ cosX = Math.cos( radian ),
+ sinY = Math.sin( radian ),
+
+ skewX = X_Node_CSS_ieMathRangeFix( params[ 3 ] ), //skew
+ skewY = X_Node_CSS_ieMathRangeFix( params[ 4 ] );
+
+ _skX = Math.tan( skewX * PI_180 ),
+ _skY = Math.tan( skewY * PI_180 ),
+
+ scaleX = params[ 5 ], //拡大
+ scaleY = params[ 6 ],
+
+ m11 = cosX * scaleX,
+ m12 = ( -sinY + _skX ) * scaleX,
+ m21 = ( sinY + _skY ) * scaleY,
+ m22 = cosX * scaleY,
+
+ //absolute時には軸を補正してあげないとだめだ。
+ //ブラウザとして軸がずれている。
+ //計算式元ネタ http://p2b.jp/200912-CSS3-Transform-for-IE8
+
+ //offset*系のサイズは回転によって生じたゆがみも考慮されるらしい。
+
+ //拡大縮小も同じ.
+ //this.get(0).style.width や height には拡縮の影響を受けない元の数字が入っている
+ ow = elm.offsetWidth,
+ oh = elm.offsetHeight,
+
+ absCosX = Math.abs( cosX ),
+ absSinY = Math.abs( sinY ),
+
+ //回転の補正
+ dx = ( ow - ( ow * absCosX + oh * absSinY ) ) / 2
+ //skewの補正(rotate しながらskew すると補正がおかしくなります。 これがわからない)
+ - ow / 2 * _skX
+ //拡大の補正
+ - ( ( ow * scaleX - ow ) / 2 | 0 )
+ // x
+ + params[ 0 ],
+ dy = ( oh - ( ow * absSinY + oh * absCosX ) ) / 2
+ //skewの補正(
+ - oh / 2 * _skY
+ //拡大の補正
+ - ( ( oh * scaleY - oh ) / 2 | 0 )
+ // y
+ + params[ 1 ];
+
+ //console.log( ow + ' ' + oh )
+ elm.style.left = dx + 'px';
+ elm.style.top = dy + 'px';
+
+ //フィルターで回転と拡大縮小を加えます。
+ return 'progid:DXImageTransform.Microsoft.Matrix(' +
+ // 'Dx=' + dx +
+ //',Dy=' + dy +
+ 'M11=' + m11 +
+ ',M12=' + m12 +
+ ',M21=' + m21 +
+ ',M22=' + m22 +
+ ',FilterType="bilinear",sizingMethod="auto expand")';
+ };
+
+function X_Node_CSS_onAfterUpdateIEFilterFix( that ){
+ var PI_180 = Math.PI / 180,
+ test = X_Node_CSS_FILTER_FIX_PROPS,
+ css = that[ '_css' ],
+ elm = that[ '_rawObject' ],
+ filter = elm.style.filter || '',
+ origin = filter,
+ p, v, plus;
+
+ for( p in css ){
+ if( !( id = test[ p ] ) ) continue;
+ plus = 0;
+ switch( id ){
+ case 7 : // dxtransform
+ plus = X_Node_CSS_IETransform( elm, css[ p ] );
+ break;
+ default :
+ continue;
+ };
+ if( plus ) filter += ( filter ? ' ' : '' ) + plus;
+ };
+ if( filter !== origin ) elm.style.filter = filter;
+};
+
+