Platform SDK: DirectX

ステップ 3 : オーバーレイ サーフェスの作成

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic チュートリアル」を参照すること。

[C++]

ドライバがオーバーレイ サーフェスをサポートすることがわかったので、オーバーレイ サーフェスを作成できる。デバイスがオーバーレイ サーフェスをサポートするうえで標準となる方法がないので、特定のサイズやピクセル フォーマットのオーバーレイを常に作成できるとは限らない。さらに、1 度でオーバーレイ サーフェスを作成できるとも限らない。したがって、最も望ましい特性を持つオーバーレイ サーフェスから作成し始め、機能するオーバーレイ サーフェスを作成できるまで、構成の特性を落としながら (おそらく、ハードウェア依存ではない) 何度も作成を試みる。

 :  IDirectDraw7::GetFourCCCodes メソッドを呼び出すことにより、ドライバがオーバーレイ サーフェスをサポートしそうな非 RGB ピクセル フォーマットを記述する FOURCC コードのリストを取得できる。ただし、RGB オーバーレイ サーフェスを使用する場合には、最初にさまざまな共通 RGB フォーマットでサーフェスの作成を試み、うまくいかなければ他のフォーマットで試みるとよい。

Mosquito サンプルでは、" 最良の場合から最悪の場合 " という考えに従ってオーバーレイ サーフェスを作成する。Mosquito では、最初にトリプルバッファのページ フリッピング複合オーバーレイ サーフェスの作成を試みる。その作成に失敗した場合、次に他の共通ピクセル フォーマットで構成を試みる。この場合のコードを次に示す。

    ZeroMemory(&ddsdOverlay, sizeof(ddsdOverlay));
    ddsdOverlay.dwSize = sizeof(ddsdOverlay);
 
    ddsdOverlay.dwFlags= DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | 
                         DDSD_BACKBUFFERCOUNT| DDSD_PIXELFORMAT;
    ddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_FLIP |
                                 DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY;
    ddsdOverlay.dwWidth  =320;
    ddsdOverlay.dwHeight =240;
    ddsdOverlay.dwBackBufferCount=2;
 
    // グローバル リストにあるピクセル フォーマットの 1 つを用いて、
    // オーバーレイ サーフェスの作成を試みる。
    i=0;
    do{
    ddsdOverlay.ddpfPixelFormat=g_ddpfOverlayFormats[i];
       // オーバーレイ サーフェスの作成を試みる。
       ddrval = g_lpdd->CreateSurface(&ddsdOverlay, &g_lpddsOverlay, NULL);
    } while( FAILED(ddrval) && (++i < NUM_OVERLAY_FORMATS) );
 

上記の例では、DDSURFACEDESC2 構造体の範囲内にフラグと値を設定して、トリプルバッファのページ フリッピング複合オーバーレイ サーフェスを反映する。次に、さまざまな共通ピクセル フォーマットで要求するサーフェスを作成するために、もっとも望ましいものから望ましくないピクセル フォーマットの順にループを実行する。サーフェスが作成できると、ループは終了する。サーフェスを作成する試みがすべて失敗した場合、ディスプレイ ハードウェアにトリプルバッファ スキームをサポートするための十分なメモリがないか、フリッピング オーバーレイ サーフェスをサポートしない可能性がある。この場合、このサンプルでは、単一の非フリッピング オーバーレイ サーフェスを使う要求度の低い構成で作成を試みる。次にこの例を示す。

    // トリプルバッファ複合オーバーレイ サーフェスが作成されない
    // 場合、単一の非フリッピング バッファイで再び作成を試みる。
    if(FAILED(ddrval))
    {
        ddsdOverlay.dwBackBufferCount=0;
        ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY;
        ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
 
        // オーバーレイ サーフェスの作成を試みる。
        ddrval = g_lpdd->CreateSurface(&ddsdOverlay, &g_lpddsOverlay, NULL);
        i=0;
        do{
            ddsdOverlay.ddpfPixelFormat=g_ddpfOverlayFormats[i];
            ddrval = g_lpdd->CreateSurface(&ddsdOverlay, &g_lpddsOverlay, NULL);
        } while( FAILED(ddrval) && (++i < NUM_OVERLAY_FORMATS) );
 
        // オーバーレイ サーフェスを作成できない。失敗を返して終了する。
        if (FAILED(ddrval))
            return FALSE;
    }
 

直前のコードでは、DDSURFACEDESC2 構造体のフラグと値をリセットして、単一の非フリッピング オーバーレイ サーフェスを反映する。サーフェスを作成するために、再度ピクセル フォーマットからループする。作成に成功すると、ループは終了する。この場合でも作成できなければ、サンプルは失敗を示す FALSE を返す。

オーバーレイ サーフェスまたはサーフェスの作成に成功すると、そのサーフェスにビットマップをロードして表示を準備できる。

次項 :ステップ 4 : オーバーレイ サーフェスの表示