[PATCH 4/5] ddraw/tests: Test P8 color keying.

Stefan Dösinger stefandoesinger at gmx.at
Sun Jun 5 13:45:15 CDT 2016


Signed-off-by: Stefan Dösinger <stefandoesinger at gmx.at>

---

Like with the previous patch this is kinda implied by the palette
handling tests in test_palette_gdi and the existing P8->RGB blit that
shows P8 blits aren't special in any way. Still I think it's worth
keeping a specific test for this, but I don't have strong feelings about
it.
---
 dlls/ddraw/tests/ddraw1.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
 dlls/ddraw/tests/ddraw2.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
 dlls/ddraw/tests/ddraw4.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
 dlls/ddraw/tests/ddraw7.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
 4 files changed, 164 insertions(+), 20 deletions(-)

diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 6ae9cdf..a08951f 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -5323,18 +5323,21 @@ static void test_palette_complex(void)
     DestroyWindow(window);
 }
 
-static void test_p8_rgb_blit(void)
+static void test_p8_blit(void)
 {
-    IDirectDrawSurface *src, *dst;
+    IDirectDrawSurface *src, *dst, *dst_p8;
     DDSURFACEDESC surface_desc;
     IDirectDraw *ddraw;
-    IDirectDrawPalette *palette;
+    IDirectDrawPalette *palette, *palette2;
     ULONG refcount;
     HWND window;
     HRESULT hr;
     PALETTEENTRY palette_entries[256];
     unsigned int x;
+    DDBLTFX fx;
     static const BYTE src_data[] = {0x10, 0x1, 0x2, 0x3, 0x4, 0x5, 0xff, 0x80};
+    static const BYTE src_data2[] = {0x10, 0x5, 0x4, 0x3, 0x2, 0x1, 0xff, 0x80};
+    static const BYTE expected_p8[] = {0x10, 0x1, 0x4, 0x3, 0x4, 0x5, 0xff, 0x80};
     static const D3DCOLOR expected[] =
     {
         0x00101010, 0x00010101, 0x00020202, 0x00030303,
@@ -5357,6 +5360,13 @@ static void test_p8_rgb_blit(void)
     hr = IDirectDraw_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
             palette_entries, &palette, NULL);
     ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
+    palette_entries[1].peBlue = 0xff;
+    palette_entries[2].peGreen = 0xff;
+    palette_entries[3].peRed = 0xff;
+    palette_entries[4].peFlags = 0x0;
+    hr = IDirectDraw_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
+            palette_entries, &palette2, NULL);
+    ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -5369,6 +5379,10 @@ static void test_p8_rgb_blit(void)
     U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 8;
     hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &src, NULL);
     ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDrawSurface_SetPalette(dst_p8, palette2);
+    ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -5388,12 +5402,18 @@ static void test_p8_rgb_blit(void)
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
-    hr = IDirectDrawSurface_Lock(src, NULL, &surface_desc, 0, NULL);
+    hr = IDirectDrawSurface_Lock(src, NULL, &surface_desc, DDLOCK_WAIT, NULL);
     ok(SUCCEEDED(hr), "Failed to lock source surface, hr %#x.\n", hr);
     memcpy(surface_desc.lpSurface, src_data, sizeof(src_data));
     hr = IDirectDrawSurface_Unlock(src, NULL);
     ok(SUCCEEDED(hr), "Failed to unlock source surface, hr %#x.\n", hr);
 
+    hr = IDirectDrawSurface_Lock(dst_p8, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    memcpy(surface_desc.lpSurface, src_data2, sizeof(src_data2));
+    hr = IDirectDrawSurface_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     hr = IDirectDrawSurface_SetPalette(src, palette);
     ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
     hr = IDirectDrawSurface_Blt(dst, NULL, src, NULL, DDBLT_WAIT, NULL);
@@ -5413,9 +5433,25 @@ static void test_p8_rgb_blit(void)
         }
     }
 
