From: Akihiro Sagawa sagawa.aki@gmail.com
--- dlls/d2d1/device.c | 9 +++++++ dlls/d2d1/tests/d2d1.c | 55 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+)
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c index 4780acb3bec..d9494d4f90b 100644 --- a/dlls/d2d1/device.c +++ b/dlls/d2d1/device.c @@ -1858,6 +1858,15 @@ static void STDMETHODCALLTYPE d2d_device_context_Clear(ID2D1DeviceContext6 *ifac
TRACE("iface %p, colour %p.\n", iface, colour);
+ if (FAILED(context->error.code)) + return; + + if (context->target.type == D2D_TARGET_UNKNOWN) + { + d2d_device_context_set_error(context, D2DERR_WRONG_STATE); + return; + } + if (context->target.type == D2D_TARGET_COMMAND_LIST) { d2d_command_list_clear(context->target.command_list, colour); diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 997ebc81ceb..215e3f2bea7 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -15715,6 +15715,60 @@ static void test_get_dxgi_device(BOOL d3d11) release_test_context(&ctx); }
+static void test_no_target(BOOL d3d11) +{ + struct d2d1_test_context ctx; + ID2D1DeviceContext *context; + D2D1_MATRIX_3X2_F matrix; + ID2D1RenderTarget *rt; + ID2D1Device *device; + D2D1_TAG t1, t2; + HRESULT hr; + + if (!init_test_context(&ctx, d3d11)) + return; + + if (!ctx.factory1) + { + win_skip("ID2D1Factory1 is not supported.\n"); + release_test_context(&ctx); + return; + } + + hr = ID2D1Factory1_CreateDevice(ctx.factory1, ctx.device, &device); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + hr = ID2D1Device_CreateDeviceContext(device, D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &context); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + ID2D1DeviceContext_SetTarget(context, NULL); + + hr = ID2D1DeviceContext_QueryInterface(context, &IID_ID2D1RenderTarget, (void **)&rt); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + /* Clear method */ + ID2D1RenderTarget_BeginDraw(rt); + + set_matrix_identity(&matrix); + ID2D1RenderTarget_SetTags(rt, 0x10, 0x10); + ID2D1RenderTarget_SetTransform(rt, &matrix); + + ID2D1RenderTarget_SetTags(rt, 0x10, 0x20); + ID2D1RenderTarget_Clear(rt, 0); + + ID2D1RenderTarget_SetTags(rt, 0x10, 0x30); + ID2D1RenderTarget_Clear(rt, 0); + + hr = ID2D1RenderTarget_EndDraw(rt, &t1, &t2); + ok(hr == D2DERR_WRONG_STATE, "Got unexpected hr %#lx.\n", hr); + ok(t1 == 0x10 && t2 == 0x20, "Unexpected tags %s:%s.\n", wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2)); + + ID2D1RenderTarget_Release(rt); + ID2D1DeviceContext_Release(context); + ID2D1Device_Release(device); + release_test_context(&ctx); +} + START_TEST(d2d1) { HMODULE d2d1_dll = GetModuleHandleA("d2d1.dll"); @@ -15812,6 +15866,7 @@ START_TEST(d2d1) queue_test(test_wic_target_format); queue_test(test_effect_blob_property); queue_test(test_get_dxgi_device); + queue_test(test_no_target);
run_queued_tests(); }