S.F. Page

Programming,Music,etc...

STed2いじり(14) Direct2D化

すこしずつDirect2D化を進めている。 昨日は下記コードのDirect2D化について考えていた。

// public
void
CSTedScreenWin32::Paint(RECT *in_rect)
{
int x,y;
int w,h;
x = in_rect->left;
y = in_rect->top;
w = in_rect->right-x;
h = in_rect->bottom-y;
if (fOffScreenIsDirty) {
::BitBlt(fOffScreenDC, x,y,w,h, fGraphicsWindowDC[fCurrentGraphics], x,y, SRCCOPY);
::BitBlt(fOffScreenDC, x,y,w,h, fTextMaskDC, x,y, SRCPAINT);
::BitBlt(fOffScreenDC, x,y,w,h, fTextDC, x,y, SRCAND);
fOffScreenIsDirty = FALSE;
::SetRectEmpty(&fInvalidRect);
}
::BitBlt(fWindowDC, x,y,w,h, fOffScreenDC, x,y, SRCCOPY);
fCanUpdateWindow = TRUE;
}

これはWM_PAINTメッセージの処理で呼ばれるメソッドで処理内容としては

1.オフスクリーンのビットマップ3枚を重ねて一枚のオフスクリーンビットマップ(fOffScreenDC)に転送する。(グラフィック画面にテキスト画面を重ねあわせる処理)

2.fOffScreenDCを画面に転送する(ティアリングを回避するための処理)

Direct2Dはティアリングは回避されるため2.の処理は要らなくなる。 1.の処理はDirect2Dにおけるビットマップ描画メソッド、DrawBitmap()が描画の際、透明部分(αが0の部分)を描画しなければマスクビットマップおよびその転送処理は不要となる。 おそらくαを正しく処理するため、マスクビットマップは不要となるだろう。 DrawBitmap()については念のため検証してみることにする。