Platform SDK: DirectX

クライアント メモリ サーフェスの作成

クライアント メモリ サーフェスは、簡単な DirectDrawSurface オブジェクトであり、イメージ データを保持するためにアプリケーションが以前に割り当てられたシステム メモリを使用する。このようなサーフェスを作成することは一般的ではないが、作成するのは簡単である。既存のメモリバッファ上の DirectDraw サーフェス機能を使う必要のあるアプリケーションでは役立つ。

[C++]

サーフェスの作成時に、DirectDraw ではサーフェスのピクセル フォーマットと同様に、サーフェスのディメンジョン (ピクセル単位) とサーフェスのピッチ (バイト単位) についての情報が必要となる。ただし、クライアント メモリに関するこの情報は、作成されるサーフェスを DirectDraw に伝えない他のタイプのサーフェスにおける作成とは異なり、既にサーフェスを作成していることを DirectDraw に伝える。IDirectDraw7::CreateSurface メソッドに渡す DDSURFACEDESC2 構造体に、割り当てられたバッファのメモリ アドレスを足す特性を設定できる。

クライアント メモリ サーフェスは、一般的なシステム メモリ サーフェスのように動作する。ただし例外として、DirectDraw は必要のなくなったサーフェス メモリを解放しようとはしない。メモリを割り当てられたクライアントの解放は、アプリケーションが行う。

次の例では、メモリを割り当てる場合について説明し、64 × 64 ピクセルの 24 ビット RGB サーフェスに対する DirectDrawSurface オブジェクトを作成する。

// この例では、g_lpDD4 が有効な IDirectDraw7 インターフェイス ポインタとなる。
 
#define WIDTH  64 // ピクセル単位。
#define HEIGHT 64
#define DEPTH  3  // バイト単位 (3 バイト ==24 ビット )。
 
    HRESULT hr;
    LPVOID  lpSurface  = NULL;
    HLOCAL  hMemHandle = NULL;
    DDSURFACEDESC2 ddsd2;
    LPDIRECTDRAWSURFACE7 lpDDS;
 
    // 64 × 64 のメモリを割り当てる (ピクセル バッファごとに 24 ビット)。
    // バッファが不要になると、アプリケーションにより
    //           このバッファが解放される。
    if (lpSurface = malloc((size_t)WIDTH*HEIGHT*DEPTH))
        ZeroMemory(lpSurface, (DWORD)WIDTH*HEIGHT*DEPTH);
    else
        return DDERR_OUTOFMEMORY;
 
    // サーフェスの記述を初期化する。
    ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2));
    ZeroMemory(&ddsd2.ddpfPixelFormat, sizeof(DDPIXELFORMAT));
    ddsd2.dwSize = sizeof(ddsd2);
    ddsd2.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_LPSURFACE |
                    DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_CAPS;
    ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
                           DDSCAPS_SYSTEMMEMORY;
    ddsd2.dwWidth = WIDTH;
    ddsd2.dwHeight= HEIGHT;
    ddsd2.lPitch  = (LONG)DEPTH * WIDTH;
    ddsd2.lpSurface = lpSurface;
 
    // ピクセル フォーマットを 24 ビット RGB (8-8-8) にセット アップする。
    ddsd2.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
    ddsd2.ddpfPixelFormat.dwFlags= DDPF_RGB;
    ddsd2.ddpfPixelFormat.dwRGBBitCount = (DWORD)DEPTH*8;
    ddsd2.ddpfPixelFormat.dwRBitMask    = 0x00FF0000;
    ddsd2.ddpfPixelFormat.dwGBitMask    = 0x0000FF00;
    ddsd2.ddpfPixelFormat.dwBBitMask    = 0x000000FF;
 
    // サーフェスを作成する。
    hr = g_lpDD->CreateSurface(&ddsd2, &lpDDS, NULL);
    return hr;
[Visual Basic]

サーフェスの作成時に、DirectDraw ではサーフェスのピクセル フォーマットと同様に、サーフェスのディメンジョン (ピクセル単位) とサーフェスのピッチ (バイト単位) についての情報が必要となる。ただし、クライアント メモリに関するこの情報は、作成されるサーフェスを DirectDraw に伝えない他のタイプのサーフェスにおける作成とは異なり、既にサーフェスを作成していることを DirectDraw に伝える。DirectDraw7.CreateSurface メソッドに渡す DDSURFACEDESC2 型に、割り当てられたバッファのメモリ アドレスを足す特性を設定できる。

クライアント メモリ サーフェスは、一般的なシステム メモリ サーフェスのように動作する。ただし例外として、DirectDraw は必要のなくなったサーフェス メモリを解放しようとはしない。メモリを割り当てられたクライアントの解放は、アプリケーションが行う。

次の例では、メモリを割り当てる場合について説明し、64 × 64 ピクセルの 24 ビット RGB サーフェスに対する DirectDrawSurface を作成する。

'この例では、dd が有効な DirectDraw7 オブジェクトとなる。

Const cWIDTH = 64 'ピクセル単位
Const cHEIGHT = 64
Const cDEPTH = 3 'バイト単位 (3 バイト = 24 ビット)

Dim ddsd2 As DDSURFACEDESC2
Dim dds As DirectDrawSurface7
Private Sub Form_Load()
    
' サーフェスの記述を初期化する。
With ddsd2
.lFlags = DDSD_WIDTH Or DDSD_HEIGHT Or DDSD_PITCH Or DDSD_PIXELFORMAT Or DDSD_CAPS
.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY
.lWidth = cWIDTH
.lHeight = cHEIGHT
.lPitch = cDEPTH * cWIDTH
' ピクセル フォーマットを 24 ビット RGB (8-8-8) にセット アップする。
With .ddpfPixelFormat
.lFlags = DDPF_RGB
.lRGBBitCount = cDEPTH * 8
.lRBitMask = &HFF0000
.lGBitMask = &HFF00&
.lBBitMask = &HFF&
End With
End With

' サーフェスを作成する。
Set dds = dd.CreateSurface(ddsd2)

End Sub