Platform SDK: DirectX

サーフェス特性の更新

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。

[C++]

既存サーフェスの特性を更新するには、IDirectDrawSurface7::SetSurfaceDesc メソッドを使う。このメソッドを使うと、DirectDrawSurface オブジェクトのサーフェス メモリのピクセル フォーマットや位置を、アプリケーションが明示的に割り当てたシステム メモリに変更できる。この機能により、サーフェスはコピーせずに、以前に割り当てたバッファのデータを使用できるようになる。新しいサーフェス メモリはクライアント アプリケーションで割り当てられる。この場合、クライアント アプリケーションでその割り当てを削除しなくてはならない。

IDirectDrawSurface7::SetSurfaceDesc メソッドを呼び出す場合、lpddsd パラメータは、新しいサーフェス メモリとそのメモリへのポインタを記述する DDSURFACEDESC2 構造体のアドレスとしなくてはならない。この構造体の中では、サーフェス メモリ、ディメンジョン、ピッチ、およびピクセル フォーマットの位置の有効メンバを反映する dwFlags メンバを設定できるだけである。したがって、dwFlags には、有効な構造体メンバを示すために設定する DDSD_WIDTH、DDSD_HEIGHT、DDSD_PITCH、DDSD_LPSURFACE、および DDSD_PIXELFORMAT フラグの組み合わせしか持てない。

構造体に値を設定する前に、サーフェスを保持するためのメモリを割り当てなくてはならない。このとき、割り当てるメモリのサイズが重要となる。サーフェスのや高さを適応するための十分なメモリを割り当てるだけでなく、QWORD (8 バイト) の倍数であるサーフェス ピッチの場所をとるためにも十分なものでなければならない。ピッチはピクセル単位ではなくバイト単位であることを思い出すこと。

構造体にサーフェスの値を設定する場合、lpSurface メンバは割り当てるメモリへのポインタであり、dwHeight および dwWidth メンバには、サーフェスのディメンジョンをピクセル単位で記述する。サーフェスのディメンジョンを指定するときは、サーフェス ピッチも反映させるために lPitch メンバを埋め込まなければならない。ピッチは QWORD の倍数でなくてはならない。同様に、ピッチを指定するときは、幅の値も指定する必要がある。最後に、ddpfPixelFormat メンバは、サーフェスのピクセル フォーマットを記述する。lpSurface メンバ以外でこれらのメンバに値を指定しないと、メソッドは現在のサーフェスから使用している値をデフォルトとして使う。

IDirectDrawSurface7::SetSurfaceDesc を使用する際に、注意すべき制限がある。その制限のいくつかは常識的なものである。たとえば、DDSURFACEDESC2 構造体の lpSurface メンバは、システム メモリへの有効なポインタでなくてはならない (現時点では、メソッドはビデオ メモリ ポインタをサポートしていない)。また、dwWidth および dwHeight メンバは、ゼロでない値でなくてはならない。最後に、プライマリ サーフェスや最初のフリッピング チェーンのサーフェスを再割り当てすることはできない。

複数の DirectDrawSurface オブジェクトに同一メモリを設定できる。しかし、サーフェス オブジェクトがメモリに割り当てられている間に、そのメモリの割り当てを削除しないよう注意する必要がある。

SetSurfaceDesc メソッドを正しく使用しないと、予測不可能な結果を生じる場合がある。DirectDrawSurface オブジェクトでは、このオブジェクトで割り当てていないサーフェス メモリの割り当ては削除しない。したがって、サーフェス メモリが必要でなくなった場合、プログラマが割り当てを削除する。ただし、SetSurfaceDesc が呼び出された場合、DirectDraw はサーフェスの作成時に暗に割り当てた元のサーフェス メモリを解放する。