Module: wine Branch: master Commit: a5c484cbf3948ec824e990503f798d3333ff55fb URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5c484cbf3948ec824e990503f...
Author: Stefan Dösinger stefan@codeweavers.com Date: Thu May 10 21:55:14 2007 +0200
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 a19b8dd..98c425d 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 a2d7e7a..067306e 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");