[PATCH 4/5] ddraw/tests: Port test_lockrect_invalid to other versions.

Stefan Dösinger stefandoesinger at gmx.at
Mon Jan 18 16:20:08 CST 2016


Signed-off-by: Stefan Dösinger <stefandoesinger at gmx.at>
---
 dlls/ddraw/tests/ddraw1.c   | 135 +++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw2.c   | 141 ++++++++++++++++++++++++++++++++++++++++++-
 dlls/ddraw/tests/ddraw4.c   | 137 +++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw7.c   | 144 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/dsurface.c | 121 -------------------------------------
 5 files changed, 556 insertions(+), 122 deletions(-)

diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 25b988a..9890078 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -8010,6 +8010,140 @@ static void test_shademode(void)
     DestroyWindow(window);
 }
 
+static void test_lockrect_invalid(void)
+{
+    unsigned int i, r;
+    IDirectDraw *ddraw;
+    IDirectDrawSurface *surface;
+    HWND window;
+    HRESULT hr;
+    DDSURFACEDESC surface_desc;
+    static RECT valid[] =
+    {
+        {60, 60, 68, 68},
+        {60, 60, 60, 68},
+        {60, 60, 68, 60},
+        {120, 60, 128, 68},
+        {60, 120, 68, 128},
+    };
+    static RECT invalid[] =
+    {
+        {68, 60, 60, 68},       /* left > right */
+        {60, 68, 68, 60},       /* top > bottom */
+        {-8, 60,  0, 68},       /* left < surface */
+        {60, -8, 68,  0},       /* top < surface */
+        {-16, 60, -8, 68},      /* right < surface */
+        {60, -16, 68, -8},      /* bottom < surface */
+        {60, 60, 136, 68},      /* right > surface */
+        {60, 60, 68, 136},      /* bottom > surface */
+        {136, 60, 144, 68},     /* left > surface */
+        {60, 136, 68, 144},     /* top > surface */
+    };
+    static const struct
+    {
+        DWORD caps;
+        const char *name;
+        HRESULT hr;
+    }
+    resources[] =
+    {
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "sysmem texture", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "vidmem texture", DDERR_INVALIDPARAMS},
+    };
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
+    {
+        memset(&surface_desc, 0, sizeof(surface_desc));
+        surface_desc.dwSize = sizeof(surface_desc);
+        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+        surface_desc.ddsCaps.dwCaps = resources[r].caps;
+        surface_desc.dwWidth = 128;
+        surface_desc.dwHeight = 128;
+        surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
+        surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+        U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32;
+        U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0xFF0000;
+        U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x00FF00;
+        U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000FF;
+
+        hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+        hr = IDirectDrawSurface_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
+
+        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
+        {
+            RECT *rect = &valid[i];
+
+            memset(&surface_desc, 0, sizeof(surface_desc));
+            surface_desc.dwSize = sizeof(surface_desc);
+
+            hr = IDirectDrawSurface_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
+            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
+                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+
+            hr = IDirectDrawSurface_Unlock(surface, NULL);
+            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+        }
+
+        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
+        {
+            RECT *rect = &invalid[i];
+
+            memset(&surface_desc, 1, sizeof(surface_desc));
+            surface_desc.dwSize = sizeof(surface_desc);
+
+            hr = IDirectDrawSurface_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
+            ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
+                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+            if (SUCCEEDED(hr))
+            {
+                hr = IDirectDrawSurface_Unlock(surface, NULL);
+                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+            }
+            else
+                ok(!surface_desc.lpSurface, "Got unexpected lpSurface %p.\n", surface_desc.lpSurface);
+        }
+
+        hr = IDirectDrawSurface_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        hr = IDirectDrawSurface_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+        hr = IDirectDrawSurface_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+
+        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
+         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
+
+        hr = IDirectDrawSurface_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        IDirectDrawSurface_Release(surface);
+    }
+
+    IDirectDraw_Release(ddraw);
+    DestroyWindow(window);
+}
+
 START_TEST(ddraw1)
 {
     IDirectDraw *ddraw;
@@ -8082,4 +8216,5 @@ START_TEST(ddraw1)
     test_colorkey_precision();
     test_range_colorkey();
     test_shademode();
+    test_lockrect_invalid();
 }
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 2e26c52..f130808 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -9112,6 +9112,144 @@ static void test_shademode(void)
     DestroyWindow(window);
 }
 
