diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c index bdede777c9..394d52786a 100644 --- a/dlls/d3d9/surface.c +++ b/dlls/d3d9/surface.c @@ -263,7 +263,10 @@ static HRESULT WINAPI IDirect3DSurface9Impl_ReleaseDC(LPDIRECT3DSURFACE9 iface, EnterCriticalSection(&d3d9_cs); hr = IWineD3DSurface_ReleaseDC(This->wineD3DSurface, hdc); LeaveCriticalSection(&d3d9_cs); - return hr; + switch(hr) { + case WINEDDERR_NODC: return WINED3DERR_INVALIDCALL; + default: return hr; + } } diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c index 1ad07ec073..91669ff19c 100644 --- a/dlls/ddraw/tests/dsurface.c +++ b/dlls/ddraw/tests/dsurface.c @@ -2764,6 +2764,101 @@ static BOOL can_create_primary_surface(void) return TRUE; } +static void dctest_surf(IDirectDrawSurface *surf, int ddsdver) { + HRESULT hr; + HDC dc, dc2 = (HDC) 0x1234; + DDSURFACEDESC ddsd; + DDSURFACEDESC2 ddsd2; + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + memset(&ddsd2, 0, sizeof(ddsd2)); + ddsd2.dwSize = sizeof(ddsd2); + + hr = IDirectDrawSurface_GetDC(surf, &dc); + ok(hr == DD_OK, "IDirectDrawSurface_GetDC failed: 0x%08x\n", hr); + + hr = IDirectDrawSurface_GetDC(surf, &dc2); + ok(hr == DDERR_DCALREADYCREATED, "IDirectDrawSurface_GetDC failed: 0x%08x\n", hr); + ok(dc2 == (HDC) 0x1234, "The failed GetDC call changed the dc: %p\n", dc2); + + hr = IDirectDrawSurface_Lock(surf, NULL, ddsdver == 1 ? &ddsd : ((DDSURFACEDESC *) &ddsd2), 0, NULL); + ok(hr == DDERR_SURFACEBUSY, "IDirectDrawSurface_Lock returned 0x%08x, expected DDERR_ALREADYLOCKED\n", hr); + + hr = IDirectDrawSurface_ReleaseDC(surf, dc); + ok(hr == DD_OK, "IDirectDrawSurface_ReleaseDC failed: 0x%08x\n", hr); + hr = IDirectDrawSurface_ReleaseDC(surf, dc); + ok(hr == DDERR_NODC, "IDirectDrawSurface_ReleaseDC returned 0x%08x, expected DDERR_NODC\n", hr); +} + +static void GetDCTest(void) +{ + DDSURFACEDESC ddsd; + DDSURFACEDESC2 ddsd2; + IDirectDrawSurface *surf; + IDirectDrawSurface2 *surf2; + IDirectDrawSurface4 *surf4; + IDirectDrawSurface7 *surf7; + HRESULT hr; + IDirectDraw2 *dd2; + IDirectDraw4 *dd4; + IDirectDraw7 *dd7; + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.dwWidth = 64; + ddsd.dwHeight = 64; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + memset(&ddsd2, 0, sizeof(ddsd2)); + ddsd2.dwSize = sizeof(ddsd2); + ddsd2.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd2.dwWidth = 64; + ddsd2.dwHeight = 64; + ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surf, NULL); + ok(hr == DD_OK, "IDirectDraw_CreateSurface failed: 0x%08x\n", hr); + dctest_surf(surf, 1); + IDirectDrawSurface_Release(surf); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw2, (void **) &dd2); + ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + hr = IDirectDraw2_CreateSurface(dd2, &ddsd, &surf, NULL); + ok(hr == DD_OK, "IDirectDraw2_CreateSurface failed: 0x%08x\n", hr); + dctest_surf(surf, 1); + + hr = IDirectDrawSurface_QueryInterface(surf, &IID_IDirectDrawSurface2, (void **) &surf2); + ok(hr == DD_OK, "IDirectDrawSurface_QueryInterface failed: 0x%08x\n", hr); + dctest_surf((IDirectDrawSurface *) surf2, 1); + + IDirectDrawSurface2_Release(surf2); + IDirectDrawSurface_Release(surf); + IDirectDraw2_Release(dd2); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void **) &dd4); + ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + surf = NULL; + hr = IDirectDraw4_CreateSurface(dd4, &ddsd2, &surf4, NULL); + ok(hr == DD_OK, "IDirectDraw4_CreateSurface failed: 0x%08x\n", hr); + dctest_surf((IDirectDrawSurface *) surf4, 2); + + IDirectDrawSurface4_Release(surf4); + IDirectDraw4_Release(dd4); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7); + ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + surf = NULL; + hr = IDirectDraw7_CreateSurface(dd7, &ddsd2, &surf7, NULL); + ok(hr == DD_OK, "IDirectDraw7_CreateSurface failed: 0x%08x\n", hr); + dctest_surf((IDirectDrawSurface *) surf7, 2); + + IDirectDrawSurface7_Release(surf7); + IDirectDraw7_Release(dd7); +} + START_TEST(dsurface) { HRESULT ret; @@ -2806,5 +2901,6 @@ START_TEST(dsurface) StructSizeTest(); PaletteTest(); SurfaceCapsTest(); + GetDCTest(); ReleaseDirectDraw(); } diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 3aca76c5c7..2837740680 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1527,11 +1527,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_ReleaseDC(IWineD3DSurface *iface, HDC TRACE("(%p)->(%p)\n",This,hDC); if (!(This->Flags & SFLAG_DCINUSE)) - return WINED3DERR_INVALIDCALL; + return WINEDDERR_NODC; if (This->hDC !=hDC) { WARN("Application tries to release an invalid DC(%p), surface dc is %p\n", hDC, This->hDC); - return WINED3DERR_INVALIDCALL; + return WINEDDERR_NODC; } if((This->Flags & SFLAG_PBO) && This->resource.allocatedMemory) { diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c index d06245866d..07a13b5c67 100644 --- a/dlls/wined3d/surface_gdi.c +++ b/dlls/wined3d/surface_gdi.c @@ -442,11 +442,11 @@ static HRESULT WINAPI IWineGDISurfaceImpl_ReleaseDC(IWineD3DSurface *iface, HDC TRACE("(%p)->(%p)\n",This,hDC); if (!(This->Flags & SFLAG_DCINUSE)) - return WINED3DERR_INVALIDCALL; + return WINEDDERR_NODC; if (This->hDC !=hDC) { WARN("Application tries to release an invalid DC(%p), surface dc is %p\n", hDC, This->hDC); - return WINED3DERR_INVALIDCALL; + return WINEDDERR_NODC; } /* we locked first, so unlock now */