Module: wine Branch: master Commit: df5116cc7da2dbd26abf58b3442bdd889595d8f0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=df5116cc7da2dbd26abf58b344...
Author: Günther Brammer GBrammer@gmx.de Date: Mon Feb 25 16:22:41 2008 +0100
ddraw: Return a nullpointer as lpSurface in Lock() if the rect is invalid.
---
dlls/ddraw/surface.c | 32 ++++++++++++++++++-------------- dlls/ddraw/tests/dsurface.c | 4 ++++ 2 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index a167806..ae57bb4 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -577,20 +577,6 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface,
/* This->surface_desc.dwWidth and dwHeight are changeable, thus lock */ EnterCriticalSection(&ddraw_cs); - if (Rect) - { - if ((Rect->left < 0) - || (Rect->top < 0) - || (Rect->left > Rect->right) - || (Rect->top > Rect->bottom) - || (Rect->right > This->surface_desc.dwWidth) - || (Rect->bottom > This->surface_desc.dwHeight)) - { - WARN("Trying to lock an invalid rectangle, returning DDERR_INVALIDPARAMS\n"); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - }
/* Should I check for the handle to be NULL? * @@ -606,6 +592,24 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface, return DDERR_INVALIDPARAMS; }
+ /* Windows zeroes this if the rect is invalid */ + DDSD->lpSurface = 0; + + if (Rect) + { + if ((Rect->left < 0) + || (Rect->top < 0) + || (Rect->left > Rect->right) + || (Rect->top > Rect->bottom) + || (Rect->right > This->surface_desc.dwWidth) + || (Rect->bottom > This->surface_desc.dwHeight)) + { + WARN("Trying to lock an invalid rectangle, returning DDERR_INVALIDPARAMS\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_INVALIDPARAMS; + } + } + hr = IWineD3DSurface_LockRect(This->WineD3DSurface, &LockedRect, Rect, diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c index cc7760e..cf3ae6f 100644 --- a/dlls/ddraw/tests/dsurface.c +++ b/dlls/ddraw/tests/dsurface.c @@ -1652,10 +1652,14 @@ static void test_lockrect_invalid(void) { 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);