+static void test_lockrect_invalid(void)
+{
+    unsigned int i, r;
+    IDirectDraw2 *ddraw;
+    IDirectDrawSurface *surface1;
+    IDirectDrawSurface2 *surface;
+    HWND window;
+    HRESULT hr;
+    DDSURFACEDESC surface_desc;
+    static RECT valid[] =
+    {
+        {60, 60, 68, 68},
+        {60, 60, 60, 68},
+        {60, 60, 68, 60},
+        {120, 60, 128, 68},
+        {60, 120, 68, 128},
+    };
+    static RECT invalid[] =
+    {
+        {68, 60, 60, 68},       /* left > right */
+        {60, 68, 68, 60},       /* top > bottom */
+        {-8, 60,  0, 68},       /* left < surface */
+        {60, -8, 68,  0},       /* top < surface */
+        {-16, 60, -8, 68},      /* right < surface */
+        {60, -16, 68, -8},      /* bottom < surface */
+        {60, 60, 136, 68},      /* right > surface */
+        {60, 60, 68, 136},      /* bottom > surface */
+        {136, 60, 144, 68},     /* left > surface */
+        {60, 136, 68, 144},     /* top > surface */
+    };
+    static const struct
+    {
+        DWORD caps;
+        const char *name;
+        HRESULT hr;
+    }
+    resources[] =
+    {
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "sysmem texture", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "vidmem texture", DDERR_INVALIDPARAMS},
+    };
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
+    {
+        memset(&surface_desc, 0, sizeof(surface_desc));
+        surface_desc.dwSize = sizeof(surface_desc);
+        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+        surface_desc.ddsCaps.dwCaps = resources[r].caps;
+        surface_desc.dwWidth = 128;
+        surface_desc.dwHeight = 128;
+        surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
+        surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+        U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32;
+        U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0xFF0000;
+        U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x00FF00;
+        U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000FF;
+
+        hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &surface1, NULL);
+        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+        hr = IDirectDrawSurface_QueryInterface(surface1, &IID_IDirectDrawSurface2, (void **)&surface);
+        ok(SUCCEEDED(hr), "Failed to QI IDirectDrawSurface2 interface, hr %#x.\n", hr);
+        IDirectDrawSurface_Release(surface1);
+
+        hr = IDirectDrawSurface2_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
+
+        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
+        {
+            RECT *rect = &valid[i];
+
+            memset(&surface_desc, 0, sizeof(surface_desc));
+            surface_desc.dwSize = sizeof(surface_desc);
+
+            hr = IDirectDrawSurface2_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
+            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
+                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+
+            hr = IDirectDrawSurface2_Unlock(surface, NULL);
+            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+        }
+
+        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
+        {
+            RECT *rect = &invalid[i];
+
+            memset(&surface_desc, 1, sizeof(surface_desc));
+            surface_desc.dwSize = sizeof(surface_desc);
+
+            hr = IDirectDrawSurface2_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
+            ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
+                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+            if (SUCCEEDED(hr))
+            {
+                hr = IDirectDrawSurface2_Unlock(surface, NULL);
+                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+            }
+            else
+                ok(!surface_desc.lpSurface, "Got unexpected lpSurface %p.\n", surface_desc.lpSurface);
+        }
+
+        hr = IDirectDrawSurface2_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface2_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface2_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        hr = IDirectDrawSurface2_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+        hr = IDirectDrawSurface2_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+
+        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
+         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
+
+        hr = IDirectDrawSurface2_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        IDirectDrawSurface2_Release(surface);
+    }
+
+    IDirectDraw2_Release(ddraw);
+    DestroyWindow(window);
+}
+
 START_TEST(ddraw2)
 {
     IDirectDraw2 *ddraw;
@@ -9130,7 +9268,7 @@ START_TEST(ddraw2)
     registry_mode.dmSize = sizeof(registry_mode);
     ok(EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &registry_mode), "Failed to get display mode.\n");
     if (registry_mode.dmPelsWidth != current_mode.dmPelsWidth
-            || registry_mode.dmPelsHeight != current_mode.dmPelsHeight)
+        || registry_mode.dmPelsHeight != current_mode.dmPelsHeight)
     {
         skip("Current mode does not match registry mode, skipping test.\n");
         return;
@@ -9191,4 +9329,5 @@ START_TEST(ddraw2)
     test_colorkey_precision();
     test_range_colorkey();
     test_shademode();
+    test_lockrect_invalid();
 }
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 8b99eaa..c668a13 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -10281,6 +10281,142 @@ static void test_shademode(void)
     DestroyWindow(window);
 }
 
