From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/tests/d2d1.c | 101 ++++++++++++++++++++++++++++++++++++++++ include/d2d1effects.idl | 23 +++++++++ 2 files changed, 124 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index a59ff5e2087..d014e1fa3a0 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -72,6 +72,30 @@ static float _effect_get_float_prop(ID2D1Effect *effect, UINT32 prop, int line) return v; }
+#define effect_get_vec3_prop(a,b) _effect_get_vec3_prop(a,b,__LINE__) +static D2D_VECTOR_3F _effect_get_vec3_prop(ID2D1Effect *effect, UINT32 prop, int line) +{ + D2D_VECTOR_3F v = { 123321.0f, 123321.0f, 123321.0f }; + HRESULT hr; + + hr = ID2D1Effect_GetValue(effect, prop, D2D1_PROPERTY_TYPE_VECTOR3, (BYTE *)&v, sizeof(v)); + ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + return v; +} + +#define effect_get_vec2_prop(a,b) _effect_get_vec2_prop(a,b,__LINE__) +static D2D_VECTOR_2F _effect_get_vec2_prop(ID2D1Effect *effect, UINT32 prop, int line) +{ + D2D_VECTOR_2F v = { 123321.0f, 123321.0f }; + HRESULT hr; + + hr = ID2D1Effect_GetValue(effect, prop, D2D1_PROPERTY_TYPE_VECTOR2, (BYTE *)&v, sizeof(v)); + ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + return v; +} + #define effect_get_enum_prop(a,b) _effect_get_enum_prop(a,b,__LINE__) static UINT32 _effect_get_enum_prop(ID2D1Effect *effect, UINT32 prop, int line) { @@ -13343,6 +13367,82 @@ static void test_effect_gaussian_blur(BOOL d3d11) release_test_context(&ctx); }
+static void test_effect_point_specular(BOOL d3d11) +{ + static const struct effect_property properties[] = + { + { L"LightPosition", D2D1_POINTSPECULAR_PROP_LIGHT_POSITION, D2D1_PROPERTY_TYPE_VECTOR3 }, + { L"SpecularExponent", D2D1_POINTSPECULAR_PROP_SPECULAR_EXPONENT, D2D1_PROPERTY_TYPE_FLOAT }, + { L"SpecularConstant", D2D1_POINTSPECULAR_PROP_SPECULAR_CONSTANT, D2D1_PROPERTY_TYPE_FLOAT }, + { L"SurfaceScale", D2D1_POINTSPECULAR_PROP_SURFACE_SCALE, D2D1_PROPERTY_TYPE_FLOAT }, + { L"Color", D2D1_POINTSPECULAR_PROP_COLOR, D2D1_PROPERTY_TYPE_VECTOR3 }, + { L"KernelUnitLength", D2D1_POINTSPECULAR_PROP_KERNEL_UNIT_LENGTH, D2D1_PROPERTY_TYPE_VECTOR2 }, + { L"ScaleMode", D2D1_POINTSPECULAR_PROP_SCALE_MODE, D2D1_PROPERTY_TYPE_ENUM }, + }; + struct d2d1_test_context ctx; + ID2D1DeviceContext *context; + unsigned int count, i; + ID2D1Effect *effect; + D2D_VECTOR_3F vec3; + D2D_VECTOR_2F vec2; + WCHAR name[64]; + HRESULT hr; + UINT32 v; + float f; + + if (!init_test_context(&ctx, d3d11)) + return; + + 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); + + count = ID2D1Effect_GetPropertyCount(effect); + ok(count == 7, "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)); + } + + vec3 = effect_get_vec3_prop(effect, D2D1_POINTSPECULAR_PROP_LIGHT_POSITION); + ok(vec3.x == 0.0f && vec3.y == 0.0f && vec3.z == 0.0f, "Unexpected value {%.8e,%.8e,%.8e}.\n", + vec3.x, vec3.y, vec3.z); + + f = effect_get_float_prop(effect, D2D1_POINTSPECULAR_PROP_SPECULAR_EXPONENT); + ok(f == 1.0f, "Unexpected value %.8e.\n", f); + + f = effect_get_float_prop(effect, D2D1_POINTSPECULAR_PROP_SPECULAR_CONSTANT); + ok(f == 1.0f, "Unexpected value %.8e.\n", f); + + f = effect_get_float_prop(effect, D2D1_POINTSPECULAR_PROP_SURFACE_SCALE); + ok(f == 1.0f, "Unexpected value %.8e.\n", f); + + vec3 = effect_get_vec3_prop(effect, D2D1_POINTSPECULAR_PROP_COLOR); + 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); + 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); + ok(v == D2D1_POINTSPECULAR_SCALE_MODE_LINEAR, "Unexpected value %u.\n", v); + + ID2D1Effect_Release(effect); + release_test_context(&ctx); +} + static void test_registered_effects(BOOL d3d11) { UINT32 ret, count, count2, count3; @@ -16717,6 +16817,7 @@ START_TEST(d2d1) queue_test(test_effect_grayscale); queue_test(test_registered_effects); queue_d3d10_test(test_effect_gaussian_blur); + queue_d3d10_test(test_effect_point_specular); 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 f75603a4fd3..150eb2dc51c 100644 --- a/include/d2d1effects.idl +++ b/include/d2d1effects.idl @@ -167,3 +167,26 @@ typedef enum D2D1_GAUSSIANBLUR_OPTIMIZATION D2D1_GAUSSIANBLUR_OPTIMIZATION_QUALITY = 2, D2D1_GAUSSIANBLUR_OPTIMIZATION_FORCE_DWORD = 0xffffffff } D2D1_GAUSSIANBLUR_OPTIMIZATION; + +typedef enum D2D1_POINTSPECULAR_PROP +{ + D2D1_POINTSPECULAR_PROP_LIGHT_POSITION = 0, + D2D1_POINTSPECULAR_PROP_SPECULAR_EXPONENT = 1, + D2D1_POINTSPECULAR_PROP_SPECULAR_CONSTANT = 2, + D2D1_POINTSPECULAR_PROP_SURFACE_SCALE = 3, + D2D1_POINTSPECULAR_PROP_COLOR = 4, + D2D1_POINTSPECULAR_PROP_KERNEL_UNIT_LENGTH = 5, + D2D1_POINTSPECULAR_PROP_SCALE_MODE = 6, + D2D1_POINTSPECULAR_PROP_FORCE_DWORD = 0xffffffff +} D2D1_POINTSPECULAR_PROP; + +typedef enum D2D1_POINTSPECULAR_SCALE_MODE +{ + D2D1_POINTSPECULAR_SCALE_MODE_NEAREST_NEIGHBOR = 0, + D2D1_POINTSPECULAR_SCALE_MODE_LINEAR = 1, + D2D1_POINTSPECULAR_SCALE_MODE_CUBIC = 2, + D2D1_POINTSPECULAR_SCALE_MODE_MULTI_SAMPLE_LINEAR = 3, + D2D1_POINTSPECULAR_SCALE_MODE_ANISOTROPIC = 4, + D2D1_POINTSPECULAR_SCALE_MODE_HIGH_QUALITY_CUBIC = 5, + D2D1_POINTSPECULAR_SCALE_MODE_FORCE_DWORD = 0xffffffff +} D2D1_POINTSPECULAR_SCALE_MODE;