Commit 7b15245d authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

d2d1/effect: Initial implementation of subproperties.

parent ee0fd30e
......@@ -617,10 +617,14 @@ struct d2d_effect_property
UINT32 size;
PD2D1_PROPERTY_SET_FUNCTION set_function;
PD2D1_PROPERTY_GET_FUNCTION get_function;
struct d2d_effect_properties *subproperties;
};
struct d2d_effect_properties
{
ID2D1Properties ID2D1Properties_iface;
struct d2d_effect *effect;
struct d2d_effect_property *properties;
size_t offset;
size_t size;
......@@ -673,6 +677,10 @@ HRESULT d2d_effect_create(struct d2d_device_context *context, const CLSID *effec
ID2D1Effect **effect) DECLSPEC_HIDDEN;
HRESULT d2d_effect_properties_add(struct d2d_effect_properties *props, const WCHAR *name,
UINT32 index, D2D1_PROPERTY_TYPE type, const WCHAR *value) DECLSPEC_HIDDEN;
HRESULT d2d_effect_subproperties_add(struct d2d_effect_properties *props, const WCHAR *name,
UINT32 index, D2D1_PROPERTY_TYPE type, const WCHAR *value) DECLSPEC_HIDDEN;
struct d2d_effect_property * d2d_effect_properties_get_property_by_name(
const struct d2d_effect_properties *properties, const WCHAR *name) DECLSPEC_HIDDEN;
void d2d_effect_properties_cleanup(struct d2d_effect_properties *props) DECLSPEC_HIDDEN;
static inline BOOL d2d_array_reserve(void **elements, size_t *capacity, size_t count, size_t size)
......
......@@ -782,6 +782,55 @@ static HRESULT parse_effect_property(IXmlReader *reader, struct d2d_effect_regis
return hr;
}
static HRESULT parse_effect_inputs(IXmlReader *reader, struct d2d_effect_registration *effect)
{
struct d2d_effect_properties *subproperties;
unsigned int depth, input_count = 0;
struct d2d_effect_property *inputs;
XmlNodeType node_type;
WCHAR nameW[16];
WCHAR *name;
HRESULT hr;
if (FAILED(hr = d2d_effect_properties_add(&effect->properties, L"Inputs",
D2D1_PROPERTY_INPUTS, D2D1_PROPERTY_TYPE_ARRAY, NULL)))
return hr;
if (!(inputs = d2d_effect_properties_get_property_by_name(&effect->properties, L"Inputs")))
return E_FAIL;
if (!(inputs->subproperties = calloc(1, sizeof(*inputs->subproperties))))
return E_OUTOFMEMORY;
subproperties = inputs->subproperties;
d2d_effect_subproperties_add(subproperties, L"IsReadOnly", D2D1_SUBPROPERTY_ISREADONLY,
D2D1_PROPERTY_TYPE_BOOL, L"true");
d2d_effect_subproperties_add(subproperties, L"DisplayName", D2D1_SUBPROPERTY_DISPLAYNAME,
D2D1_PROPERTY_TYPE_STRING, L"Inputs");
if (IXmlReader_IsEmptyElement(reader)) return S_OK;
while (parse_effect_get_next_xml_node(reader, XmlNodeType_None, L"Input", &depth) == S_OK)
{
if (FAILED(hr = IXmlReader_GetNodeType(reader, &node_type))) return hr;
if (node_type == XmlNodeType_EndElement) continue;
if (node_type != XmlNodeType_Element) return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
if (FAILED(hr = parse_effect_get_attribute(reader, L"name", &name))) return hr;
swprintf(nameW, ARRAY_SIZE(nameW), L"%lu", input_count);
d2d_effect_subproperties_add(subproperties, nameW, input_count, D2D1_PROPERTY_TYPE_STRING, name);
input_count++;
free(name);
}
*(UINT32 *)(effect->properties.data.ptr + inputs->data.offset) = input_count;
if (FAILED(hr = IXmlReader_GetNodeType(reader, &node_type))) return hr;
if (node_type != XmlNodeType_EndElement) return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
return S_OK;
}
static HRESULT parse_effect_xml(IXmlReader *reader, struct d2d_effect_registration *effect)
{
const WCHAR *node_name;
......@@ -808,7 +857,7 @@ static HRESULT parse_effect_xml(IXmlReader *reader, struct d2d_effect_registrati
if (!wcscmp(node_name, L"Property"))
hr = parse_effect_property(reader, effect);
else if (!wcscmp(node_name, L"Inputs"))
hr = parse_effect_skip_element(reader, depth);
hr = parse_effect_inputs(reader, effect);
else
{
WARN("Unexpected element %s.\n", debugstr_w(node_name));
......
......@@ -10934,12 +10934,15 @@ static void test_effect_context(BOOL d3d11)
static void test_effect_properties(BOOL d3d11)
{
UINT32 i, min_inputs, max_inputs, integer, index;
UINT32 i, min_inputs, max_inputs, integer, index, size;
ID2D1EffectContext *effect_context;
D2D1_BUFFER_PRECISION precision;
ID2D1Properties *subproperties;
D2D1_PROPERTY_TYPE prop_type;
struct d2d1_test_context ctx;
ID2D1Factory1 *factory;
ID2D1Effect *effect;
UINT32 count, data;
WCHAR buffer[128];
CLSID clsid;
BOOL cached;
......@@ -10984,6 +10987,58 @@ static void test_effect_properties(BOOL d3d11)
return;
}
/* Inputs array */
hr = ID2D1Factory1_RegisterEffectFromString(factory, &CLSID_TestEffect, effect_xml_a,
NULL, 0, effect_impl_create);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = ID2D1DeviceContext_CreateEffect(ctx.context, &CLSID_TestEffect, &effect);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
size = ID2D1Effect_GetValueSize(effect, D2D1_PROPERTY_INPUTS);
ok(size == 4, "Unexpected size %u.\n", size);
prop_type = ID2D1Effect_GetType(effect, D2D1_PROPERTY_INPUTS);
ok(prop_type == D2D1_PROPERTY_TYPE_ARRAY, "Unexpected type %u.\n", prop_type);
hr = ID2D1Effect_GetPropertyName(effect, D2D1_PROPERTY_INPUTS, buffer, ARRAY_SIZE(buffer));
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ok(!wcscmp(buffer, L"Inputs"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
/* Value is the number of elements. */
data = 123;
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_INPUTS, D2D1_PROPERTY_TYPE_ARRAY,
(BYTE *)&data, sizeof(data));
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ok(data == 1, "Unexpected data %u.\n", data);
hr = ID2D1Effect_GetSubProperties(effect, D2D1_PROPERTY_INPUTS, &subproperties);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
count = ID2D1Properties_GetPropertyCount(subproperties);
ok(count == 1, "Unexpected count %u.\n", count);
hr = ID2D1Properties_GetPropertyName(subproperties, 0, buffer, ARRAY_SIZE(buffer));
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ok(!wcscmp(buffer, L"0"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
hr = ID2D1Properties_GetValue(subproperties, 0, D2D1_PROPERTY_TYPE_STRING,
(BYTE *)buffer, sizeof(buffer));
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ok(!wcscmp(buffer, L"Source"), "Unexpected value %s.\n", wine_dbgstr_w(buffer));
hr = ID2D1Properties_GetValue(subproperties, D2D1_SUBPROPERTY_ISREADONLY, D2D1_PROPERTY_TYPE_BOOL,
(BYTE *)&data, sizeof(data));
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ok(data == TRUE, "Unexpected value %u.\n", data);
hr = ID2D1Properties_GetPropertyName(subproperties, D2D1_SUBPROPERTY_ISREADONLY,
buffer, ARRAY_SIZE(buffer));
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ok(!wcscmp(buffer, L"IsReadOnly"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
ID2D1Properties_Release(subproperties);
ID2D1Effect_Release(effect);
hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
/* Test system properties */
for (i = 0; i < ARRAY_SIZE(system_property_tests); ++i)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment