From: Alfred Agrell floating@muncher.se
--- dlls/d2d1/effect.c | 50 +++++++++++++++++++++++++++++++++++++ dlls/d2d1/tests/d2d1.c | 55 +++++++++++++++++++++++++++++++++++++++++ include/d2d1effects.idl | 17 +++++++++++++ 3 files changed, 122 insertions(+)
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index c14fbc1585d..a49715b5ce5 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1644,6 +1644,55 @@ static HRESULT __stdcall brightness_factory(IUnknown **effect) return d2d_effect_create_impl(effect, &properties, sizeof(properties)); }
+static const WCHAR directional_blur_description[] = +L"<?xml version='1.0'?> \ + <Effect> \ + <Property name='DisplayName' type='string' value='Directional Blur'/> \ + <Property name='Author' type='string' value='The Wine Project'/> \ + <Property name='Category' type='string' value='Stub'/> \ + <Property name='Description' type='string' value='Directional Blur'/> \ + <Inputs> \ + <Input name='Source'/> \ + </Inputs> \ + <Property name='StandardDeviation' type='float' /> \ + <Property name='Angle' type='float' /> \ + <Property name='Optimization' type='enum' /> \ + <Property name='BorderMode' type='enum' /> \ + </Effect>"; + +struct directional_blur_properties +{ + float standard_deviation; + float angle; + D2D1_DIRECTIONALBLUR_OPTIMIZATION optimization; + D2D1_BORDER_MODE border_mode; +}; + +EFFECT_PROPERTY_RW(directional_blur, standard_deviation, FLOAT) +EFFECT_PROPERTY_RW(directional_blur, angle, FLOAT) +EFFECT_PROPERTY_RW(directional_blur, optimization, ENUM) +EFFECT_PROPERTY_RW(directional_blur, border_mode, ENUM) + +static const D2D1_PROPERTY_BINDING directional_blur_bindings[] = +{ + { L"StandardDeviation", BINDING_RW(directional_blur, standard_deviation) }, + { L"Angle", BINDING_RW(directional_blur, angle) }, + { L"Optimization", BINDING_RW(directional_blur, optimization) }, + { L"BorderMode", BINDING_RW(directional_blur, border_mode) }, +}; + +static HRESULT __stdcall directional_blur_factory(IUnknown **effect) +{ + static const struct directional_blur_properties properties = + { + .standard_deviation = 3.0f, + .angle = 0.0f, + .optimization = D2D1_DIRECTIONALBLUR_OPTIMIZATION_BALANCED, + .border_mode = D2D1_BORDER_MODE_SOFT, + }; + return d2d_effect_create_impl(effect, &properties, sizeof(properties)); +} + void d2d_effects_init_builtins(struct d2d_factory *factory) { static const struct builtin_description @@ -1671,6 +1720,7 @@ void d2d_effects_init_builtins(struct d2d_factory *factory) { &CLSID_D2D1ArithmeticComposite, X2(arithmetic_composite) }, { &CLSID_D2D1Blend, X2(blend) }, { &CLSID_D2D1Brightness, X2(brightness) }, + { &CLSID_D2D1DirectionalBlur, X2(directional_blur) }, #undef X2 #undef X }; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 26e78919e2e..10bf725320a 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -14074,6 +14074,60 @@ static void test_effect_brightness(BOOL d3d11) release_test_context(&ctx); }
+static void test_effect_directional_blur(BOOL d3d11) +{ + static const struct effect_property properties[] = + { + { L"StandardDeviation", D2D1_DIRECTIONALBLUR_PROP_STANDARD_DEVIATION, D2D1_PROPERTY_TYPE_FLOAT }, + { L"Angle", D2D1_DIRECTIONALBLUR_PROP_ANGLE, D2D1_PROPERTY_TYPE_FLOAT }, + { L"Optimization", D2D1_DIRECTIONALBLUR_PROP_OPTIMIZATION, D2D1_PROPERTY_TYPE_ENUM }, + { L"BorderMode", D2D1_DIRECTIONALBLUR_PROP_BORDER_MODE, D2D1_PROPERTY_TYPE_ENUM }, + }; + float f; + 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_D2D1DirectionalBlur, &effect); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + check_system_properties(effect); + + count = ID2D1Effect_GetPropertyCount(effect); + ok(count == 4, "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)); + } + + f = effect_get_float_prop(effect, D2D1_DIRECTIONALBLUR_PROP_STANDARD_DEVIATION); + ok(f == 3.0f, "got %f.\n", f); + + f = effect_get_float_prop(effect, D2D1_DIRECTIONALBLUR_PROP_ANGLE); + ok(f == 0.0f, "got %f.\n", f); + + v = effect_get_enum_prop(effect, D2D1_DIRECTIONALBLUR_PROP_OPTIMIZATION); + ok(v == D2D1_DIRECTIONALBLUR_OPTIMIZATION_BALANCED, "Unexpected value %#x.\n", v); + + v = effect_get_enum_prop(effect, D2D1_DIRECTIONALBLUR_PROP_BORDER_MODE); + ok(v == D2D1_BORDER_MODE_SOFT, "Unexpected value %#x.\n", v); + + ID2D1Effect_Release(effect); + release_test_context(&ctx); +} + static void test_registered_effects(BOOL d3d11) { UINT32 ret, count, count2, count3; @@ -17458,6 +17512,7 @@ START_TEST(d2d1) queue_test(test_effect_flood); queue_test(test_effect_blend); queue_test(test_effect_brightness); + queue_test(test_effect_directional_blur); queue_test(test_transform_graph); queue_test(test_offset_transform); queue_test(test_blend_transform); diff --git a/include/d2d1effects.idl b/include/d2d1effects.idl index 76ac79b0724..ad843a9344d 100644 --- a/include/d2d1effects.idl +++ b/include/d2d1effects.idl @@ -247,3 +247,20 @@ typedef enum D2D1_BRIGHTNESS_PROP D2D1_BRIGHTNESS_PROP_BLACK_POINT = 1, D2D1_BRIGHTNESS_PROP_FORCE_DWORD = 0xffffffff } D2D1_BRIGHTNESS_PROP; + +typedef enum D2D1_DIRECTIONALBLUR_PROP +{ + D2D1_DIRECTIONALBLUR_PROP_STANDARD_DEVIATION = 0, + D2D1_DIRECTIONALBLUR_PROP_ANGLE = 1, + D2D1_DIRECTIONALBLUR_PROP_OPTIMIZATION = 2, + D2D1_DIRECTIONALBLUR_PROP_BORDER_MODE = 3, + D2D1_DIRECTIONALBLUR_PROP_FORCE_DWORD = 0xffffffff +} D2D1_DIRECTIONALBLUR_PROP; + +typedef enum D2D1_DIRECTIONALBLUR_OPTIMIZATION +{ + D2D1_DIRECTIONALBLUR_OPTIMIZATION_SPEED = 0, + D2D1_DIRECTIONALBLUR_OPTIMIZATION_BALANCED = 1, + D2D1_DIRECTIONALBLUR_OPTIMIZATION_QUALITY = 2, + D2D1_DIRECTIONALBLUR_OPTIMIZATION_FORCE_DWORD = 0xffffffff +} D2D1_DIRECTIONALBLUR_OPTIMIZATION;