Henri Verbeet : ddraw: Implement GetSurfaceFromDC().

Alexandre Julliard julliard at winehq.org
Thu Apr 20 12:35:11 CDT 2017


Module: wine
Branch: stable
Commit: 8624e3ee701c15f35bb9fa08a233b3bb41f41d65
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8624e3ee701c15f35bb9fa08a233b3bb41f41d65

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Feb 10 13:58:58 2017 +0100

ddraw: Implement GetSurfaceFromDC().

Many thanks to Dmitry Timoshkov for helping figure this out.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit ebcf5196fc150b6ed4bf4891d3f5b0ebe08d625c)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/ddraw/ddraw.spec     |  2 +-
 dlls/ddraw/main.c         | 34 ++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw4.c | 39 ++++++++++++++++++++++++++++++++++++++-
 dlls/ddraw/tests/ddraw7.c | 41 +++++++++++++++++++++++++++++++++++++++--
 4 files changed, 112 insertions(+), 4 deletions(-)

diff --git a/dlls/ddraw/ddraw.spec b/dlls/ddraw/ddraw.spec
index 7575091..a6cf141 100644
--- a/dlls/ddraw/ddraw.spec
+++ b/dlls/ddraw/ddraw.spec
@@ -15,7 +15,7 @@
 @ stdcall -private DllRegisterServer()
 @ stdcall -private DllUnregisterServer()
 @ stub GetNextMipMap
-@ stub GetSurfaceFromDC
+@ stdcall GetSurfaceFromDC(ptr ptr ptr)
 @ stub HeapVidMemAllocAligned
 @ stub InternalLock
 @ stub InternalUnlock
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index bb9e37f..abf20f9 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -200,6 +200,40 @@ void *ddraw_get_object(struct ddraw_handle_table *t, DWORD handle, enum ddraw_ha
     return entry->object;
 }
 
