From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/effect.c | 21 +++++++++++++++++++-- dlls/d2d1/tests/d2d1.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index f0577a0b681..c2b89ca94e6 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1224,11 +1224,28 @@ L"<?xml version='1.0'?> \ <Input name='Source1'/> \ <Input name='Source2'/> \ </Inputs> \ + <Property name='Mode' type='enum' /> \ </Effect>";
+struct composite_properties +{ + D2D1_COMPOSITE_MODE mode; +}; + +EFFECT_PROPERTY_RW(composite, mode, ENUM) + +static const D2D1_PROPERTY_BINDING composite_bindings[] = +{ + { L"Mode", BINDING_RW(composite, mode) }, +}; + static HRESULT __stdcall composite_factory(IUnknown **effect) { - return d2d_effect_create_impl(effect, NULL, 0); + static const struct composite_properties properties = + { + .mode = D2D1_COMPOSITE_MODE_SOURCE_OVER, + }; + return d2d_effect_create_impl(effect, &properties, sizeof(properties)); }
static const WCHAR crop_description[] = @@ -1522,7 +1539,7 @@ void d2d_effects_init_builtins(struct d2d_factory *factory) #define X2(name) name##_description, name##_factory, name##_bindings, ARRAY_SIZE(name##_bindings) { &CLSID_D2D12DAffineTransform, X2(_2d_affine_transform) }, { &CLSID_D2D13DPerspectiveTransform, X2(_3d_perspective_transform) }, - { &CLSID_D2D1Composite, X(composite) }, + { &CLSID_D2D1Composite, X2(composite) }, { &CLSID_D2D1Crop, X(crop) }, { &CLSID_D2D1Shadow, X2(shadow) }, { &CLSID_D2D1Grayscale, X(grayscale) }, diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 61a83b1c40c..7eb7ca94519 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -13798,6 +13798,47 @@ static void test_effect_flood(BOOL d3d11) release_test_context(&ctx); }
+static void test_effect_composite(BOOL d3d11) +{ + static const struct effect_property properties[] = + { + { L"Mode", D2D1_COMPOSITE_PROP_MODE, D2D1_PROPERTY_TYPE_ENUM }, + }; + struct d2d1_test_context ctx; + ID2D1DeviceContext *context; + unsigned int count, i; + ID2D1Effect *effect; + WCHAR name[64]; + HRESULT hr; + UINT32 v; + + if (!init_test_context(&ctx, d3d11)) + return; + + context = ctx.context; + + hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1Composite, &effect); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + check_system_properties(effect); + + count = ID2D1Effect_GetPropertyCount(effect); + ok(count == 1, "Got unexpected property count %u.\n", count); + + for (i = 0; i < ARRAY_SIZE(properties); ++i) + { + hr = ID2D1Effect_GetPropertyName(effect, properties[i].index, name, 64); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ok(!wcscmp(name, properties[i].name), "Unexpected name %s.\n", wine_dbgstr_w(name)); + } + + v = effect_get_enum_prop(effect, D2D1_COMPOSITE_PROP_MODE); + ok(v == D2D1_COMPOSITE_MODE_SOURCE_OVER, "Unexpected value %#x.\n", v); + + ID2D1Effect_Release(effect); + release_test_context(&ctx); +} + static void test_registered_effects(BOOL d3d11) { UINT32 ret, count, count2, count3; @@ -17176,6 +17217,7 @@ START_TEST(d2d1) queue_d3d10_test(test_effect_arithmetic_composite); queue_d3d10_test(test_effect_shadow); queue_d3d10_test(test_effect_3d_perspective_transform); + queue_d3d10_test(test_effect_composite); queue_test(test_effect_flood); queue_test(test_transform_graph); queue_test(test_offset_transform);