+    memset(&fx, 0, sizeof(fx));
+    fx.dwSize = sizeof(fx);
+    fx.ddckSrcColorkey.dwColorSpaceHighValue = 0x2;
+    fx.ddckSrcColorkey.dwColorSpaceLowValue = 0x2;
+    hr = IDirectDrawSurface_Blt(dst_p8, NULL, src, NULL, DDBLT_WAIT | DDBLT_KEYSRCOVERRIDE, &fx);
+    ok(SUCCEEDED(hr), "Failed to blit, hr %#x.\n", hr);
+
+    hr = IDirectDrawSurface_Lock(dst_p8, NULL, &surface_desc, DDLOCK_READONLY | DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    ok(!memcmp(surface_desc.lpSurface, expected_p8, sizeof(expected_p8)),
+            "Got unexpected P8 color key blit result.\n");
+    hr = IDirectDrawSurface_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     IDirectDrawSurface_Release(src);
     IDirectDrawSurface_Release(dst);
+    IDirectDrawSurface_Release(dst_p8);
     IDirectDrawPalette_Release(palette);
+    IDirectDrawPalette_Release(palette2);
 
     refcount = IDirectDraw_Release(ddraw);
     ok(!refcount, "Got unexpected refcount %u.\n", refcount);
@@ -9051,7 +9087,7 @@ START_TEST(ddraw1)
     test_create_surface_pitch();
     test_mipmap();
     test_palette_complex();
-    test_p8_rgb_blit();
+    test_p8_blit();
     test_material();
     test_lighting();
     test_palette_gdi();
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 984ed40..7c40a9a 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -6383,18 +6383,21 @@ static void test_palette_complex(void)
     DestroyWindow(window);
 }
 
-static void test_p8_rgb_blit(void)
+static void test_p8_blit(void)
 {
-    IDirectDrawSurface *src, *dst;
+    IDirectDrawSurface *src, *dst, *dst_p8;
     DDSURFACEDESC surface_desc;
     IDirectDraw2 *ddraw;
-    IDirectDrawPalette *palette;
+    IDirectDrawPalette *palette, *palette2;
     ULONG refcount;
     HWND window;
     HRESULT hr;
     PALETTEENTRY palette_entries[256];
     unsigned int x;
+    DDBLTFX fx;
     static const BYTE src_data[] = {0x10, 0x1, 0x2, 0x3, 0x4, 0x5, 0xff, 0x80};
+    static const BYTE src_data2[] = {0x10, 0x5, 0x4, 0x3, 0x2, 0x1, 0xff, 0x80};
+    static const BYTE expected_p8[] = {0x10, 0x1, 0x4, 0x3, 0x4, 0x5, 0xff, 0x80};
     static const D3DCOLOR expected[] =
     {
         0x00101010, 0x00010101, 0x00020202, 0x00030303,
@@ -6417,6 +6420,13 @@ static void test_p8_rgb_blit(void)
     hr = IDirectDraw2_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
             palette_entries, &palette, NULL);
     ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
+    palette_entries[1].peBlue = 0xff;
+    palette_entries[2].peGreen = 0xff;
+    palette_entries[3].peRed = 0xff;
+    palette_entries[4].peFlags = 0x0;
+    hr = IDirectDraw2_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
+            palette_entries, &palette2, NULL);
+    ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -6429,6 +6439,10 @@ static void test_p8_rgb_blit(void)
     U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 8;
     hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &src, NULL);
     ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDrawSurface_SetPalette(dst_p8, palette2);
+    ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -6448,12 +6462,18 @@ static void test_p8_rgb_blit(void)
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
-    hr = IDirectDrawSurface_Lock(src, NULL, &surface_desc, 0, NULL);
+    hr = IDirectDrawSurface_Lock(src, NULL, &surface_desc, DDLOCK_WAIT, NULL);
     ok(SUCCEEDED(hr), "Failed to lock source surface, hr %#x.\n", hr);
     memcpy(surface_desc.lpSurface, src_data, sizeof(src_data));
     hr = IDirectDrawSurface_Unlock(src, NULL);
     ok(SUCCEEDED(hr), "Failed to unlock source surface, hr %#x.\n", hr);
 