+HRESULT WINAPI GetSurfaceFromDC(HDC dc, IDirectDrawSurface4 **surface, HDC *device_dc)
+{
+    struct ddraw *ddraw;
+
+    TRACE("dc %p, surface %p, device_dc %p.\n", dc, surface, device_dc);
+
+    if (!surface)
+        return E_INVALIDARG;
+
+    if (!device_dc)
+    {
+        *surface = NULL;
+
+        return E_INVALIDARG;
+    }
+
+    wined3d_mutex_lock();
+    LIST_FOR_EACH_ENTRY(ddraw, &global_ddraw_list, struct ddraw, ddraw_list_entry)
+    {
+        if (FAILED(IDirectDraw4_GetSurfaceFromDC(&ddraw->IDirectDraw4_iface, dc, surface)))
+            continue;
+
+        *device_dc = NULL; /* FIXME */
+        wined3d_mutex_unlock();
+        return DD_OK;
+    }
+    wined3d_mutex_unlock();
+
+    *surface = NULL;
+    *device_dc = NULL;
+
+    return DDERR_NOTFOUND;
+}
+
 /***********************************************************************
  *
  * Helper function for DirectDrawCreate and friends
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 2dc272c..40bfaaf 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -24,6 +24,8 @@
 #include <math.h>
 #include "d3d.h"
 
+HRESULT WINAPI GetSurfaceFromDC(HDC dc, struct IDirectDrawSurface **surface, HDC *device_dc);
+
 static BOOL is_ddraw64 = sizeof(DWORD) != sizeof(DWORD *);
 static DEVMODEW registry_mode;
 
@@ -12734,10 +12736,11 @@ static void test_get_surface_from_dc(void)
     IDirectDrawSurface4 *surface;
     DDSURFACEDESC2 surface_desc;
     IDirectDraw4 *ddraw;
+    HDC dc, device_dc;
     ULONG refcount;
     HWND window;
     HRESULT hr;
-    HDC dc;
+    DWORD ret;
 
     window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
             0, 0, 640, 480, 0, 0, 0, 0);
@@ -12766,6 +12769,33 @@ static void test_get_surface_from_dc(void)
     hr = IDirectDrawSurface4_GetDC(surface, &dc);
     ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr);
 
+    tmp = (void *)0xdeadbeef;
+    device_dc = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(NULL, &tmp, &device_dc);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp, "Got unexpected surface %p.\n", tmp);
+    ok(!device_dc, "Got unexpected device_dc %p.\n", device_dc);
+
+    device_dc = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(dc, NULL, &device_dc);
+    ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+    ok(device_dc == (void *)0xdeadbeef, "Got unexpected device_dc %p.\n", device_dc);
+
+    tmp = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(dc, &tmp, NULL);
+    ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp, "Got unexpected surface %p.\n", tmp);
+
+    hr = GetSurfaceFromDC(dc, &tmp, &device_dc);
+    ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
+    ok(tmp == surface1, "Got unexpected surface %p, expected %p.\n", tmp, surface1);
+    IDirectDrawSurface_Release(tmp);
+
+    ret = GetObjectType(device_dc);
+    todo_wine ok(ret == OBJ_DC, "Got unexpected object type %#x.\n", ret);
+    ret = GetDeviceCaps(device_dc, TECHNOLOGY);
+    todo_wine ok(ret == DT_RASDISPLAY, "Got unexpected technology %#x.\n", ret);
+
     hr = IDirectDraw4_GetSurfaceFromDC(ddraw, dc, NULL);
     ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
 
@@ -12787,6 +12817,13 @@ static void test_get_surface_from_dc(void)
     ok(!!dc, "CreateCompatibleDC failed.\n");
 
     tmp = (void *)0xdeadbeef;
+    device_dc = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(dc, &tmp, &device_dc);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp, "Got unexpected surface %p.\n", tmp);
+    ok(!device_dc, "Got unexpected device_dc %p.\n", device_dc);
+
+    tmp = (void *)0xdeadbeef;
     hr = IDirectDraw4_GetSurfaceFromDC(ddraw, dc, (IDirectDrawSurface4 **)&tmp);
     ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
     ok(!tmp, "Got unexpected surface %p.\n", tmp);
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 1bc9a43..1dd7cb1 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -24,6 +24,8 @@
 #include <math.h>
 #include "d3d.h"
 
+HRESULT WINAPI GetSurfaceFromDC(HDC dc, struct IDirectDrawSurface **surface, HDC *device_dc);
+
 static HRESULT (WINAPI *pDirectDrawCreateEx)(GUID *guid, void **ddraw, REFIID iid, IUnknown *outer_unknown);
 static BOOL is_ddraw64 = sizeof(DWORD) != sizeof(DWORD *);
 static DEVMODEW registry_mode;
@@ -12403,14 +12405,15 @@ static void test_surface_desc_size(void)
 
 static void test_get_surface_from_dc(void)
 {
+    IDirectDrawSurface *surface1, *tmp1;
     IDirectDrawSurface7 *surface, *tmp;
-    IDirectDrawSurface *surface1;
     DDSURFACEDESC2 surface_desc;
     IDirectDraw7 *ddraw;
+    HDC dc, device_dc;
     ULONG refcount;
     HWND window;
     HRESULT hr;
-    HDC dc;
+    DWORD ret;
 
     window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
             0, 0, 640, 480, 0, 0, 0, 0);
@@ -12439,6 +12442,33 @@ static void test_get_surface_from_dc(void)
     hr = IDirectDrawSurface7_GetDC(surface, &dc);
     ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr);
 
+    tmp1 = (void *)0xdeadbeef;
+    device_dc = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(NULL, &tmp1, &device_dc);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp1, "Got unexpected surface %p.\n", tmp1);
+    ok(!device_dc, "Got unexpected device_dc %p.\n", device_dc);
+
+    device_dc = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(dc, NULL, &device_dc);
+    ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+    ok(device_dc == (void *)0xdeadbeef, "Got unexpected device_dc %p.\n", device_dc);
+
+    tmp1 = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(dc, &tmp1, NULL);
+    ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp1, "Got unexpected surface %p.\n", tmp1);
+
+    hr = GetSurfaceFromDC(dc, &tmp1, &device_dc);
+    ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
+    ok(tmp1 == surface1, "Got unexpected surface %p, expected %p.\n", tmp1, surface1);
+    IDirectDrawSurface_Release(tmp1);
+
+    ret = GetObjectType(device_dc);
+    todo_wine ok(ret == OBJ_DC, "Got unexpected object type %#x.\n", ret);
+    ret = GetDeviceCaps(device_dc, TECHNOLOGY);
+    todo_wine ok(ret == DT_RASDISPLAY, "Got unexpected technology %#x.\n", ret);
+
     hr = IDirectDraw7_GetSurfaceFromDC(ddraw, dc, NULL);
     ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
 
@@ -12459,6 +12489,13 @@ static void test_get_surface_from_dc(void)
     dc = CreateCompatibleDC(NULL);
     ok(!!dc, "CreateCompatibleDC failed.\n");
 
+    tmp1 = (void *)0xdeadbeef;
+    device_dc = (void *)0xdeadbeef;
+    hr = GetSurfaceFromDC(dc, &tmp1, &device_dc);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp1, "Got unexpected surface %p.\n", tmp1);
+    ok(!device_dc, "Got unexpected device_dc %p.\n", device_dc);
+
     tmp = (void *)0xdeadbeef;
     hr = IDirectDraw7_GetSurfaceFromDC(ddraw, dc, &tmp);
     ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);




More information about the wine-cvs mailing list