[PATCH 0/1] MR9692: d2d1: Add a Scale effect stub.
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9692
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/d2d1/effect.c | 53 ++++++++++++++++++++++++++++++++++++ dlls/d2d1/tests/d2d1.c | 60 +++++++++++++++++++++++++++++++++++++++++ include/d2d1effects.idl | 21 +++++++++++++++ 3 files changed, 134 insertions(+) diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index 891f6fc42e4..b66fe731523 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1752,6 +1752,58 @@ static HRESULT __stdcall saturation_factory(IUnknown **effect) return d2d_effect_create_impl(effect, &properties, sizeof(properties)); } +static const WCHAR scale_description[] = +L"<?xml version='1.0'?> \ + <Effect> \ + <Property name='DisplayName' type='string' value='Scale'/> \ + <Property name='Author' type='string' value='The Wine Project'/> \ + <Property name='Category' type='string' value='Stub'/> \ + <Property name='Description' type='string' value='Scale'/> \ + <Inputs> \ + <Input name='Source'/> \ + </Inputs> \ + <Property name='Scale' type='vector2' /> \ + <Property name='CenterPoint' type='vector2' /> \ + <Property name='InterpolationMode' type='enum' /> \ + <Property name='BorderMode' type='enum' /> \ + <Property name='Sharpness' type='float' /> \ + </Effect>"; + +struct scale_properties +{ + D2D_VECTOR_2F scale; + D2D_VECTOR_2F center_point; + D2D1_BORDER_MODE border_mode; + float sharpness; + D2D1_SCALE_INTERPOLATION_MODE interpolation_mode; +}; + +EFFECT_PROPERTY_RW(scale, scale, VECTOR2) +EFFECT_PROPERTY_RW(scale, center_point, VECTOR2) +EFFECT_PROPERTY_RW(scale, border_mode, ENUM) +EFFECT_PROPERTY_RW(scale, sharpness, FLOAT) +EFFECT_PROPERTY_RW(scale, interpolation_mode, ENUM) + +static const D2D1_PROPERTY_BINDING scale_bindings[] = +{ + { L"Scale", BINDING_RW(scale, scale) }, + { L"CenterPoint", BINDING_RW(scale, center_point) }, + { L"BorderMode", BINDING_RW(scale, border_mode) }, + { L"Sharpness", BINDING_RW(scale, sharpness) }, + { L"InterpolationMode", BINDING_RW(scale, interpolation_mode) }, +}; + +static HRESULT __stdcall scale_factory(IUnknown **effect) +{ + static const struct scale_properties properties = + { + .scale = { 1.0f, 1.0f }, + .border_mode = D2D1_BORDER_MODE_SOFT, + .interpolation_mode = D2D1_SCALE_INTERPOLATION_MODE_LINEAR, + }; + return d2d_effect_create_impl(effect, &properties, sizeof(properties)); +} + void d2d_effects_init_builtins(struct d2d_factory *factory) { static const struct builtin_description @@ -1782,6 +1834,7 @@ void d2d_effects_init_builtins(struct d2d_factory *factory) { &CLSID_D2D1DirectionalBlur, X2(directional_blur) }, { &CLSID_D2D1HueRotation, X2(hue_rotation) }, { &CLSID_D2D1Saturation, X2(saturation) }, + { &CLSID_D2D1Scale, X2(scale) }, #undef X2 #undef X }; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index a830f139dfa..65f4f9336f2 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -14208,6 +14208,65 @@ static void test_effect_saturation(BOOL d3d11) release_test_context(&ctx); } +static void test_effect_scale(BOOL d3d11) +{ + static const struct effect_property properties[] = + { + { L"Scale", D2D1_SCALE_PROP_SCALE, D2D1_PROPERTY_TYPE_VECTOR2 }, + { L"CenterPoint", D2D1_SCALE_PROP_CENTER_POINT, D2D1_PROPERTY_TYPE_VECTOR2 }, + { L"InterpolationMode", D2D1_SCALE_PROP_INTERPOLATION_MODE, D2D1_PROPERTY_TYPE_ENUM }, + { L"BorderMode", D2D1_SCALE_PROP_BORDER_MODE, D2D1_PROPERTY_TYPE_ENUM }, + { L"Sharpness", D2D1_SCALE_PROP_SHARPNESS, D2D1_PROPERTY_TYPE_FLOAT }, + }; + struct d2d1_test_context ctx; + ID2D1DeviceContext *context; + unsigned int count, i; + ID2D1Effect *effect; + D2D_VECTOR_2F vec; + WCHAR name[64]; + HRESULT hr; + UINT32 v; + float f; + + if (!init_test_context(&ctx, d3d11)) + return; + + context = ctx.context; + + hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1Scale, &effect); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + check_system_properties(effect); + + count = ID2D1Effect_GetPropertyCount(effect); + ok(count == 5, "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), "%u Unexpected name %s.\n", i, wine_dbgstr_w(name)); + } + + vec = effect_get_vec2_prop(effect, D2D1_SCALE_PROP_SCALE); + ok(vec.x == 1.0f && vec.y == 1.0f, "Unexpected value {%.8e,%.8e}.\n", vec.x, vec.y); + + vec = effect_get_vec2_prop(effect, D2D1_SCALE_PROP_CENTER_POINT); + ok(vec.x == 0.0f && vec.y == 0.0f, "Unexpected value {%.8e,%.8e}.\n", vec.x, vec.y); + + v = effect_get_enum_prop(effect, D2D1_SCALE_PROP_INTERPOLATION_MODE); + ok(v == D2D1_SCALE_INTERPOLATION_MODE_LINEAR, "Unexpected value %#x.\n", v); + + v = effect_get_enum_prop(effect, D2D1_SCALE_PROP_BORDER_MODE); + ok(v == D2D1_BORDER_MODE_SOFT, "Unexpected value %#x.\n", v); + + f = effect_get_float_prop(effect, D2D1_SCALE_PROP_SHARPNESS); + ok(f == 0.0f, "Unexpected value %.8e.\n", f); + + ID2D1Effect_Release(effect); + release_test_context(&ctx); +} + static void test_registered_effects(BOOL d3d11) { UINT32 ret, count, count2, count3; @@ -17595,6 +17654,7 @@ START_TEST(d2d1) queue_d3d10_test(test_effect_directional_blur); queue_d3d10_test(test_effect_hue_rotation); queue_d3d10_test(test_effect_saturation); + queue_d3d10_test(test_effect_scale); 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 cf374bdeb19..83ca4a9e2ed 100644 --- a/include/d2d1effects.idl +++ b/include/d2d1effects.idl @@ -276,3 +276,24 @@ typedef enum D2D1_SATURATION_PROP D2D1_SATURATION_PROP_SATURATION = 0, D2D1_SATURATION_PROP_FORCE_DWORD = 0xffffffff } D2D1_SATURATION_PROP; + +typedef enum D2D1_SCALE_PROP +{ + D2D1_SCALE_PROP_SCALE = 0, + D2D1_SCALE_PROP_CENTER_POINT = 1, + D2D1_SCALE_PROP_INTERPOLATION_MODE = 2, + D2D1_SCALE_PROP_BORDER_MODE = 3, + D2D1_SCALE_PROP_SHARPNESS = 4, + D2D1_SCALE_PROP_FORCE_DWORD = 0xffffffff +} D2D1_SCALE_PROP; + +typedef enum D2D1_SCALE_INTERPOLATION_MODE +{ + D2D1_SCALE_INTERPOLATION_MODE_NEAREST_NEIGHBOR = 0, + D2D1_SCALE_INTERPOLATION_MODE_LINEAR = 1, + D2D1_SCALE_INTERPOLATION_MODE_CUBIC = 2, + D2D1_SCALE_INTERPOLATION_MODE_MULTI_SAMPLE_LINEAR = 3, + D2D1_SCALE_INTERPOLATION_MODE_ANISOTROPIC = 4, + D2D1_SCALE_INTERPOLATION_MODE_HIGH_QUALITY_CUBIC = 5, + D2D1_SCALE_INTERPOLATION_MODE_FORCE_DWORD = 0xffffffff +} D2D1_SCALE_INTERPOLATION_MODE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9692
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)