Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
-- v2: d2d1/effect: Add property definitions for the Shadow effect. d2d1/tests: Reduce test run count for some tests. d2d1/effect: Add a description for the Arithmetic Composite effect. d2d1/effect: Add a description for the Point Specular effect. d2d1/effect: Add a description for the Gaussian Blur effect.
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/effect.c | 21 +++++++++++++++++++++ dlls/d2d1/tests/d2d1.c | 20 ++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index 8e7ee8fda64..29e50358717 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1094,6 +1094,21 @@ L"<?xml version='1.0'?> \ </Inputs> \ </Effect>";
+static const WCHAR gaussian_blur_description[] = +L"<?xml version='1.0'?> \ + <Effect> \ + <Property name='DisplayName' type='string' value='Gaussian Blur'/> \ + <Property name='Author' type='string' value='The Wine Project'/> \ + <Property name='Category' type='string' value='Stub'/> \ + <Property name='Description' type='string' value='Gaussian Blur'/> \ + <Inputs> \ + <Input name='Source'/> \ + </Inputs> \ + <Property name='StandardDeviation' type='float' /> \ + <Property name='Optimization' type='enum' /> \ + <Property name='BorderMode' type='enum' /> \ + </Effect>"; + void d2d_effects_init_builtins(struct d2d_factory *factory) { static const struct builtin_description @@ -1111,6 +1126,7 @@ void d2d_effects_init_builtins(struct d2d_factory *factory) { &CLSID_D2D1Grayscale, grayscale_description }, { &CLSID_D2D1ColorMatrix, color_matrix_description }, { &CLSID_D2D1Flood, flood_description }, + { &CLSID_D2D1GaussianBlur, gaussian_blur_description }, }; unsigned int i; HRESULT hr; @@ -1240,6 +1256,7 @@ static HRESULT d2d_effect_properties_internal_add(struct d2d_effect_properties * else { void *src = NULL; + WCHAR *end_ptr; UINT32 _uint32; float _vec[20]; CLSID _clsid; @@ -1258,6 +1275,10 @@ static HRESULT d2d_effect_properties_internal_add(struct d2d_effect_properties * _uint32 = wcstoul(value, NULL, 0); src = &_uint32; break; + case D2D1_PROPERTY_TYPE_FLOAT: + _vec[0] = wcstof(value, &end_ptr); + src = &_vec[0]; + break; case D2D1_PROPERTY_TYPE_ENUM: _uint32 = wcstoul(value, NULL, 10); src = &_uint32; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index c1d9e78787c..dc1cdad3a71 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -11564,6 +11564,7 @@ static void test_builtin_effect(BOOL d3d11) {&CLSID_D2D1Grayscale, 3, 1, 1, 1}, {&CLSID_D2D1ColorMatrix, 1, 1, 1, 1}, {&CLSID_D2D1Flood, 1, 0, 0, 0}, + {&CLSID_D2D1GaussianBlur, 1, 1, 1, 1}, };
if (!init_test_context(&ctx, d3d11)) @@ -13345,6 +13346,7 @@ static void test_effect_gaussian_blur(BOOL d3d11) }; struct d2d1_test_context ctx; ID2D1DeviceContext *context; + ID2D1Properties *subprops; unsigned int count, i; ID2D1Effect *effect; WCHAR name[64]; @@ -13358,13 +13360,7 @@ static void test_effect_gaussian_blur(BOOL d3d11) context = ctx.context;
hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1GaussianBlur, &effect); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr != S_OK) - { - release_test_context(&ctx); - return; - }
check_system_properties(effect);
@@ -13376,12 +13372,24 @@ static void test_effect_gaussian_blur(BOOL d3d11) 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)); + + hr = ID2D1Effect_GetSubProperties(effect, properties[i].index, &subprops); + todo_wine + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + { + count = ID2D1Properties_GetPropertyCount(subprops); + ok(!count, "Got unexpected property count %u.\n", count); + ID2D1Properties_Release(subprops); + } }
f = effect_get_float_prop(effect, D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION); + todo_wine ok(f == 3.0f, "Unexpected value %.8e.\n", f);
v = effect_get_enum_prop(effect, D2D1_GAUSSIANBLUR_PROP_OPTIMIZATION); + todo_wine ok(v == D2D1_GAUSSIANBLUR_OPTIMIZATION_BALANCED, "Unexpected value %u.\n", v);
v = effect_get_enum_prop(effect, D2D1_GAUSSIANBLUR_PROP_BORDER_MODE);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/effect.c | 20 ++++++++++++++++++++ dlls/d2d1/tests/d2d1.c | 13 +++++++------ 2 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index 29e50358717..bd885b38df3 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1109,6 +1109,25 @@ L"<?xml version='1.0'?> \ <Property name='BorderMode' type='enum' /> \ </Effect>";
+static const WCHAR point_specular_description[] = +L"<?xml version='1.0'?> \ + <Effect> \ + <Property name='DisplayName' type='string' value='Point Specular'/> \ + <Property name='Author' type='string' value='The Wine Project'/> \ + <Property name='Category' type='string' value='Stub'/> \ + <Property name='Description' type='string' value='Point Specular'/> \ + <Inputs> \ + <Input name='Source'/> \ + </Inputs> \ + <Property name='LightPosition' type='vector3' /> \ + <Property name='SpecularExponent' type='float' /> \ + <Property name='SpecularConstant' type='float' /> \ + <Property name='SurfaceScale' type='float' /> \ + <Property name='Color' type='vector3' /> \ + <Property name='KernelUnitLength' type='vector2' /> \ + <Property name='ScaleMode' type='enum' /> \ + </Effect>"; + void d2d_effects_init_builtins(struct d2d_factory *factory) { static const struct builtin_description @@ -1127,6 +1146,7 @@ void d2d_effects_init_builtins(struct d2d_factory *factory) { &CLSID_D2D1ColorMatrix, color_matrix_description }, { &CLSID_D2D1Flood, flood_description }, { &CLSID_D2D1GaussianBlur, gaussian_blur_description }, + { &CLSID_D2D1PointSpecular, point_specular_description }, }; unsigned int i; HRESULT hr; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index dc1cdad3a71..34b761945e5 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -11565,6 +11565,7 @@ static void test_builtin_effect(BOOL d3d11) {&CLSID_D2D1ColorMatrix, 1, 1, 1, 1}, {&CLSID_D2D1Flood, 1, 0, 0, 0}, {&CLSID_D2D1GaussianBlur, 1, 1, 1, 1}, + {&CLSID_D2D1PointSpecular, 1, 1, 1, 1}, };
if (!init_test_context(&ctx, d3d11)) @@ -13428,13 +13429,7 @@ static void test_effect_point_specular(BOOL d3d11) context = ctx.context;
hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1PointSpecular, &effect); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr != S_OK) - { - release_test_context(&ctx); - return; - }
check_system_properties(effect);
@@ -13453,22 +13448,28 @@ static void test_effect_point_specular(BOOL d3d11) vec3.x, vec3.y, vec3.z);
f = effect_get_float_prop(effect, D2D1_POINTSPECULAR_PROP_SPECULAR_EXPONENT); + todo_wine ok(f == 1.0f, "Unexpected value %.8e.\n", f);
f = effect_get_float_prop(effect, D2D1_POINTSPECULAR_PROP_SPECULAR_CONSTANT); + todo_wine ok(f == 1.0f, "Unexpected value %.8e.\n", f);
f = effect_get_float_prop(effect, D2D1_POINTSPECULAR_PROP_SURFACE_SCALE); + todo_wine ok(f == 1.0f, "Unexpected value %.8e.\n", f);
vec3 = effect_get_vec3_prop(effect, D2D1_POINTSPECULAR_PROP_COLOR); + todo_wine ok(vec3.x == 1.0f && vec3.y == 1.0f && vec3.z == 1.0f, "Unexpected value {%.8e,%.8e,%.8e}.\n", vec3.x, vec3.y, vec3.z);
vec2 = effect_get_vec2_prop(effect, D2D1_POINTSPECULAR_PROP_KERNEL_UNIT_LENGTH); + todo_wine ok(vec2.x == 1.0f && vec2.y == 1.0f, "Unexpected value {%.8e,%.8e}.\n", vec2.x, vec2.y);
v = effect_get_enum_prop(effect, D2D1_POINTSPECULAR_PROP_SCALE_MODE); + todo_wine ok(v == D2D1_POINTSPECULAR_SCALE_MODE_LINEAR, "Unexpected value %u.\n", v);
ID2D1Effect_Release(effect);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/effect.c | 16 ++++++++++++++++ dlls/d2d1/tests/d2d1.c | 8 ++------ 2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index bd885b38df3..ac17d36a50e 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1128,6 +1128,21 @@ L"<?xml version='1.0'?> \ <Property name='ScaleMode' type='enum' /> \ </Effect>";
+static const WCHAR arithmetic_composite_description[] = +L"<?xml version='1.0'?> \ + <Effect> \ + <Property name='DisplayName' type='string' value='Arithmetic Composite'/> \ + <Property name='Author' type='string' value='The Wine Project'/> \ + <Property name='Category' type='string' value='Stub'/> \ + <Property name='Description' type='string' value='Arithmetic Composite'/> \ + <Inputs minimum='2' maximum='2' > \ + <Input name='Source1'/> \ + <Input name='Source2'/> \ + </Inputs> \ + <Property name='Coefficients' type='vector4' /> \ + <Property name='ClampOutput' type='bool' /> \ + </Effect>"; + void d2d_effects_init_builtins(struct d2d_factory *factory) { static const struct builtin_description @@ -1147,6 +1162,7 @@ void d2d_effects_init_builtins(struct d2d_factory *factory) { &CLSID_D2D1Flood, flood_description }, { &CLSID_D2D1GaussianBlur, gaussian_blur_description }, { &CLSID_D2D1PointSpecular, point_specular_description }, + { &CLSID_D2D1ArithmeticComposite, arithmetic_composite_description }, }; unsigned int i; HRESULT hr; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 34b761945e5..866c1faede2 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -11566,6 +11566,7 @@ static void test_builtin_effect(BOOL d3d11) {&CLSID_D2D1Flood, 1, 0, 0, 0}, {&CLSID_D2D1GaussianBlur, 1, 1, 1, 1}, {&CLSID_D2D1PointSpecular, 1, 1, 1, 1}, + {&CLSID_D2D1ArithmeticComposite, 1, 2, 2, 2}, };
if (!init_test_context(&ctx, d3d11)) @@ -13498,13 +13499,7 @@ static void test_effect_arithmetic_composite(BOOL d3d11) context = ctx.context;
hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1ArithmeticComposite, &effect); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr != S_OK) - { - release_test_context(&ctx); - return; - }
check_system_properties(effect);
@@ -13519,6 +13514,7 @@ static void test_effect_arithmetic_composite(BOOL d3d11) }
vec4 = effect_get_vec4_prop(effect, D2D1_ARITHMETICCOMPOSITE_PROP_COEFFICIENTS); + todo_wine ok(vec4.x == 1.0f && vec4.y == 0.0f && vec4.z == 0.0f && vec4.w == 0.0f, "Unexpected value {%.8e,%.8e,%.8e,%.8e}.\n", vec4.x, vec4.y, vec4.z, vec4.w);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/tests/d2d1.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 866c1faede2..8d4ae08b12f 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -16890,14 +16890,14 @@ START_TEST(d2d1) queue_d3d10_test(test_colour_space); queue_test(test_geometry_group); queue_test(test_mt_factory); - queue_test(test_effect_register); + queue_d3d10_test(test_effect_register); queue_test(test_effect_context); - queue_test(test_effect_properties); - queue_test(test_builtin_effect); + queue_d3d10_test(test_effect_properties); + queue_d3d10_test(test_builtin_effect); queue_test(test_effect_2d_affine); queue_test(test_effect_crop); queue_test(test_effect_grayscale); - queue_test(test_registered_effects); + queue_d3d10_test(test_registered_effects); queue_d3d10_test(test_effect_gaussian_blur); queue_d3d10_test(test_effect_point_specular); queue_d3d10_test(test_effect_arithmetic_composite);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/effect.c | 3 +++ dlls/d2d1/tests/d2d1.c | 56 +++++++++++++++++++++++++++++++++++++++++ include/d2d1effects.idl | 16 ++++++++++++ 3 files changed, 75 insertions(+)
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index ac17d36a50e..0426a9abbd1 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1057,6 +1057,9 @@ L"<?xml version='1.0'?> \ <Inputs > \ <Input name='Source'/> \ </Inputs> \ + <Property name='BlurStandardDeviation' type='float' /> \ + <Property name='Color' type='vector4' /> \ + <Property name='Optimization' type='enum' /> \ </Effect>";
static const WCHAR grayscale_description[] = diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 8d4ae08b12f..e833741c139 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -13525,6 +13525,61 @@ static void test_effect_arithmetic_composite(BOOL d3d11) release_test_context(&ctx); }
+static void test_effect_shadow(BOOL d3d11) +{ + static const struct effect_property properties[] = + { + { L"BlurStandardDeviation", D2D1_SHADOW_PROP_BLUR_STANDARD_DEVIATION, D2D1_PROPERTY_TYPE_FLOAT }, + { L"Color", D2D1_SHADOW_PROP_COLOR, D2D1_PROPERTY_TYPE_VECTOR4 }, + { L"Optimization", D2D1_SHADOW_PROP_OPTIMIZATION, D2D1_PROPERTY_TYPE_ENUM }, + }; + struct d2d1_test_context ctx; + ID2D1DeviceContext *context; + unsigned int count, i; + ID2D1Effect *effect; + D2D_VECTOR_4F vec4; + WCHAR name[64]; + HRESULT hr; + UINT32 v; + float f; + + if (!init_test_context(&ctx, d3d11)) + return; + + context = ctx.context; + + hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1Shadow, &effect); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + check_system_properties(effect); + + count = ID2D1Effect_GetPropertyCount(effect); + ok(count == 3, "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_SHADOW_PROP_BLUR_STANDARD_DEVIATION); + todo_wine + ok(f == 3.0f, "Unexpected value %.8e.\n", f); + + vec4 = effect_get_vec4_prop(effect, D2D1_SHADOW_PROP_COLOR); + todo_wine + ok(vec4.x == 0.0f && vec4.y == 0.0f && vec4.z == 0.0f && vec4.w == 1.0f, + "Unexpected value {%.8e,%.8e,%.8e,%.8e}.\n", vec4.x, vec4.y, vec4.z, vec4.w); + + v = effect_get_enum_prop(effect, D2D1_SHADOW_PROP_OPTIMIZATION); + todo_wine + ok(v == D2D1_SHADOW_OPTIMIZATION_BALANCED, "Unexpected value %#x.\n", v); + + ID2D1Effect_Release(effect); + release_test_context(&ctx); +} + static void test_registered_effects(BOOL d3d11) { UINT32 ret, count, count2, count3; @@ -16901,6 +16956,7 @@ START_TEST(d2d1) queue_d3d10_test(test_effect_gaussian_blur); queue_d3d10_test(test_effect_point_specular); queue_d3d10_test(test_effect_arithmetic_composite); + queue_d3d10_test(test_effect_shadow); 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 9c795b69c21..9cba0e472e9 100644 --- a/include/d2d1effects.idl +++ b/include/d2d1effects.idl @@ -197,3 +197,19 @@ typedef enum D2D1_ARITHMETICCOMPOSITE_PROP D2D1_ARITHMETICCOMPOSITE_PROP_CLAMP_OUTPUT = 1, D2D1_ARITHMETICCOMPOSITE_PROP_FORCE_DWORD = 0xffffffff } D2D1_ARITHMETICCOMPOSITE_PROP; + +typedef enum D2D1_SHADOW_PROP +{ + D2D1_SHADOW_PROP_BLUR_STANDARD_DEVIATION = 0, + D2D1_SHADOW_PROP_COLOR = 1, + D2D1_SHADOW_PROP_OPTIMIZATION = 2, + D2D1_SHADOW_PROP_FORCE_DWORD = 0xffffffff +} D2D1_SHADOW_PROP; + +typedef enum D2D1_SHADOW_OPTIMIZATION +{ + D2D1_SHADOW_OPTIMIZATION_SPEED = 0, + D2D1_SHADOW_OPTIMIZATION_BALANCED = 1, + D2D1_SHADOW_OPTIMIZATION_QUALITY = 2, + D2D1_SHADOW_OPTIMIZATION_FORCE_DWORD = 0xffffffff +} D2D1_SHADOW_OPTIMIZATION;