mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 19:49:50 +00:00
d2d1/effect: Support parsing matrix poperty values.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
parent
5f1f52cff2
commit
5e714c6403
2 changed files with 102 additions and 9 deletions
|
@ -230,20 +230,34 @@ static const struct d2d_effect_info builtin_effects[] =
|
|||
};
|
||||
|
||||
/* Same syntax is used for value and default values. */
|
||||
static HRESULT d2d_effect_parse_vector_value(D2D1_PROPERTY_TYPE type, const WCHAR *value,
|
||||
static HRESULT d2d_effect_parse_float_array(D2D1_PROPERTY_TYPE type, const WCHAR *value,
|
||||
float *vec)
|
||||
{
|
||||
unsigned int i, num_components;
|
||||
WCHAR *end_ptr;
|
||||
|
||||
assert(type == D2D1_PROPERTY_TYPE_VECTOR2 || type == D2D1_PROPERTY_TYPE_VECTOR3
|
||||
|| type == D2D1_PROPERTY_TYPE_VECTOR4);
|
||||
/* Type values are sequential. */
|
||||
switch (type)
|
||||
{
|
||||
case D2D1_PROPERTY_TYPE_VECTOR2:
|
||||
case D2D1_PROPERTY_TYPE_VECTOR3:
|
||||
case D2D1_PROPERTY_TYPE_VECTOR4:
|
||||
num_components = (type - D2D1_PROPERTY_TYPE_VECTOR2) + 2;
|
||||
break;
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_3X2:
|
||||
num_components = 6;
|
||||
break;
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_4X3:
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_4X4:
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_5X4:
|
||||
num_components = (type - D2D1_PROPERTY_TYPE_MATRIX_4X3) * 4 + 12;
|
||||
break;
|
||||
default:
|
||||
return E_UNEXPECTED;
|
||||
}
|
||||
|
||||
if (*(value++) != '(') return E_INVALIDARG;
|
||||
|
||||
/* Type values are sequential. */
|
||||
num_components = (type - D2D1_PROPERTY_TYPE_VECTOR2) + 2;
|
||||
|
||||
for (i = 0; i < num_components; ++i)
|
||||
{
|
||||
vec[i] = wcstof(value, &end_ptr);
|
||||
|
@ -332,7 +346,7 @@ static HRESULT d2d_effect_properties_internal_add(struct d2d_effect_properties *
|
|||
{
|
||||
void *src = NULL;
|
||||
UINT32 _uint32;
|
||||
float _vec[4];
|
||||
float _vec[20];
|
||||
CLSID _clsid;
|
||||
BOOL _bool;
|
||||
|
||||
|
@ -363,9 +377,14 @@ static HRESULT d2d_effect_properties_internal_add(struct d2d_effect_properties *
|
|||
case D2D1_PROPERTY_TYPE_VECTOR2:
|
||||
case D2D1_PROPERTY_TYPE_VECTOR3:
|
||||
case D2D1_PROPERTY_TYPE_VECTOR4:
|
||||
if (FAILED(hr = d2d_effect_parse_vector_value(p->type, value, _vec)))
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_3X2:
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_4X3:
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_4X4:
|
||||
case D2D1_PROPERTY_TYPE_MATRIX_5X4:
|
||||
if (FAILED(hr = d2d_effect_parse_float_array(p->type, value, _vec)))
|
||||
{
|
||||
WARN("Failed to parse vector value %s.\n", wine_dbgstr_w(value));
|
||||
WARN("Failed to parse float array %s for type %u.\n",
|
||||
wine_dbgstr_w(value), p->type);
|
||||
return hr;
|
||||
}
|
||||
src = _vec;
|
||||
|
|
|
@ -74,6 +74,30 @@ L"<?xml version='1.0'?> \
|
|||
<Property name='DisplayName' type='string' value='Vec4 prop'/> \
|
||||
<Property name='Default' type='vector4' value='(0.8,0.9,1.0,1.1)'/> \
|
||||
</Property> \
|
||||
<Property name='Mat3x2Prop' type='matrix3x2' \
|
||||
value='(1.0,2.0,3.0,4.0,5.0,6.0)'> \
|
||||
<Property name='DisplayName' type='string' value='Mat3x2 prop'/> \
|
||||
<Property name='Default' type='matrix3x2' \
|
||||
value='(0.1,0.2,0.3,0.4,0.5,0.6)'/> \
|
||||
</Property> \
|
||||
<Property name='Mat4x3Prop' type='matrix4x3' \
|
||||
value='(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12)'> \
|
||||
<Property name='DisplayName' type='string' value='Mat4x3 prop'/> \
|
||||
<Property name='Default' type='matrix4x3' \
|
||||
value='(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2)'/> \
|
||||
</Property> \
|
||||
<Property name='Mat4x4Prop' type='matrix4x4' \
|
||||
value='(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)'> \
|
||||
<Property name='DisplayName' type='string' value='Mat4x4 prop'/> \
|
||||
<Property name='Default' type='matrix4x4' \
|
||||
value='(16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)'/> \
|
||||
</Property> \
|
||||
<Property name='Mat5x4Prop' type='matrix5x4' \
|
||||
value='(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)'> \
|
||||
<Property name='DisplayName' type='string' value='Mat5x4 prop'/> \
|
||||
<Property name='Default' type='matrix5x4' \
|
||||
value='(20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)'/>\
|
||||
</Property> \
|
||||
</Effect> \
|
||||
";
|
||||
|
||||
|
@ -11050,6 +11074,7 @@ static void test_effect_properties(BOOL d3d11)
|
|||
ID2D1Effect *effect;
|
||||
UINT32 count, data;
|
||||
WCHAR buffer[128];
|
||||
float mat[20];
|
||||
INT32 _int32;
|
||||
CLSID clsid;
|
||||
BOOL cached;
|
||||
|
@ -11199,6 +11224,55 @@ static void test_effect_properties(BOOL d3d11)
|
|||
ok(vec4[0] == 8.0f && vec4[1] == 9.0f && vec4[2] == 10.0f && vec4[3] == 11.0f,
|
||||
"Unexpected vector (%.8e,%.8e,%.8e,%.8e).\n", vec4[0], vec4[1], vec4[2], vec4[3]);
|
||||
|
||||
/* Matrix3x2 property. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"Mat3x2Prop");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!wcscmp(buffer, L"Mat3x2Prop"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
|
||||
prop_type = ID2D1Effect_GetType(effect, index);
|
||||
ok(prop_type == D2D1_PROPERTY_TYPE_MATRIX_3X2, "Unexpected type %u.\n", prop_type);
|
||||
hr = ID2D1Effect_GetValue(effect, index, D2D1_PROPERTY_TYPE_MATRIX_3X2, (BYTE *)mat, 6 * sizeof(float));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(mat[0] == 1.0f && mat[1] == 2.0f && mat[2] == 3.0f && mat[3] == 4.0f && mat[4] == 5.0f && mat[5] == 6.0f,
|
||||
"Unexpected matrix (%.8e,%.8e,%.8e,%.8e,%.8e,%.8e).\n",
|
||||
mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
|
||||
|
||||
/* Matrix4x3 property. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"Mat4x3Prop");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!wcscmp(buffer, L"Mat4x3Prop"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
|
||||
prop_type = ID2D1Effect_GetType(effect, index);
|
||||
ok(prop_type == D2D1_PROPERTY_TYPE_MATRIX_4X3, "Unexpected type %u.\n", prop_type);
|
||||
hr = ID2D1Effect_GetValue(effect, index, D2D1_PROPERTY_TYPE_MATRIX_4X3, (BYTE *)mat, 12 * sizeof(float));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
for (i = 0; i < 12; ++i)
|
||||
ok(mat[i] == 1.0f + i, "Unexpected matrix element %u.\n", i);
|
||||
|
||||
/* Matrix4x4 property. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"Mat4x4Prop");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!wcscmp(buffer, L"Mat4x4Prop"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
|
||||
prop_type = ID2D1Effect_GetType(effect, index);
|
||||
ok(prop_type == D2D1_PROPERTY_TYPE_MATRIX_4X4, "Unexpected type %u.\n", prop_type);
|
||||
hr = ID2D1Effect_GetValue(effect, index, D2D1_PROPERTY_TYPE_MATRIX_4X4, (BYTE *)mat, 16 * sizeof(float));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
for (i = 0; i < 16; ++i)
|
||||
ok(mat[i] == 1.0f + i, "Unexpected matrix element %u.\n", i);
|
||||
|
||||
/* Matrix5x4 property. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"Mat5x4Prop");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!wcscmp(buffer, L"Mat5x4Prop"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
|
||||
prop_type = ID2D1Effect_GetType(effect, index);
|
||||
ok(prop_type == D2D1_PROPERTY_TYPE_MATRIX_5X4, "Unexpected type %u.\n", prop_type);
|
||||
hr = ID2D1Effect_GetValue(effect, index, D2D1_PROPERTY_TYPE_MATRIX_5X4, (BYTE *)mat, 20 * sizeof(float));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
for (i = 0; i < 20; ++i)
|
||||
ok(mat[i] == 1.0f + i, "Unexpected matrix element %u.\n", i);
|
||||
|
||||
ID2D1Effect_Release(effect);
|
||||
|
||||
hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
|
||||
|
|
Loading…
Reference in a new issue