囲みコラム

オフスクリーンと描画領域


リスト7.10とリスト7.12では、どちらもDraw()メソッドの中でDrawBitmap()を呼び出していますが、コピー元の矩型領域とコピー先の矩型領は、Draw()メソッドの引数をそのまま指定しています。つまり、スクリーン上のビューのサイズとオフスクリーンのサイズは、全く同じであるという前提があるのです。もちろん、BBitmapオブジェクトを生成する際に、ビットマップデータ領域、すなわちオフスクリーンのサイズをスクリーン上のビューサイズと全く同じにしていますから、それで問題ないように思えます。しかし、ウィンドウをリサイズしてスクリーン上のビューサイズが変化した場合、両者の間に食い違いが生じるはずです。

実際、"Clock Window"はリサイズ可能なので、スクリーン上のビューサイズが元のサイズより大きくなってしまう場合があります。その場合、再描画を行う領域がオフスクリーンをはみ出してしまうこともあるでしょう。たとえば、最初のビューサイズが幅150で高さ90だとして、それがリサイズによって拡げられ、幅150で高さ200になったとしましょう。その状態でもオフスクリーンのサイズは元のビューサイズと同じですから、y座標が90より大きい部分の領域は、オフスクリーンからはみ出している、つまりオフスクリーンの外側にあります。

オフスクリーンからはみ出している部分の再描画が必要になった場合、リスト7.10や7.12のソースコードでは、DrawBitmap()に渡すコピー元の矩型領域は、無効なものになってしまいます。したがって、本来であればDrawBitmap()メソッドを呼び出す前に再描画を行う領域がオフスクリーンからはみ出していないかチェックすべきなのです。しかし、DrawBitmap()メソッドに無効な領域を指定しても無視されますので、リスト7.10や7.12では省略しています。


Art of BeOS Programming
koga@stprec.co.jp