1999/08/28 - DirectDrawカラーキー

DirectDraw カラーキーについて

DirectDraw のカラーキーは,実際のハードウェア,BPP などに対応する値を指定してやる必要がある。1 番確実な方法はサンプルのように,サーフェスに GDI で描画をし,値を読み出すこと。

DWORD CDirectDraw::DDColorMatch(LPDIRECTDRAWSURFACE pSurface, COLORREF rgb)
{
    DWORD result;
    COLORREF oldrgb;

    HDC hdc;

    // GDI を使って色を置く
    if(rgb != CLR_INVALID && pSurface->GetDC(&hdc) != DD_OK)
    {
        return 0;
    }

    // 前の値を保持
    oldrgb = ::GetPixel(hdc, 0, 0);

    // 色を置いてみる
    ::SetPixel(hdc, 0, 0, rgb);

    pSurface->ReleaseDC(hdc);

    // ハードウェア依存の値を読み込む
    DDSURFACEDESC ddsd;
    ddsd.dwSize = sizeof(DDSURFACEDESC);

    HRESULT hres;
    while((hres = pSurface->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
    {
        ;
    }

    if(hres == DD_OK)
    {
        result = *(DWORD *)ddsd.lpSurface;

        // BPP に対する修正
        if(ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
        {
            result &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1;
        }

        pSurface->Unlock(NULL);
    }

    // 書き込んだ値を元に戻す
    if(rgb != CLR_INVALID && pSurface->GetDC(&hdc) != DD_OK)
    {
        return 0;
    }

    // 色を置いてみる
    ::SetPixel(hdc, 0, 0, oldrgb);

    pSurface->ReleaseDC(hdc);

    return result;
}

Direct3D,メッシュを見えなくするには,Frame.DeleteVisual すればよいが,メッシュの参照がなくなり,メッシュが削除され,もう 1 度表示するときに困る。これを防ぐには先に Mesh->AddRef() をしてやればよい。

コメントする