+static void test_lockrect_invalid(void)
+{
+    unsigned int i, r;
+    IDirectDraw4 *ddraw;
+    IDirectDrawSurface4 *surface;
+    HWND window;
+    HRESULT hr;
+    DDSURFACEDESC2 surface_desc;
+    static RECT valid[] =
+    {
+        {60, 60, 68, 68},
+        {60, 60, 60, 68},
+        {60, 60, 68, 60},
+        {120, 60, 128, 68},
+        {60, 120, 68, 128},
+    };
+    static RECT invalid[] =
+    {
+        {68, 60, 60, 68},       /* left > right */
+        {60, 68, 68, 60},       /* top > bottom */
+        {-8, 60,  0, 68},       /* left < surface */
+        {60, -8, 68,  0},       /* top < surface */
+        {-16, 60, -8, 68},      /* right < surface */
+        {60, -16, 68, -8},      /* bottom < surface */
+        {60, 60, 136, 68},      /* right > surface */
+        {60, 60, 68, 136},      /* bottom > surface */
+        {136, 60, 144, 68},     /* left > surface */
+        {60, 136, 68, 144},     /* top > surface */
+    };
+    static const struct
+    {
+        DWORD caps, caps2;
+        const char *name;
+        HRESULT hr;
+    }
+    resources[] =
+    {
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, 0, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, 0, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, "sysmem texture", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, 0, "vidmem texture", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, "managed texture", DDERR_INVALIDPARAMS},
+    };
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
+    {
+        memset(&surface_desc, 0, sizeof(surface_desc));
+        surface_desc.dwSize = sizeof(surface_desc);
+        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+        surface_desc.ddsCaps.dwCaps = resources[r].caps;
+        surface_desc.ddsCaps.dwCaps2 = resources[r].caps2;
+        surface_desc.dwWidth = 128;
+        surface_desc.dwHeight = 128;
+        U4(surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(surface_desc).ddpfPixelFormat);
+        U4(surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB;
+        U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 32;
+        U2(U4(surface_desc).ddpfPixelFormat).dwRBitMask = 0xFF0000;
+        U3(U4(surface_desc).ddpfPixelFormat).dwGBitMask = 0x00FF00;
+        U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x0000FF;
+
+        hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+        hr = IDirectDrawSurface4_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
+
+        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
+        {
+            RECT *rect = &valid[i];
+
+            memset(&surface_desc, 0, sizeof(surface_desc));
+            surface_desc.dwSize = sizeof(surface_desc);
+
+            hr = IDirectDrawSurface4_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
+            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
+                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+
+            hr = IDirectDrawSurface4_Unlock(surface, NULL);
+            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+        }
+
+        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
+        {
+            RECT *rect = &invalid[i];
+
+            memset(&surface_desc, 1, sizeof(surface_desc));
+            surface_desc.dwSize = sizeof(surface_desc);
+
+            hr = IDirectDrawSurface4_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
+            ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
+                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+            if (SUCCEEDED(hr))
+            {
+                hr = IDirectDrawSurface4_Unlock(surface, NULL);
+                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+            }
+            else
+                ok(!surface_desc.lpSurface, "Got unexpected lpSurface %p.\n", surface_desc.lpSurface);
+        }
+
+        hr = IDirectDrawSurface4_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface4_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface4_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        hr = IDirectDrawSurface4_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+        hr = IDirectDrawSurface4_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+
+        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
+         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
+
+        hr = IDirectDrawSurface4_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        IDirectDrawSurface4_Release(surface);
+    }
+
+    IDirectDraw4_Release(ddraw);
+    DestroyWindow(window);
+}
+
 START_TEST(ddraw4)
 {
     IDirectDraw4 *ddraw;
@@ -10367,4 +10503,5 @@ START_TEST(ddraw4)
     test_colorkey_precision();
     test_range_colorkey();
     test_shademode();
+    test_lockrect_invalid();
 }
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 97ce7aa..8bc0045 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -10544,6 +10544,149 @@ static void test_shademode(void)
     DestroyWindow(window);
 }
 
