From a5c484cbf3948ec824e990503f798d3333ff55fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Thu, 10 May 2007 21:55:14 +0200 Subject: [PATCH] ddraw: GetSurfaceDesc returns the surface memory while the surface is locked. --- dlls/ddraw/surface.c | 12 +++++++++--- dlls/ddraw/tests/dsurface.c | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index a19b8dd092a..98c425ddd2e 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -585,7 +585,6 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface, DDSD->dwSize = sizeof(DDSURFACEDESC2); } - DD_STRUCT_COPY_BYSIZE(DDSD,&(This->surface_desc)); hr = IWineD3DSurface_LockRect(This->WineD3DSurface, &LockedRect, Rect, @@ -596,7 +595,8 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface, * does not set the LPSURFACE flag on locked surfaces !?!. * DDSD->dwFlags |= DDSD_LPSURFACE; */ - DDSD->lpSurface = LockedRect.pBits; + This->surface_desc.lpSurface = LockedRect.pBits; + DD_STRUCT_COPY_BYSIZE(DDSD,&(This->surface_desc)); TRACE("locked surface returning description :\n"); if (TRACE_ON(ddraw)) DDRAW_dump_surface_desc(DDSD); @@ -622,9 +622,15 @@ IDirectDrawSurfaceImpl_Unlock(IDirectDrawSurface7 *iface, RECT *pRect) { ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface); + HRESULT hr; TRACE("(%p)->(%p)\n", This, pRect); - return IWineD3DSurface_UnlockRect(This->WineD3DSurface); + hr = IWineD3DSurface_UnlockRect(This->WineD3DSurface); + if(SUCCEEDED(hr)) + { + This->surface_desc.lpSurface = NULL; + } + return hr; } /***************************************************************************** diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c index a2d7e7a7fad..067306e8e29 100644 --- a/dlls/ddraw/tests/dsurface.c +++ b/dlls/ddraw/tests/dsurface.c @@ -174,8 +174,7 @@ static void SrcColorKey32BlitTest(void) { LPDIRECTDRAWSURFACE lpSrc; LPDIRECTDRAWSURFACE lpDst; - DDSURFACEDESC ddsd; - DDSURFACEDESC ddsd2; + DDSURFACEDESC ddsd, ddsd2, ddsd3; DDCOLORKEY DDColorKey; LPDWORD lpData; HRESULT rc; @@ -211,9 +210,24 @@ static void SrcColorKey32BlitTest(void) lpData[1] = 0xCCCCCCCC; lpData[2] = 0xCCCCCCCC; lpData[3] = 0xCCCCCCCC; + + memset(&ddsd3, 0, sizeof(ddsd3)); + ddsd3.dwSize = sizeof(ddsd3); + U4(ddsd3).ddpfPixelFormat.dwSize = sizeof(U4(ddsd3).ddpfPixelFormat); + rc = IDirectDrawSurface_GetSurfaceDesc(lpDst, &ddsd3); + ok(rc == DD_OK, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc); + ok(ddsd3.lpSurface == ddsd3.lpSurface, "lpSurface from GetSurfaceDesc(%p) differs from the one returned by Lock(%p)\n", ddsd3.lpSurface, ddsd2.lpSurface); + rc = IDirectDrawSurface_Unlock(lpDst, NULL); ok(rc==DD_OK,"Unlock returned: %x\n",rc); + memset(&ddsd3, 0, sizeof(ddsd3)); + ddsd3.dwSize = sizeof(ddsd3); + U4(ddsd3).ddpfPixelFormat.dwSize = sizeof(U4(ddsd3).ddpfPixelFormat); + rc = IDirectDrawSurface_GetSurfaceDesc(lpDst, &ddsd3); + ok(rc == DD_OK, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc); + ok(ddsd3.lpSurface == NULL, "lpSurface from GetSurfaceDesc(%p) is not NULL after unlock\n", ddsd3.lpSurface); + rc = IDirectDrawSurface_Lock(lpSrc, NULL, &ddsd2, DDLOCK_WAIT, NULL); ok(rc==DD_OK,"Lock returned: %x\n",rc); ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");