static HRESULT WINAPI enumsurfaces_thunk_cb(IDirectDrawSurface4 *surf, DDSURFACEDESC2 *desc2, void *vctx) { struct ddrawex_surface *surface = unsafe_impl_from_IDirectDrawSurface4(surf); struct enumsurfaces_thunk *ctx = vctx; DDSURFACEDESC desc; TRACE("Thunking back to IDirectDrawSurface3\n"); IDirectDrawSurface3_AddRef(&surface->IDirectDrawSurface3_iface); IDirectDrawSurface3_Release(surf); DDSD2_to_DDSD(desc2, &desc); return ctx->orig_cb((IDirectDrawSurface *)&surface->IDirectDrawSurface3_iface, &desc, ctx->orig_ctx); }
static void GetDCTest_main(DDSURFACEDESC *ddsd, DDSURFACEDESC2 *ddsd2, void (*testfunc)(IDirectDrawSurface *surf, int ddsdver)) { IDirectDrawSurface *surf; IDirectDrawSurface2 *surf2; IDirectDrawSurface2 *surf3; IDirectDrawSurface4 *surf4; HRESULT hr; IDirectDraw *dd1 = createDD(); IDirectDraw2 *dd2; IDirectDraw3 *dd3; IDirectDraw4 *dd4; hr = IDirectDraw_CreateSurface(dd1, ddsd, &surf, NULL); if (hr == DDERR_UNSUPPORTEDMODE) { win_skip("Unsupported mode\n"); return; } ok(hr == DD_OK, "IDirectDraw_CreateSurface failed: 0x%08x\n", hr); testfunc(surf, 1); IDirectDrawSurface_Release(surf); hr = IDirectDraw_QueryInterface(dd1, &IID_IDirectDraw2, (void **) &dd2); ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); hr = IDirectDraw2_CreateSurface(dd2, ddsd, &surf, NULL); ok(hr == DD_OK, "IDirectDraw2_CreateSurface failed: 0x%08x\n", hr); testfunc(surf, 1); hr = IDirectDrawSurface_QueryInterface(surf, &IID_IDirectDrawSurface2, (void **) &surf2); ok(hr == DD_OK, "IDirectDrawSurface_QueryInterface failed: 0x%08x\n", hr); testfunc((IDirectDrawSurface *) surf2, 1); IDirectDrawSurface2_Release(surf2); IDirectDrawSurface_Release(surf); IDirectDraw2_Release(dd2); hr = IDirectDraw_QueryInterface(dd1, &IID_IDirectDraw3, (void **) &dd3); ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); hr = IDirectDraw3_CreateSurface(dd3, ddsd, &surf, NULL); ok(hr == DD_OK, "IDirectDraw3_CreateSurface failed: 0x%08x\n", hr); testfunc(surf, 1); hr = IDirectDrawSurface_QueryInterface(surf, &IID_IDirectDrawSurface3, (void **) &surf3); ok(hr == DD_OK, "IDirectDrawSurface_QueryInterface failed: 0x%08x\n", hr); testfunc((IDirectDrawSurface *) surf3, 1); IDirectDrawSurface3_Release(surf3); IDirectDrawSurface_Release(surf); IDirectDraw3_Release(dd3); hr = IDirectDraw_QueryInterface(dd1, &IID_IDirectDraw4, (void **) &dd4); ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); surf = NULL; hr = IDirectDraw4_CreateSurface(dd4, ddsd2, &surf4, NULL); ok(hr == DD_OK, "IDirectDraw4_CreateSurface failed: 0x%08x\n", hr); testfunc((IDirectDrawSurface *) surf4, 2); IDirectDrawSurface4_Release(surf4); IDirectDraw4_Release(dd4); IDirectDraw_Release(dd1); }
static void test_surface_from_dc3(void) { IDirectDrawSurface3 *surf3; IDirectDrawSurface *surf1; IDirectDrawSurface *tmp; DDSURFACEDESC ddsd; IDirectDraw3 *dd3; IDirectDraw *dd1; HRESULT hr; HDC dc; dd1 = createDD(); hr = IDirectDraw_QueryInterface(dd1, &IID_IDirectDraw3, (void **)&dd3); ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed, hr %#x.\n", hr); IDirectDraw_Release(dd1); memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = 64; ddsd.dwHeight = 64; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; hr = IDirectDraw3_CreateSurface(dd3, &ddsd, &surf1, NULL); if (hr == DDERR_UNSUPPORTEDMODE) { win_skip("Unsupported mode\n"); IDirectDraw3_Release(dd3); return; } ok(SUCCEEDED(hr), "CreateSurface failed, hr %#x.\n", hr); hr = IDirectDrawSurface3_QueryInterface(surf1, &IID_IDirectDrawSurface, (void **)&surf3); ok(SUCCEEDED(hr), "QueryInterface failed, hr %#x.\n", hr); IDirectDrawSurface_Release(surf1); hr = IDirectDrawSurface3_GetDC(surf3, &dc); ok(SUCCEEDED(hr), "GetDC failed, hr %#x.\n", hr); hr = IDirectDraw3_GetSurfaceFromDC(dd3, dc, NULL); ok(hr == E_POINTER, "Expected E_POINTER, got %#x.\n", hr); hr = IDirectDraw3_GetSurfaceFromDC(dd3, dc, &tmp); ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr); ok((IDirectDrawSurface3 *)tmp == surf3, "Expected surface != %p.\n", surf3); IUnknown_Release(tmp); hr = IDirectDrawSurface3_ReleaseDC(surf3, dc); ok(SUCCEEDED(hr), "ReleaseDC failed, hr %#x.\n", hr); dc = CreateCompatibleDC(NULL); ok(!!dc, "CreateCompatibleDC failed.\n"); tmp = (IDirectDrawSurface *)0xdeadbeef; hr = IDirectDraw3_GetSurfaceFromDC(dd3, dc, &tmp); ok(hr == DDERR_NOTFOUND, "Expected DDERR_NOTFOUND, got %#x.\n", hr); ok(!tmp, "Expected surface NULL, got %p.\n", tmp); ok(DeleteDC(dc), "DeleteDC failed.\n"); IDirectDrawSurface3_Release(surf3); IDirectDraw3_Release(dd3); }