+static void test_lockrect_invalid(void)
+{
+    unsigned int i, r;
+    IDirectDraw7 *ddraw;
+    IDirectDrawSurface7 *surface;
+    HWND window;
+    HRESULT hr;
+    DDSURFACEDESC2 surface_desc;
+    DDSURFACEDESC2 locked_desc;
+    static RECT valid[] =
+    {
+        {60, 60, 68, 68},
+        {60, 60, 60, 68},
+        {60, 60, 68, 60},
+        {120, 60, 128, 68},
+        {60, 120, 68, 128},
+    };
+    static RECT invalid[] =
+    {
+        {68, 60, 60, 68},       /* left > right */
+        {60, 68, 68, 60},       /* top > bottom */
+        {-8, 60,  0, 68},       /* left < surface */
+        {60, -8, 68,  0},       /* top < surface */
+        {-16, 60, -8, 68},      /* right < surface */
+        {60, -16, 68, -8},      /* bottom < surface */
+        {60, 60, 136, 68},      /* right > surface */
+        {60, 60, 68, 136},      /* bottom > surface */
+        {136, 60, 144, 68},     /* left > surface */
+        {60, 136, 68, 144},     /* top > surface */
+    };
+    static const struct
+    {
+        DWORD caps, caps2;
+        const char *name;
+        HRESULT hr;
+    }
+    resources[] =
+    {
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, 0, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, 0, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, "sysmem texture", DD_OK},
+        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, 0, "vidmem texture", DDERR_INVALIDPARAMS},
+        {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, "managed texture", DDERR_INVALIDPARAMS},
+    };
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
+    {
+        memset(&surface_desc, 0, sizeof(surface_desc));
+        surface_desc.dwSize = sizeof(surface_desc);
+        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+        surface_desc.ddsCaps.dwCaps = resources[r].caps;
+        surface_desc.ddsCaps.dwCaps2 = resources[r].caps2;
+        surface_desc.dwWidth = 128;
+        surface_desc.dwHeight = 128;
+        U4(surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(surface_desc).ddpfPixelFormat);
+        U4(surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB;
+        U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 32;
+        U2(U4(surface_desc).ddpfPixelFormat).dwRBitMask = 0xFF0000;
+        U3(U4(surface_desc).ddpfPixelFormat).dwGBitMask = 0x00FF00;
+        U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x0000FF;
+
+        hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+        /* Crashes in ddraw7
+        hr = IDirectDrawSurface7_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
+        */
+
+        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
+        {
+            RECT *rect = &valid[i];
+
+            memset(&locked_desc, 0, sizeof(locked_desc));
+            locked_desc.dwSize = sizeof(locked_desc);
+
+            hr = IDirectDrawSurface7_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
+            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
+                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+
+            hr = IDirectDrawSurface7_Unlock(surface, NULL);
+            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+        }
+
+        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
+        {
+            RECT *rect = &invalid[i];
+
+            memset(&locked_desc, 1, sizeof(locked_desc));
+            locked_desc.dwSize = sizeof(locked_desc);
+
+            hr = IDirectDrawSurface7_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
+            if (SUCCEEDED(resources[r].hr))
+                todo_wine ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
+                        hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+            else
+                ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
+                        hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
+            if (SUCCEEDED(hr))
+            {
+                hr = IDirectDrawSurface7_Unlock(surface, NULL);
+                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+            }
+            else
+                ok(!locked_desc.lpSurface, "Got unexpected lpSurface %p.\n", locked_desc.lpSurface);
+        }
+
+        hr = IDirectDrawSurface7_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface7_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
+                hr, resources[r].name);
+        hr = IDirectDrawSurface7_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        hr = IDirectDrawSurface7_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
+        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+        hr = IDirectDrawSurface7_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
+        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
+                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
+
+        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
+         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
+
+        hr = IDirectDrawSurface7_Unlock(surface, NULL);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
+
+        IDirectDrawSurface7_Release(surface);
+    }
+
+    IDirectDraw7_Release(ddraw);
+    DestroyWindow(window);
+}
+
 START_TEST(ddraw7)
 {
     HMODULE module = GetModuleHandleA("ddraw.dll");
@@ -10641,4 +10784,5 @@ START_TEST(ddraw7)
     test_colorkey_precision();
     test_range_colorkey();
     test_shademode();
+    test_lockrect_invalid();
 }
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index 83fa46d..781fa56 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -1208,126 +1208,6 @@ static void CubeMapTest(void)
     if (dd7) IDirectDraw7_Release(dd7);
 }
 
