From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/d2d1_private.h | 3 +++ dlls/d2d1/effect.c | 17 +++++++++++++++-- dlls/d2d1/tests/d2d1.c | 7 +++++++ 3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index bd6ca55ea96..c3c5c6404ab 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -771,6 +771,9 @@ struct d2d_transform_graph
struct d2d_transform_node *output;
+ bool passthrough; + unsigned int passthrough_input; + struct list nodes; };
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index 25a75a31ecb..f32eba886bf 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -659,6 +659,7 @@ static void d2d_transform_graph_clear(struct d2d_transform_graph *graph) { d2d_transform_graph_delete_node(graph, node); } + graph->passthrough = false; }
static inline struct d2d_transform_graph *impl_from_ID2D1TransformGraph(ID2D1TransformGraph *iface) @@ -788,6 +789,7 @@ static HRESULT STDMETHODCALLTYPE d2d_transform_graph_SetOutputNode(ID2D1Transfor return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
graph->output = node; + graph->passthrough = false;
return S_OK; } @@ -821,6 +823,7 @@ static HRESULT STDMETHODCALLTYPE d2d_transform_graph_ConnectToEffectInput(ID2D1T
graph->inputs[input_index].node = node; graph->inputs[input_index].index = node_index; + graph->passthrough = false;
return S_OK; } @@ -836,9 +839,19 @@ static void STDMETHODCALLTYPE d2d_transform_graph_Clear(ID2D1TransformGraph *ifa
static HRESULT STDMETHODCALLTYPE d2d_transform_graph_SetPassthroughGraph(ID2D1TransformGraph *iface, UINT32 index) { - FIXME("iface %p, index %u stub!\n", iface, index); + struct d2d_transform_graph *graph = impl_from_ID2D1TransformGraph(iface);
- return E_NOTIMPL; + TRACE("iface %p, index %u.\n", iface, index); + + if (index >= graph->input_count) + return E_INVALIDARG; + + d2d_transform_graph_clear(graph); + + graph->passthrough = true; + graph->passthrough_input = index; + + return S_OK; }
static const ID2D1TransformGraphVtbl d2d_transform_graph_vtbl = diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 2ec11c342ad..cfe44936864 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -12914,6 +12914,13 @@ static void test_transform_graph(BOOL d3d11) todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr);
+ /* Passthrough graph. */ + hr = ID2D1TransformGraph_SetPassthroughGraph(graph, 100); + ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); + + hr = ID2D1TransformGraph_SetPassthroughGraph(graph, 0); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1BlendTransform_Release(blend_transform); ID2D1OffsetTransform_Release(offset_transform); ID2D1Effect_Release(effect);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- 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. */