IDirectDrawSurface7 **Surface)
{
IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
- FIXME("(%p)->(%p,%p): Stub!\n", This, hdc, Surface);
+ IWineD3DSurface *wined3d_surface;
+ HRESULT hr;
+
+ TRACE("iface %p, dc %p, surface %p.\n", iface, hdc, Surface);
+
+ if (!Surface) return E_INVALIDARG;
- /* Implementation idea if needed: Loop through all surfaces and compare
- * their hdc with hdc. Implement it in WineD3D! */
- return DDERR_NOTFOUND;
+ hr = IWineD3DDevice_GetSurfaceFromDC(This->wineD3DDevice, hdc, &wined3d_surface);
+ if (FAILED(hr))
+ {
+ TRACE("No surface found for dc %p.\n", hdc);
+ *Surface = NULL;
+ return DDERR_NOTFOUND;
+ }
+
+ IWineD3DSurface_GetParent(wined3d_surface, (IUnknown **)Surface);
+ TRACE("Returning surface %p.\n", Surface);
+ return DD_OK;
}
/*****************************************************************************
IDirectDrawSurface2 *surf2;
IDirectDrawSurface4 *surf4;
IDirectDrawSurface7 *surf7;
+ IDirectDrawSurface7 *tmp7;
HRESULT hr;
IDirectDraw2 *dd2;
IDirectDraw4 *dd4;
IDirectDraw7 *dd7;
+ HDC dc;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ok(hr == DD_OK, "IDirectDraw7_CreateSurface failed: 0x%08x\n", hr);
dctest_surf((IDirectDrawSurface *) surf7, 2);
+ hr = IDirectDrawSurface7_GetDC(surf7, &dc);
+ ok(SUCCEEDED(hr), "GetDC failed, hr %#x.\n", hr);
+
+ hr = IDirectDraw7_GetSurfaceFromDC(dd7, dc, NULL);
+ ok(hr == E_INVALIDARG, "Expected hr E_INVALIDARG, got %#x.\n", hr);
+
+ hr = IDirectDraw7_GetSurfaceFromDC(dd7, dc, &tmp7);
+ ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
+ ok(tmp7 == surf7, "Expected surface %p, got %p.\n\n", surf7, tmp7);
+ IDirectDrawSurface7_Release(tmp7);
+
+ hr = IDirectDrawSurface7_ReleaseDC(surf7, dc);
+ ok(SUCCEEDED(hr), "ReleaseDC failed, hr %#x.\n", hr);
+
+ dc = CreateCompatibleDC(NULL);
+ ok(!!dc, "CreateCompatibleDC failed.\n");
+
+ tmp7 = (IDirectDrawSurface7 *)0xdeadbeef;
+ hr = IDirectDraw7_GetSurfaceFromDC(dd7, dc, &tmp7);
+ ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
+ ok(!tmp7, "Expected surface NULL, got %p.\n", tmp7);
+
+ ok(DeleteDC(dc), "DeleteDC failed.\n");
+
+ tmp7 = (IDirectDrawSurface7 *)0xdeadbeef;
+ hr = IDirectDraw7_GetSurfaceFromDC(dd7, NULL, (IDirectDrawSurface7 **)&tmp7);
+ ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
+ ok(!tmp7, "Expected surface NULL, got %p.\n", tmp7);
+
IDirectDrawSurface7_Release(surf7);
IDirectDraw7_Release(dd7);
}
return WINED3D_OK;
}
+static HRESULT WINAPI IWineD3DDeviceImpl_GetSurfaceFromDC(IWineD3DDevice *iface, HDC dc, IWineD3DSurface **surface)
+{
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+ IWineD3DResourceImpl *resource;
+
+ LIST_FOR_EACH_ENTRY(resource, &This->resources, IWineD3DResourceImpl, resource.resource_list_entry)
+ {
+ WINED3DRESOURCETYPE type = IWineD3DResource_GetType((IWineD3DResource *)resource);
+ if (type == WINED3DRTYPE_SURFACE)
+ {
+ if (((IWineD3DSurfaceImpl *)resource)->hDC == dc)
+ {
+ TRACE("Found surface %p for dc %p.\n", resource, dc);
+ *surface = (IWineD3DSurface *)resource;
+ return WINED3D_OK;
+ }
+ }
+ }
+
+ return WINED3DERR_INVALIDCALL;
+}
+
/**********************************************************
* IWineD3DDevice VTbl follows
**********************************************************/
IWineD3DDeviceImpl_UpdateSurface,
IWineD3DDeviceImpl_GetFrontBufferData,
/*** object tracking ***/
- IWineD3DDeviceImpl_EnumResources
+ IWineD3DDeviceImpl_EnumResources,
+ IWineD3DDeviceImpl_GetSurfaceFromDC,
};
HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,