[PATCH] DDraw: Add a test for IDirectDrawSurface::GetDC=0A=

Stefan Doesinger stefan at codeweavers.com
Tue Dec 16 00:01:11 CST 2008


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

------=_NextPart_000_0001_01C96C80.17D860C0--




More information about the wine-patches mailing list