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