+    hr = IDirectDrawSurface_Lock(dst_p8, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    memcpy(surface_desc.lpSurface, src_data2, sizeof(src_data2));
+    hr = IDirectDrawSurface_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     hr = IDirectDrawSurface_SetPalette(src, palette);
     ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
     hr = IDirectDrawSurface_Blt(dst, NULL, src, NULL, DDBLT_WAIT, NULL);
@@ -6473,9 +6493,25 @@ static void test_p8_rgb_blit(void)
         }
     }
 
+    memset(&fx, 0, sizeof(fx));
+    fx.dwSize = sizeof(fx);
+    fx.ddckSrcColorkey.dwColorSpaceHighValue = 0x2;
+    fx.ddckSrcColorkey.dwColorSpaceLowValue = 0x2;
+    hr = IDirectDrawSurface7_Blt(dst_p8, NULL, src, NULL, DDBLT_WAIT | DDBLT_KEYSRCOVERRIDE, &fx);
+    ok(SUCCEEDED(hr), "Failed to blit, hr %#x.\n", hr);
+
+    hr = IDirectDrawSurface_Lock(dst_p8, NULL, &surface_desc, DDLOCK_READONLY | DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    ok(!memcmp(surface_desc.lpSurface, expected_p8, sizeof(expected_p8)),
+            "Got unexpected P8 color key blit result.\n");
+    hr = IDirectDrawSurface_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     IDirectDrawSurface_Release(src);
     IDirectDrawSurface_Release(dst);
+    IDirectDrawSurface_Release(dst_p8);
     IDirectDrawPalette_Release(palette);
+    IDirectDrawPalette_Release(palette2);
 
     refcount = IDirectDraw2_Release(ddraw);
     ok(!refcount, "Got unexpected refcount %u.\n", refcount);
@@ -10234,7 +10270,7 @@ START_TEST(ddraw2)
     test_create_surface_pitch();
     test_mipmap();
     test_palette_complex();
-    test_p8_rgb_blit();
+    test_p8_blit();
     test_material();
     test_lighting();
     test_specular_lighting();
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 16a2625..532c69e 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -7910,18 +7910,21 @@ static void test_palette_complex(void)
     DestroyWindow(window);
 }
 
-static void test_p8_rgb_blit(void)
+static void test_p8_blit(void)
 {
-    IDirectDrawSurface4 *src, *dst;
+    IDirectDrawSurface4 *src, *dst, *dst_p8;
     DDSURFACEDESC2 surface_desc;
     IDirectDraw4 *ddraw;
-    IDirectDrawPalette *palette;
+    IDirectDrawPalette *palette, *palette2;
     ULONG refcount;
     HWND window;
     HRESULT hr;
     PALETTEENTRY palette_entries[256];
     unsigned int x;
+    DDBLTFX fx;
     static const BYTE src_data[] = {0x10, 0x1, 0x2, 0x3, 0x4, 0x5, 0xff, 0x80};
+    static const BYTE src_data2[] = {0x10, 0x5, 0x4, 0x3, 0x2, 0x1, 0xff, 0x80};
+    static const BYTE expected_p8[] = {0x10, 0x1, 0x4, 0x3, 0x4, 0x5, 0xff, 0x80};
     static const D3DCOLOR expected[] =
     {
         0x00101010, 0x00010101, 0x00020202, 0x00030303,
@@ -7944,6 +7947,13 @@ static void test_p8_rgb_blit(void)
     hr = IDirectDraw4_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
             palette_entries, &palette, NULL);
     ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
+    palette_entries[1].peBlue = 0xff;
+    palette_entries[2].peGreen = 0xff;
+    palette_entries[3].peRed = 0xff;
+    palette_entries[4].peFlags = 0x0;
+    hr = IDirectDraw4_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
+            palette_entries, &palette2, NULL);
+    ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -7956,6 +7966,10 @@ static void test_p8_rgb_blit(void)
     U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 8;
     hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &src, NULL);
     ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDrawSurface4_SetPalette(dst_p8, palette2);
