Henri Verbeet : ddraw: Fix IDirectDraw4Impl_GetSurfaceFromDC().

Alexandre Julliard julliard at winehq.org
Wed Mar 17 12:19:05 CDT 2010


Module: wine
Branch: master
Commit: 89fef0e669dcf323b6eeb481edfe9c91f68f4840
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=89fef0e669dcf323b6eeb481edfe9c91f68f4840

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar 16 19:02:22 2010 +0100

ddraw: Fix IDirectDraw4Impl_GetSurfaceFromDC().

Perhaps interesting to note is that this returns an IDirectDrawSurface instead
of an IDirectDrawSurface4.

---

 dlls/ddraw/ddraw_thunks.c   |   10 +++++++++-
 dlls/ddraw/tests/dsurface.c |   32 ++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletions(-)

diff --git a/dlls/ddraw/ddraw_thunks.c b/dlls/ddraw/ddraw_thunks.c
index 278d720..28991d1 100644
--- a/dlls/ddraw/ddraw_thunks.c
+++ b/dlls/ddraw/ddraw_thunks.c
@@ -1048,7 +1048,15 @@ static HRESULT WINAPI
 IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC,
 				  LPDIRECTDRAWSURFACE4 *pSurf)
 {
-    return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
+    IDirectDrawSurface7 *surf7;
+    HRESULT hr;
+
+    if (!pSurf) return E_INVALIDARG;
+
+    hr = IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(This), hDC, &surf7);
+    *pSurf = surf7 ? (IDirectDrawSurface4 *)&((IDirectDrawSurfaceImpl *)surf7)->IDirectDrawSurface3_vtbl : NULL;
+
+    return hr;
 }
 
 static HRESULT WINAPI
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index f323ef0..bfd5eae 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -3008,6 +3008,7 @@ static void GetDCTest(void)
     IDirectDrawSurface2 *surf2;
     IDirectDrawSurface4 *surf4;
     IDirectDrawSurface7 *surf7;
+    IDirectDrawSurface *tmp;
     IDirectDrawSurface7 *tmp7;
     HRESULT hr;
     IDirectDraw2 *dd2;
@@ -3056,6 +3057,37 @@ static void GetDCTest(void)
     ok(hr == DD_OK, "IDirectDraw4_CreateSurface failed: 0x%08x\n", hr);
     dctest_surf((IDirectDrawSurface *) surf4, 2);
 
+    hr = IDirectDrawSurface4_QueryInterface(surf4, &IID_IDirectDrawSurface, (void **)&surf);
+    ok(SUCCEEDED(hr), "QueryInterface failed, hr %#x.\n", hr);
+
+    hr = IDirectDrawSurface4_GetDC(surf4, &dc);
+    ok(SUCCEEDED(hr), "GetDC failed, hr %#x.\n", hr);
+
+    hr = IDirectDraw4_GetSurfaceFromDC(dd4, dc, NULL);
+    ok(hr == E_INVALIDARG, "Expected hr E_INVALIDARG, got %#x.\n", hr);
+
+    hr = IDirectDraw4_GetSurfaceFromDC(dd4, dc, (IDirectDrawSurface4 **)&tmp);
+    ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
+    ok(tmp == surf, "Expected surface %p, got %p.\n\n", surf, tmp);
+
+    hr = IDirectDrawSurface4_ReleaseDC(surf4, dc);
+    ok(SUCCEEDED(hr), "ReleaseDC failed, hr %#x.\n", hr);
+
+    dc = CreateCompatibleDC(NULL);
+    ok(!!dc, "CreateCompatibleDC failed.\n");
+
+    tmp = (IDirectDrawSurface *)0xdeadbeef;
+    hr = IDirectDraw4_GetSurfaceFromDC(dd4, dc, (IDirectDrawSurface4 **)&tmp);
+    ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
+    ok(!tmp, "Expected surface NULL, got %p.\n", tmp);
+
+    ok(DeleteDC(dc), "DeleteDC failed.\n");
+
+    tmp = (IDirectDrawSurface *)0xdeadbeef;
+    hr = IDirectDraw4_GetSurfaceFromDC(dd4, NULL, (IDirectDrawSurface4 **)&tmp);
+    ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
+    ok(!tmp, "Expected surface NULL, got %p.\n", tmp);
+
     IDirectDrawSurface4_Release(surf4);
     IDirectDraw4_Release(dd4);
 




More information about the wine-cvs mailing list