Stefan Dösinger : ddraw: Add a test for IDirectDrawSurface::GetDC.
Alexandre Julliard
julliard at winehq.org
Sat Jan 3 09:11:28 CST 2009
Module: wine
Branch: master
Commit: 616ea5322647756b9eabb8e1913044b088c9eafb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=616ea5322647756b9eabb8e1913044b088c9eafb
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Tue Dec 16 00:01:11 2008 +0100
ddraw: Add a test for IDirectDrawSurface::GetDC.
---
dlls/d3d9/surface.c | 5 ++-
dlls/ddraw/tests/dsurface.c | 96 +++++++++++++++++++++++++++++++++++++++++++
dlls/wined3d/surface.c | 4 +-
dlls/wined3d/surface_gdi.c | 4 +-
4 files changed, 104 insertions(+), 5 deletions(-)
diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c
index bdede77..394d527 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 1ad07ec..91669ff 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 3aca76c..2837740 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 d062458..07a13b5 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 */
More information about the wine-cvs
mailing list