-static void test_lockrect_invalid(void)
-{
-    unsigned int i, j;
-
-    RECT valid[] = {
-        {60, 60, 68, 68},
-        {60, 60, 60, 68},
-        {60, 60, 68, 60},
-        {120, 60, 128, 68},
-        {60, 120, 68, 128},
-    };
-
-    RECT invalid[] = {
-        {68, 60, 60, 68},       /* left > right */
-        {60, 68, 68, 60},       /* top > bottom */
-        {-8, 60,  0, 68},       /* left < surface */
-        {60, -8, 68,  0},       /* top < surface */
-        {-16, 60, -8, 68},      /* right < surface */
-        {60, -16, 68, -8},      /* bottom < surface */
-        {60, 60, 136, 68},      /* right > surface */
-        {60, 60, 68, 136},      /* bottom > surface */
-        {136, 60, 144, 68},     /* left > surface */
-        {60, 136, 68, 144},     /* top > surface */
-    };
-
-    const DWORD dds_caps[] = {
-        DDSCAPS_OFFSCREENPLAIN
-    };
-
-    for (j = 0; j < (sizeof(dds_caps) / sizeof(*dds_caps)); ++j)
-    {
-        IDirectDrawSurface *surface = 0;
-        DDSURFACEDESC surface_desc = {0};
-        DDSURFACEDESC locked_desc = {0};
-        HRESULT hr;
-
-        surface_desc.dwSize = sizeof(surface_desc);
-        surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
-        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
-        surface_desc.ddsCaps.dwCaps = dds_caps[j];
-        surface_desc.dwWidth = 128;
-        surface_desc.dwHeight = 128;
-        surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
-        U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32;
-        U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0xFF0000;
-        U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x00FF00;
-        U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000FF;
-
-        hr = IDirectDraw_CreateSurface(lpDD, &surface_desc, &surface, NULL);
-        ok(SUCCEEDED(hr), "CreateSurface failed (0x%08x)\n", hr);
-        if (FAILED(hr))
-        {
-            skip("failed to create surface\n");
-            continue;
-        }
-
-        hr = IDirectDrawSurface_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
-        ok(hr == DDERR_INVALIDPARAMS, "Lock returned 0x%08x for NULL DDSURFACEDESC,"
-                " expected DDERR_INVALIDPARAMS (0x%08x)\n", hr, DDERR_INVALIDPARAMS);
-
-        for (i = 0; i < (sizeof(valid) / sizeof(*valid)); ++i)
-        {
-            RECT *rect = &valid[i];
-
-            memset(&locked_desc, 0, sizeof(locked_desc));
-            locked_desc.dwSize = sizeof(locked_desc);
-
-            hr = IDirectDrawSurface_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
-            ok(SUCCEEDED(hr), "Lock failed (0x%08x) for rect [%d, %d]->[%d, %d]\n",
-                    hr, rect->left, rect->top, rect->right, rect->bottom);
-
-            hr = IDirectDrawSurface_Unlock(surface, NULL);
-            ok(SUCCEEDED(hr), "Unlock failed (0x%08x)\n", hr);
-        }
-
-        for (i = 0; i < (sizeof(invalid) / sizeof(*invalid)); ++i)
-        {
-            RECT *rect = &invalid[i];
-
-            memset(&locked_desc, 1, sizeof(locked_desc));
-            locked_desc.dwSize = sizeof(locked_desc);
-
-            hr = IDirectDrawSurface_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
-            ok(hr == DDERR_INVALIDPARAMS, "Lock returned 0x%08x for rect [%d, %d]->[%d, %d]"
-                    ", expected DDERR_INVALIDPARAMS (0x%08x)\n", hr, rect->left, rect->top,
-                    rect->right, rect->bottom, DDERR_INVALIDPARAMS);
-            ok(!locked_desc.lpSurface, "IDirectDrawSurface_Lock did not set lpSurface in the surface desc to zero.\n");
-        }
-
-        hr = IDirectDrawSurface_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
-        ok(hr == DD_OK, "IDirectDrawSurface_Lock(rect = NULL) failed (0x%08x)\n", hr);
-        hr = IDirectDrawSurface_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
-        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned 0x%08x\n", hr);
-        if(SUCCEEDED(hr)) {
-            hr = IDirectDrawSurface_Unlock(surface, NULL);
-            ok(SUCCEEDED(hr), "Unlock failed (0x%08x)\n", hr);
-        }
-        hr = IDirectDrawSurface_Unlock(surface, NULL);
-        ok(SUCCEEDED(hr), "Unlock failed (0x%08x)\n", hr);
-
-        memset(&locked_desc, 0, sizeof(locked_desc));
-        locked_desc.dwSize = sizeof(locked_desc);
-        hr = IDirectDrawSurface_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
-        ok(hr == DD_OK, "IDirectDrawSurface_Lock(rect = [%d, %d]->[%d, %d]) failed (0x%08x)\n",
-           valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
-        hr = IDirectDrawSurface_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
-        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (0x%08x)\n",
-           valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
-
-        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
-         * Afterwards unlocking the surface fails(NULL rectangle, and both locked rectangles
-         */
-
-        hr = IDirectDrawSurface_Unlock(surface, NULL);
-        ok(hr == DD_OK, "Unlock returned (0x%08x)\n", hr);
-
-        IDirectDrawSurface_Release(surface);
-    }
-}
-
 static void CompressedTest(void)
 {
     HRESULT hr;
@@ -3788,7 +3668,6 @@ START_TEST(dsurface)
     GetDDInterface_7();
     EnumTest();
     CubeMapTest();
-    test_lockrect_invalid();
     CompressedTest();
     SizeTest();
     BltParamTest();
-- 
2.4.10




More information about the wine-patches mailing list