Module: wine Branch: master Commit: c15d89c803f8ac7f7052cec448d8e3a26f5a3205 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c15d89c803f8ac7f7052cec448...
Author: Stefan Dösinger stefan@codeweavers.com Date: Tue Dec 3 13:44:35 2013 +0100
ddraw: SetSurfaceDesc accepts DDSD_CAPS with dwCaps=0.
---
dlls/ddraw/surface.c | 2 +- dlls/ddraw/tests/ddraw2.c | 10 +++++++++- dlls/ddraw/tests/ddraw4.c | 13 ++++++++++++- dlls/ddraw/tests/ddraw7.c | 13 ++++++++++++- 4 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index efa7f66..9966e50 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -4264,7 +4264,7 @@ static HRESULT WINAPI ddraw_surface7_SetSurfaceDesc(IDirectDrawSurface7 *iface, WARN("DDSD_LPSURFACE is not set, returning DDERR_INVALIDPARAMS\n"); return DDERR_INVALIDPARAMS; } - if (DDSD->dwFlags & DDSD_CAPS) + if ((DDSD->dwFlags & DDSD_CAPS) && DDSD->ddsCaps.dwCaps) { WARN("DDSD_CAPS is set, returning DDERR_INVALIDCAPS.\n"); return DDERR_INVALIDCAPS; diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 154e1b2..ff03207 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -4476,6 +4476,7 @@ static void test_set_surface_desc(void)
hr = IDirectDrawSurface3_GetSurfaceDesc(surface3, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); + ok(ddsd.ddsCaps.dwCaps == DDSCAPS_SYSTEMMEMORY, "Got unexpected caps %#x.\n", ddsd.ddsCaps.dwCaps);
/* Setting the caps is an error. This also means the original description cannot be reapplied. */ hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); @@ -4485,7 +4486,7 @@ static void test_set_surface_desc(void) hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); ok(hr == DDERR_INVALIDPARAMS, "Setting DDSD_CAPS returned %#x.\n", hr);
- /* TODO: The INVALIDCAPS return value suggests that some caps can be set. */ + /* dwCaps = 0 is allowed, but ignored. */ ddsd.dwFlags = DDSD_CAPS | DDSD_LPSURFACE; ddsd.lpSurface = data; hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); @@ -4493,6 +4494,13 @@ static void test_set_surface_desc(void) ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); ok(hr == DDERR_INVALIDCAPS, "Setting DDSD_CAPS returned %#x.\n", hr); + ddsd.ddsCaps.dwCaps = 0; + hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); + ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr); + + hr = IDirectDrawSurface3_GetSurfaceDesc(surface3, &ddsd); + ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); + ok(ddsd.ddsCaps.dwCaps == DDSCAPS_SYSTEMMEMORY, "Got unexpected caps %#x.\n", ddsd.ddsCaps.dwCaps);
/* Setting the height is allowed, but it cannot be set to 0, and only if LPSURFACE is set too. */ reset_ddsd(&ddsd); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 6012f73..cfc2ac4 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -5077,6 +5077,8 @@ static void test_set_surface_desc(void)
hr = IDirectDrawSurface4_GetSurfaceDesc(surface, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); + ok(ddsd.ddsCaps.dwCaps == DDSCAPS_SYSTEMMEMORY, "Got unexpected caps %#x.\n", ddsd.ddsCaps.dwCaps); + ok(ddsd.ddsCaps.dwCaps2 == 0, "Got unexpected caps2 %#x.\n", 0);
/* Setting the caps is an error. This also means the original description cannot be reapplied. */ hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0); @@ -5086,7 +5088,7 @@ static void test_set_surface_desc(void) hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0); ok(hr == DDERR_INVALIDPARAMS, "Setting DDSD_CAPS returned %#x.\n", hr);
- /* TODO: The INVALIDCAPS return value suggests that some caps can be set. */ + /* dwCaps = 0 is allowed, but ignored. Caps2 can be anything and is ignored too. */ ddsd.dwFlags = DDSD_CAPS | DDSD_LPSURFACE; ddsd.lpSurface = data; hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0); @@ -5094,6 +5096,15 @@ static void test_set_surface_desc(void) ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0); ok(hr == DDERR_INVALIDCAPS, "Setting DDSD_CAPS returned %#x.\n", hr); + ddsd.ddsCaps.dwCaps = 0; + ddsd.ddsCaps.dwCaps2 = 0xdeadbeef; + hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0); + ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr); + + hr = IDirectDrawSurface4_GetSurfaceDesc(surface, &ddsd); + ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); + ok(ddsd.ddsCaps.dwCaps == DDSCAPS_SYSTEMMEMORY, "Got unexpected caps %#x.\n", ddsd.ddsCaps.dwCaps); + ok(ddsd.ddsCaps.dwCaps2 == 0, "Got unexpected caps2 %#x.\n", 0);
/* Setting the height is allowed, but it cannot be set to 0, and only if LPSURFACE is set too. */ reset_ddsd(&ddsd); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 26bb82c..72e7f2e 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -4964,6 +4964,8 @@ static void test_set_surface_desc(void)
hr = IDirectDrawSurface7_GetSurfaceDesc(surface, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); + ok(ddsd.ddsCaps.dwCaps == DDSCAPS_SYSTEMMEMORY, "Got unexpected caps %#x.\n", ddsd.ddsCaps.dwCaps); + ok(ddsd.ddsCaps.dwCaps2 == 0, "Got unexpected caps2 %#x.\n", 0);
/* Setting the caps is an error. This also means the original description cannot be reapplied. */ hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0); @@ -4973,7 +4975,7 @@ static void test_set_surface_desc(void) hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0); ok(hr == DDERR_INVALIDPARAMS, "Setting DDSD_CAPS returned %#x.\n", hr);
- /* TODO: The INVALIDCAPS return value suggests that some caps can be set. */ + /* dwCaps = 0 is allowed, but ignored. Caps2 can be anything and is ignored too. */ ddsd.dwFlags = DDSD_CAPS | DDSD_LPSURFACE; ddsd.lpSurface = data; hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0); @@ -4981,6 +4983,15 @@ static void test_set_surface_desc(void) ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0); ok(hr == DDERR_INVALIDCAPS, "Setting DDSD_CAPS returned %#x.\n", hr); + ddsd.ddsCaps.dwCaps = 0; + ddsd.ddsCaps.dwCaps2 = 0xdeadbeef; + hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0); + ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr); + + hr = IDirectDrawSurface7_GetSurfaceDesc(surface, &ddsd); + ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); + ok(ddsd.ddsCaps.dwCaps == DDSCAPS_SYSTEMMEMORY, "Got unexpected caps %#x.\n", ddsd.ddsCaps.dwCaps); + ok(ddsd.ddsCaps.dwCaps2 == 0, "Got unexpected caps2 %#x.\n", 0);
/* Setting the height is allowed, but it cannot be set to 0, and only if LPSURFACE is set too. */ reset_ddsd(&ddsd);