static HRESULT d2d_dc_render_target_present(IUnknown *outer_unknown) { struct d2d_dc_render_target *render_target = impl_from_IUnknown(outer_unknown); const RECT *dst_rect = &render_target->dst_rect; RECT empty_rect; HDC src_hdc; HRESULT hr; if (!render_target->hdc) return D2DERR_WRONG_STATE; if (FAILED(hr = IDXGISurface1_GetDC(render_target->dxgi_surface, FALSE, &src_hdc))) { WARN("GetDC() failed, %#x.\n", hr); return S_OK; } BitBlt(render_target->hdc, dst_rect->left, dst_rect->top, dst_rect->right - dst_rect->left, dst_rect->bottom - dst_rect->top, src_hdc, 0, 0, SRCCOPY); SetRectEmpty(&empty_rect); IDXGISurface1_ReleaseDC(render_target->dxgi_surface, &empty_rect); return S_OK; }
static void test_getdc(void) { struct device_desc device_desc; D3D10_TEXTURE2D_DESC desc; ID3D10Texture2D *texture; IDXGISurface1 *surface1; ID3D10Device1 *device; ULONG refcount; HRESULT hr; HDC dc; device_desc.feature_level = D3D10_FEATURE_LEVEL_10_1; device_desc.flags = D3D10_CREATE_DEVICE_BGRA_SUPPORT; if (!(device = create_device(&device_desc))) { skip("Failed to create device.\n"); return; } /* Without D3D10_RESOURCE_MISC_GDI_COMPATIBLE. */ desc.Width = 512; desc.Height = 512; desc.MipLevels = 1; desc.ArraySize = 1; desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D10_USAGE_DEFAULT; desc.BindFlags = D3D10_BIND_RENDER_TARGET; desc.CPUAccessFlags = 0; desc.MiscFlags = 0; hr = ID3D10Device1_CreateTexture2D(device, &desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr); hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface1, (void**)&surface1); ok(SUCCEEDED(hr), "Failed to get IDXGISurface1 interface, hr %#x.\n", hr); hr = IDXGISurface1_GetDC(surface1, FALSE, &dc); todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr); IDXGISurface1_Release(surface1); ID3D10Texture2D_Release(texture); desc.MiscFlags = D3D10_RESOURCE_MISC_GDI_COMPATIBLE; hr = ID3D10Device1_CreateTexture2D(device, &desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr); hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface1, (void**)&surface1); ok(SUCCEEDED(hr), "Failed to get IDXGISurface1 interface, hr %#x.\n", hr); hr = IDXGISurface1_ReleaseDC(surface1, NULL); todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr); hr = IDXGISurface1_GetDC(surface1, FALSE, &dc); todo_wine ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr); /* One more time. */ dc = (HDC)0xdeadbeef; hr = IDXGISurface1_GetDC(surface1, FALSE, &dc); todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr); ok(dc == (HDC)0xdeadbeef, "Got unexpected dc %p.\n", dc); hr = IDXGISurface1_ReleaseDC(surface1, NULL); todo_wine ok(SUCCEEDED(hr), "Failed to release DC, hr %#x.\n", hr); hr = IDXGISurface1_ReleaseDC(surface1, NULL); todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr); IDXGISurface1_Release(surface1); ID3D10Texture2D_Release(texture); refcount = ID3D10Device1_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); }