GPU_RESERVED : 2 << 21, // 2:GPU予約\r
GPU_NOW : 2 << 22, // 3:GPU now!\r
GPU_RELEASE_RESERVED : 2 << 23, // 4:GPU解除予約\r
+ GPU_CHILD : 2 << 24, \r
\r
IE4_HAS_TEXTNODE : X_UA.IE4 ? 2 << 21 : 0,\r
IE4_HAS_ELEMENT : X_UA.IE4 ? 2 << 22 : 0,\r
length : 1,\r
parent : null, // remove された枝も親子構造は維持している。\r
_xnodes : null, // Array.<Node>\r
+ _gpuParent : null,\r
\r
_tag : '',\r
_text : '',\r
};\r
};\r
\r
+function X_Node_toggleInGPUFlag( gpuRoot, xnodes, flag ){\r
+ var i = xnodes.length, xnode;\r
+\r
+ if( flag ){\r
+ for( ; i; ){\r
+ xnode = xnodes[ --i ];\r
+ if( !xnode._gpuParent ){\r
+ xnode._flags |= X_Node_State.GPU_CHILD;\r
+ xnode._gpuParent = gpuRoot;\r
+ xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag ); \r
+ };\r
+ };\r
+ } else {\r
+ for( ; i; ){\r
+ xnode = xnodes[ --i ];\r
+ if( xnode._gpuParent === gpuRoot ){\r
+ xnode._flags &= ~X_Node_State.GPU_CHILD;\r
+ delete xnode._gpuParent;\r
+ xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag );\r
+ };\r
+ };\r
+ };\r
+};\r
+\r
/* --------------------------------------\r
* Create\r
*/\r
function X_Node_destroy( isChild ){\r
var xnodes = this._xnodes, i, elm;\r
\r
- if( !this._flags ) return;\r
+ if( ( this._flags & X_Node_State.EXIST ) === 0 ) return;\r
\r
elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
\r
\r
if( this._flags & X_Node_State.IN_TREE ){\r
!isChild && this.remove();\r
- delete this._flags;\r
+ this._flags &= ~X_Node_State.EXIST;\r
} else {\r
this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
elm && !isChild && X_Node__actualRemove( this );\r
function X_Node_onBeforeKill( e ){\r
var xnodes = this._xnodes, i, elm;\r
\r
- if( !this._flags ) return X.Callback.NONE;\r
+ if( ( this._flags & X_Node_State.EXIST ) === 0 ) return X.Callback.NONE;\r
\r
elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
elm && this._listeners && this.unlisten(); // イベントの退避\r
if( e ){\r
this.remove();\r
if( X_Node_reserveRemoval[ X_Node_reserveRemoval.length - 1 ] === this ){\r
- delete this._flags;\r
+ this._flags &= ~X_Node_State.EXIST;\r
return X.Callback.PREVENT_DEFAULT; \r
}; \r
};\r
};\r
return this;\r
};\r
- if( !text ) return this.empty();\r
if( ( xnodes = this._xnodes ) && xnodes.length === 1 && !xnodes[ 0 ]._tag ){\r
xnodes[ 0 ].text( text );\r
return this;\r
};\r
+ // TODO 一つのtextnode を残すケース 完全に削除したい場合は empty()を使う\r
+ if( !text ) return this.empty(); \r
this.empty().createText( text );\r
return this;\r
};\r
xnode = removal[ --i ];\r
// TODO GPU レイヤーの子の場合、remove をスキップする。 非GPU レイヤーへ apppend される場合、clone する?\r
X_Node__actualRemove( xnode );\r
- !xnode._flags && xnode.kill();\r
+ ( xnode._flags & X_Node_State.EXIST ) === 0 && xnode.kill();\r
};\r
removal.length = 0;\r
};\r
\r
if( X_Node_documentFragment ){\r
//( frg = X_Node_documentFragment ).appendChild( elm );\r
+ // 連続する要素の差し替えの場合に有効\r
};\r
\r
if( X_Node_strictElmCreation ){\r
that._flags &= X_Node_BitMask_RESET_DIRTY;\r
// ie の string から要素を作る場合、ネットワーク系属性は onload イベントなどを拾うために、要素生成->イベント復帰後に適用する\r
- that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // Network 系の属性は遅らせて設定\r
+ that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // _newAttrs には ネットワーク系属性が入っている。Network 系の属性は遅らせて設定\r
that._flags |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。\r
} else {\r
elm.UID = that._uid;\r
X_Node__afterActualCreate( xnodes[ --i ] );\r
};\r
};\r
- // ã\83\8dã\83\83ã\83\88ã\82\8fã\83¼ã\81\86系属性と filter は要素生成後に適用\r
+ // ã\83\8dã\83\83ã\83\88ã\83¯ã\83¼ã\82¯系属性と filter は要素生成後に適用\r
if( that._flags & ( X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_IE_FILTER ) ){\r
X_Node__updateRawNode( that, that._rawObject || X_Node__ie4getRawNode( that ) );\r
} else {\r