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