Module: wine Branch: master Commit: 5a656dead64915e3221f393d238db8a574424b64 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a656dead64915e3221f393d23...
Author: Stefan Dösinger stefan@codeweavers.com Date: Wed Dec 11 12:22:17 2013 +0100
ddraw/tests: Test user memory and getdc interaction.
Some Windows Media Player 9 visualization plugins used ddraw in this way to get a dc for their custom memory allocations.
---
dlls/ddraw/tests/ddraw2.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ dlls/ddraw/tests/ddraw4.c | 61 +++++++++++++++++++++++++++++++++++++++++ dlls/ddraw/tests/ddraw7.c | 61 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 0 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 3728723..ccf228e 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -4862,6 +4862,71 @@ done: DestroyWindow(window); }
+static void test_user_memory_getdc(void) +{ + IDirectDraw2 *ddraw; + HWND window; + HRESULT hr; + DDSURFACEDESC ddsd; + IDirectDrawSurface *surface; + IDirectDrawSurface3 *surface3; + DWORD data[16][16]; + ULONG ref; + HDC dc; + + if (!(ddraw = create_ddraw())) + { + skip("Failed to create a ddraw object, skipping test.\n"); + return; + } + + window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW, + 0, 0, 640, 480, 0, 0, 0, 0); + + hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); + ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); + + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT; + ddsd.dwWidth = 16; + ddsd.dwHeight = 16; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32; + U2(ddsd.ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x000000ff; + ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; + hr = IDirectDraw2_CreateSurface(ddraw, &ddsd, &surface, NULL); + ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + + hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface3, (void **)&surface3); + ok(SUCCEEDED(hr), "Failed to get IDirectDrawSurface3 interface, hr %#x.\n", hr); + IDirectDrawSurface_Release(surface); + + memset(data, 0xaa, sizeof(data)); + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_LPSURFACE; + ddsd.lpSurface = data; + hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); + ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr); + + hr = IDirectDrawSurface3_GetDC(surface3, &dc); + ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr); + BitBlt(dc, 0, 0, 16, 8, NULL, 0, 0, WHITENESS); + BitBlt(dc, 0, 8, 16, 8, NULL, 0, 0, BLACKNESS); + hr = IDirectDrawSurface3_ReleaseDC(surface3, dc); + ok(SUCCEEDED(hr), "Failed to release DC, hr %#x.\n", hr); + + ok(data[0][0] == 0xffffffff, "Expected color 0xffffffff, got %#x.\n", data[0][0]); + ok(data[15][15] == 0x00000000, "Expected color 0x00000000, got %#x.\n", data[15][15]); + + IDirectDrawSurface3_Release(surface3); + ref = IDirectDraw2_Release(ddraw); + ok(ref == 0, "Ddraw object not properly released, refcount %u.\n", ref); + DestroyWindow(window); +} + START_TEST(ddraw2) { test_coop_level_create_device_window(); @@ -4896,4 +4961,5 @@ START_TEST(ddraw2) test_surface_discard(); test_flip(); test_set_surface_desc(); + test_user_memory_getdc(); } diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 1793052..1689562 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -5464,6 +5464,66 @@ done: DestroyWindow(window); }
+static void test_user_memory_getdc(void) +{ + IDirectDraw4 *ddraw; + HWND window; + HRESULT hr; + DDSURFACEDESC2 ddsd; + IDirectDrawSurface4 *surface; + DWORD data[16][16]; + ULONG ref; + HDC dc; + + if (!(ddraw = create_ddraw())) + { + skip("Failed to create a ddraw object, skipping test.\n"); + return; + } + + window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW, + 0, 0, 640, 480, 0, 0, 0, 0); + + hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); + ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); + + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT; + ddsd.dwWidth = 16; + ddsd.dwHeight = 16; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32; + U2(ddsd.ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x000000ff; + ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; + hr = IDirectDraw4_CreateSurface(ddraw, &ddsd, &surface, NULL); + ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + + memset(data, 0xaa, sizeof(data)); + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_LPSURFACE; + ddsd.lpSurface = data; + hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0); + ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr); + + hr = IDirectDrawSurface4_GetDC(surface, &dc); + ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr); + BitBlt(dc, 0, 0, 16, 8, NULL, 0, 0, WHITENESS); + BitBlt(dc, 0, 8, 16, 8, NULL, 0, 0, BLACKNESS); + hr = IDirectDrawSurface4_ReleaseDC(surface, dc); + ok(SUCCEEDED(hr), "Failed to release DC, hr %#x.\n", hr); + + ok(data[0][0] == 0xffffffff, "Expected color 0xffffffff, got %#x.\n", data[0][0]); + ok(data[15][15] == 0x00000000, "Expected color 0x00000000, got %#x.\n", data[15][15]); + + IDirectDrawSurface4_Release(surface); + ref = IDirectDraw4_Release(ddraw); + ok(ref == 0, "Ddraw object not properly released, refcount %u.\n", ref); + DestroyWindow(window); +} + START_TEST(ddraw4) { test_process_vertices(); @@ -5503,4 +5563,5 @@ START_TEST(ddraw4) test_surface_discard(); test_flip(); test_set_surface_desc(); + test_user_memory_getdc(); } diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 0a7eb7d..41f1b9b 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -5352,6 +5352,66 @@ done: DestroyWindow(window); }
+static void test_user_memory_getdc(void) +{ + IDirectDraw7 *ddraw; + HWND window; + HRESULT hr; + DDSURFACEDESC2 ddsd; + IDirectDrawSurface7 *surface; + DWORD data[16][16]; + ULONG ref; + HDC dc; + + if (!(ddraw = create_ddraw())) + { + skip("Failed to create a ddraw object, skipping test.\n"); + return; + } + + window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW, + 0, 0, 640, 480, 0, 0, 0, 0); + + hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); + ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); + + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT; + ddsd.dwWidth = 16; + ddsd.dwHeight = 16; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32; + U2(ddsd.ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x000000ff; + ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; + hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL); + ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + + memset(data, 0xaa, sizeof(data)); + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_LPSURFACE; + ddsd.lpSurface = data; + hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0); + ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr); + + hr = IDirectDrawSurface7_GetDC(surface, &dc); + ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr); + BitBlt(dc, 0, 0, 16, 8, NULL, 0, 0, WHITENESS); + BitBlt(dc, 0, 8, 16, 8, NULL, 0, 0, BLACKNESS); + hr = IDirectDrawSurface7_ReleaseDC(surface, dc); + ok(SUCCEEDED(hr), "Failed to release DC, hr %#x.\n", hr); + + ok(data[0][0] == 0xffffffff, "Expected color 0xffffffff, got %#x.\n", data[0][0]); + ok(data[15][15] == 0x00000000, "Expected color 0x00000000, got %#x.\n", data[15][15]); + + IDirectDrawSurface7_Release(surface); + ref = IDirectDraw7_Release(ddraw); + ok(ref == 0, "Ddraw object not properly released, refcount %u.\n", ref); + DestroyWindow(window); +} + START_TEST(ddraw7) { HMODULE module = GetModuleHandleA("ddraw.dll"); @@ -5399,4 +5459,5 @@ START_TEST(ddraw7) test_surface_discard(); test_flip(); test_set_surface_desc(); + test_user_memory_getdc(); }