+    ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -7975,12 +7989,18 @@ static void test_p8_rgb_blit(void)
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
-    hr = IDirectDrawSurface4_Lock(src, NULL, &surface_desc, 0, NULL);
+    hr = IDirectDrawSurface4_Lock(src, NULL, &surface_desc, DDLOCK_WAIT, NULL);
     ok(SUCCEEDED(hr), "Failed to lock source surface, hr %#x.\n", hr);
     memcpy(surface_desc.lpSurface, src_data, sizeof(src_data));
     hr = IDirectDrawSurface4_Unlock(src, NULL);
     ok(SUCCEEDED(hr), "Failed to unlock source surface, hr %#x.\n", hr);
 
+    hr = IDirectDrawSurface4_Lock(dst_p8, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    memcpy(surface_desc.lpSurface, src_data2, sizeof(src_data2));
+    hr = IDirectDrawSurface4_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     hr = IDirectDrawSurface4_SetPalette(src, palette);
     ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
     hr = IDirectDrawSurface4_Blt(dst, NULL, src, NULL, DDBLT_WAIT, NULL);
@@ -8000,9 +8020,25 @@ static void test_p8_rgb_blit(void)
         }
     }
 
+    memset(&fx, 0, sizeof(fx));
+    fx.dwSize = sizeof(fx);
+    fx.ddckSrcColorkey.dwColorSpaceHighValue = 0x2;
+    fx.ddckSrcColorkey.dwColorSpaceLowValue = 0x2;
+    hr = IDirectDrawSurface4_Blt(dst_p8, NULL, src, NULL, DDBLT_WAIT | DDBLT_KEYSRCOVERRIDE, &fx);
+    ok(SUCCEEDED(hr), "Failed to blit, hr %#x.\n", hr);
+
+    hr = IDirectDrawSurface4_Lock(dst_p8, NULL, &surface_desc, DDLOCK_READONLY | DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    ok(!memcmp(surface_desc.lpSurface, expected_p8, sizeof(expected_p8)),
+            "Got unexpected P8 color key blit result.\n");
+    hr = IDirectDrawSurface4_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     IDirectDrawSurface4_Release(src);
     IDirectDrawSurface4_Release(dst);
+    IDirectDrawSurface4_Release(dst_p8);
     IDirectDrawPalette_Release(palette);
+    IDirectDrawPalette_Release(palette2);
 
     refcount = IDirectDraw4_Release(ddraw);
     ok(!refcount, "Got unexpected refcount %u.\n", refcount);
@@ -11561,7 +11597,7 @@ START_TEST(ddraw4)
     test_create_surface_pitch();
     test_mipmap();
     test_palette_complex();
-    test_p8_rgb_blit();
+    test_p8_blit();
     test_material();
     test_palette_gdi();
     test_palette_alpha();
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 2c4e619..39aafe6 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -7822,18 +7822,21 @@ static void test_palette_complex(void)
     DestroyWindow(window);
 }
 
-static void test_p8_rgb_blit(void)
+static void test_p8_blit(void)
 {
-    IDirectDrawSurface7 *src, *dst;
+    IDirectDrawSurface7 *src, *dst, *dst_p8;
     DDSURFACEDESC2 surface_desc;
     IDirectDraw7 *ddraw;
-    IDirectDrawPalette *palette;
+    IDirectDrawPalette *palette, *palette2;
     ULONG refcount;
     HWND window;
     HRESULT hr;
     PALETTEENTRY palette_entries[256];
     unsigned int x;
+    DDBLTFX fx;
     static const BYTE src_data[] = {0x10, 0x1, 0x2, 0x3, 0x4, 0x5, 0xff, 0x80};
+    static const BYTE src_data2[] = {0x10, 0x5, 0x4, 0x3, 0x2, 0x1, 0xff, 0x80};
+    static const BYTE expected_p8[] = {0x10, 0x1, 0x4, 0x3, 0x4, 0x5, 0xff, 0x80};
     static const D3DCOLOR expected[] =
     {
         0x00101010, 0x00010101, 0x00020202, 0x00030303,
@@ -7856,6 +7859,13 @@ static void test_p8_rgb_blit(void)
     hr = IDirectDraw7_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
             palette_entries, &palette, NULL);
     ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
+    palette_entries[1].peBlue = 0xff;
+    palette_entries[2].peGreen = 0xff;
+    palette_entries[3].peRed = 0xff;
+    palette_entries[4].peFlags = 0x0;
+    hr = IDirectDraw7_CreatePalette(ddraw, DDPCAPS_8BIT | DDPCAPS_ALLOW256,
+            palette_entries, &palette2, NULL);
+    ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -7868,6 +7878,10 @@ static void test_p8_rgb_blit(void)
     U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 8;
     hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &src, NULL);
     ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDrawSurface7_SetPalette(dst_p8, palette2);
