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