From 4ad75a7ae83abf2d59f979cdaf755d9c5a5172ff Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 16 May 2024 16:21:44 +0200 Subject: [PATCH] d2d1/effect: Implement ConnectNode(). Signed-off-by: Nikolay Sivov --- dlls/d2d1/d2d1_private.h | 3 +++ dlls/d2d1/effect.c | 47 ++++++++++++++++++++++++++++++++++++++-- dlls/d2d1/tests/d2d1.c | 5 ----- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index c3c5c6404ab..58507fd2c0b 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -753,6 +753,9 @@ struct d2d_transform_node struct list entry; ID2D1TransformNode *object; struct d2d_render_info *render_info; + struct d2d_transform_node **inputs; + unsigned int input_count; + struct d2d_transform_node *output; }; struct d2d_transform_node_connection diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index f32eba886bf..cebc492d895 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -620,6 +620,12 @@ static HRESULT d2d_transform_graph_add_node(struct d2d_transform_graph *graph, if (!(node = calloc(1, sizeof(*node)))) return E_OUTOFMEMORY; + node->input_count = ID2D1TransformNode_GetInputCount(object); + if (!(node->inputs = calloc(node->input_count, sizeof(*node->inputs)))) + { + free(node); + return E_OUTOFMEMORY; + } node->object = object; ID2D1TransformNode_AddRef(node->object); @@ -628,6 +634,24 @@ static HRESULT d2d_transform_graph_add_node(struct d2d_transform_graph *graph, return S_OK; } +static void d2d_transform_node_disconnect(struct d2d_transform_node *node) +{ + struct d2d_transform_node *output = node->output; + unsigned int i; + + if (!output) + return; + + for (i = 0; i < output->input_count; ++i) + { + if (output->inputs[i] == node) + { + output->inputs[i] = NULL; + break; + } + } +} + static void d2d_transform_graph_delete_node(struct d2d_transform_graph *graph, struct d2d_transform_node *node) { @@ -648,6 +672,9 @@ static void d2d_transform_graph_delete_node(struct d2d_transform_graph *graph, if (node->render_info) ID2D1DrawInfo_Release(&node->render_info->ID2D1DrawInfo_iface); + d2d_transform_node_disconnect(node); + + free(node->inputs); free(node); } @@ -797,9 +824,25 @@ static HRESULT STDMETHODCALLTYPE d2d_transform_graph_SetOutputNode(ID2D1Transfor static HRESULT STDMETHODCALLTYPE d2d_transform_graph_ConnectNode(ID2D1TransformGraph *iface, ID2D1TransformNode *from_node, ID2D1TransformNode *to_node, UINT32 index) { - FIXME("iface %p, from_node %p, to_node %p, index %u stub!\n", iface, from_node, to_node, index); + struct d2d_transform_graph *graph = impl_from_ID2D1TransformGraph(iface); + struct d2d_transform_node *from, *to; - return E_NOTIMPL; + TRACE("iface %p, from_node %p, to_node %p, index %u.\n", iface, from_node, to_node, index); + + if (!(from = d2d_transform_graph_get_node(graph, from_node))) + return HRESULT_FROM_WIN32(ERROR_NOT_FOUND); + + if (!(to = d2d_transform_graph_get_node(graph, to_node))) + return HRESULT_FROM_WIN32(ERROR_NOT_FOUND); + + if (index >= to->input_count) + return E_INVALIDARG; + + d2d_transform_node_disconnect(from); + to->inputs[index] = from; + from->output = to; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d2d_transform_graph_ConnectToEffectInput(ID2D1TransformGraph *iface, diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index cfe44936864..ae0b6f51bdc 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -12873,7 +12873,6 @@ static void test_transform_graph(BOOL d3d11) ID2D1TransformGraph_Clear(graph); hr = ID2D1TransformGraph_ConnectNode(graph, (ID2D1TransformNode *)offset_transform, (ID2D1TransformNode *)blend_transform, 0); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Got unexpected hr %#lx.\n", hr); /* Connect added node to un-added node */ @@ -12881,7 +12880,6 @@ static void test_transform_graph(BOOL d3d11) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = ID2D1TransformGraph_ConnectNode(graph, (ID2D1TransformNode *)offset_transform, (ID2D1TransformNode *)blend_transform, 0); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Got unexpected hr %#lx.\n", hr); /* Connect un-added node to added node */ @@ -12890,7 +12888,6 @@ static void test_transform_graph(BOOL d3d11) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = ID2D1TransformGraph_ConnectNode(graph, (ID2D1TransformNode *)offset_transform, (ID2D1TransformNode *)blend_transform, 0); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Got unexpected hr %#lx.\n", hr); /* Connect nodes */ @@ -12904,14 +12901,12 @@ static void test_transform_graph(BOOL d3d11) { hr = ID2D1TransformGraph_ConnectNode(graph, (ID2D1TransformNode *)offset_transform, (ID2D1TransformNode *)blend_transform, i); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); } /* Connect node to out-of-bounds index */ hr = ID2D1TransformGraph_ConnectNode(graph, (ID2D1TransformNode *)offset_transform, (ID2D1TransformNode *)blend_transform, count); - todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); /* Passthrough graph. */