選択範囲を実装してみた
結局DirectXもGDI+もBitBlt以上に反転転送が早い処理はないのではないかと思えたので、GDIのBitBltで実装することになった。
まずManaged DirectXでBitBltを使う場合、デバイスからGetBackBufferでオフスクリーンサーフェイスを取得し、次にサーフェイスのGetGraphicsでGraphicsオブジェクトを取得、GraphicsオブジェクトからGetHdcでデバイスコンテキストを取得して、エクスポートしたBitBlt関数をコール、ReleaseHdcとReleaseGraphicsを忘れないようにすれば一応これでいける。
※GDIMagicianとかselectRectとかは気にしないように。
Surface sf = m_device.GetBackBuffer(0, 0); System.Drawing.Graphics g = sf.GetGraphics(); IntPtr hdc = g.GetHdc(); GDIMagician.BitBlt(hdc, selectRect[i].X, selectRect[i].Y, selectRect[i].Width, selectRect[i].Height, hdc, selectRect[i].X, selectRect[i].Y, GDIMagician.NOTSRCCOPY); } g.ReleaseHdc(); sf.ReleaseGraphics();
GetGraphicsを使うためにはデバイス初期化時のPresentParameters.PresentFlagにLockableBackBufferを指定しなければならない点に注意。こいつの副作用はあまり調べていないので使用は自己責任で。
画像を見てわかると思うが、以前の半透明スプライト版よりなんだかダサくなった気がする。
そう思いつつも選択領域の反転転送にこだわった理由はちと長くなるのでまた後日。