遮蔽の条件
以前に、遮蔽処理が行われるのは
「type==ltOpaque && opacity==255」
を満たす時であると述べたが、これはあくまで遮蔽処理の大前提となる条件であり
実際に遮蔽処理が行われるのはさらに限定的な状況だけである。
この条件については
「遮蔽する条件」
「遮蔽される条件」
「遮断を試行する条件」
の3つに分けて考えると考えやすい。
遮蔽する条件
以下の条件を全て満たす場合にレイヤーは遮蔽矩形を生成する。
・レイヤーとその親レイヤー全てが遮蔽有効条件
(レイヤーが可視であり、不透明であり、不透明時に透けない表示タイプである)を満たしている
・レイヤーが「type==ltOpaque && opacity==255」の条件を満たしている
より手前のレイヤーによって生成された遮蔽矩形が既にある場合は、
既存の遮蔽矩形と交差する矩形を新たな遮蔽矩形とする。
遮蔽される条件
以下の条件を全て満たす場合に
UpdateExcludeRect に遮蔽矩形が設定され、レイヤーは遮蔽される。
・より手前のレイヤーによって生成された遮蔽矩形がある
・レイヤーとその親レイヤー全てが遮蔽有効条件
(レイヤーが可視であり、不透明であり、不透明時に透けない表示タイプである)を満たしている
前回紹介したレイヤーが遮蔽されないようにするトリックは
この2つのめの条件を利用したものである。
遮断を試行する条件
上記2つの条件によって作成された UpdateExcludeRect の情報を元に描画を省くわけだが
その際にもさらに条件がある。
chached がtrueの時
・領域全体について遮断が試行される
chached がfalseの時
・可視の子レイヤーが1個以上あれば、
子レイヤーと重なる領域について遮断が試行される
・可視の子レイヤーがなければ遮断は行われない
・子レイヤーと重ならない領域については遮断は行われない
また遮断の試行において、実際に遮断が行われるのは
UpdateExcludeRect が描画矩形に縦方向にまたがっている場合だけである。
遮蔽処理の実装
遮蔽処理の動作は、主に次の3つの関数に実装されている。
LayerIntf.cpp
tTJSNI_BaseLayer::QueryUpdateExcludeRect
tTJSNI_BaseLayer::Draw
tTJSNI_BaseLayer::CopySelf
これらの条件がどのように実装されているかはそちらを参照されたし。
まとめ
それにしても
ややこしい!
こうして条件を確認してみると、いくつか妙な部分があることに気がつく。
そのあたりの考察についてはさらに次回へ続く!