+    ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
@@ -7887,12 +7901,18 @@ static void test_p8_rgb_blit(void)
 
     memset(&surface_desc, 0, sizeof(surface_desc));
     surface_desc.dwSize = sizeof(surface_desc);
-    hr = IDirectDrawSurface7_Lock(src, NULL, &surface_desc, 0, NULL);
+    hr = IDirectDrawSurface7_Lock(src, NULL, &surface_desc, DDLOCK_WAIT, NULL);
     ok(SUCCEEDED(hr), "Failed to lock source surface, hr %#x.\n", hr);
     memcpy(surface_desc.lpSurface, src_data, sizeof(src_data));
     hr = IDirectDrawSurface7_Unlock(src, NULL);
     ok(SUCCEEDED(hr), "Failed to unlock source surface, hr %#x.\n", hr);
 
+    hr = IDirectDrawSurface7_Lock(dst_p8, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    memcpy(surface_desc.lpSurface, src_data2, sizeof(src_data2));
+    hr = IDirectDrawSurface7_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     hr = IDirectDrawSurface7_SetPalette(src, palette);
     ok(SUCCEEDED(hr), "Failed to set palette, hr %#x.\n", hr);
     hr = IDirectDrawSurface7_Blt(dst, NULL, src, NULL, DDBLT_WAIT, NULL);
@@ -7912,9 +7932,25 @@ static void test_p8_rgb_blit(void)
         }
     }
 
+    memset(&fx, 0, sizeof(fx));
+    fx.dwSize = sizeof(fx);
+    fx.ddckSrcColorkey.dwColorSpaceHighValue = 0x2;
+    fx.ddckSrcColorkey.dwColorSpaceLowValue = 0x2;
+    hr = IDirectDrawSurface7_Blt(dst_p8, NULL, src, NULL, DDBLT_WAIT | DDBLT_KEYSRCOVERRIDE, &fx);
+    ok(SUCCEEDED(hr), "Failed to blit, hr %#x.\n", hr);
+
+    hr = IDirectDrawSurface7_Lock(dst_p8, NULL, &surface_desc, DDLOCK_READONLY | DDLOCK_WAIT, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination surface, hr %#x.\n", hr);
+    ok(!memcmp(surface_desc.lpSurface, expected_p8, sizeof(expected_p8)),
+            "Got unexpected P8 color key blit result.\n");
+    hr = IDirectDrawSurface7_Unlock(dst_p8, NULL);
+    ok(SUCCEEDED(hr), "Failed to unlock destination surface, hr %#x.\n", hr);
+
     IDirectDrawSurface7_Release(src);
     IDirectDrawSurface7_Release(dst);
+    IDirectDrawSurface7_Release(dst_p8);
     IDirectDrawPalette_Release(palette);
+    IDirectDrawPalette_Release(palette2);
 
     refcount = IDirectDraw7_Release(ddraw);
     ok(!refcount, "Got unexpected refcount %u.\n", refcount);
@@ -11886,7 +11922,7 @@ START_TEST(ddraw7)
     test_create_surface_pitch();
     test_mipmap();
     test_palette_complex();
-    test_p8_rgb_blit();
+    test_p8_blit();
     test_material();
     test_palette_gdi();
     test_palette_alpha();
-- 
2.7.3




More information about the wine-patches mailing list