[PATCH v3 5/5] d2d1: Implement UnregisterEffect().

Ziqing Hui zhui at codeweavers.com
Mon Jun 13 23:08:56 CDT 2022


Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
---
 dlls/d2d1/factory.c    | 21 +++++++++++++++++++--
 dlls/d2d1/tests/d2d1.c | 32 +++++++++++++++++---------------
 2 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index e5a82f7ffdb..ae0fb51bde8 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -969,9 +969,26 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromString(ID2D1Facto
 
 static HRESULT STDMETHODCALLTYPE d2d_factory_UnregisterEffect(ID2D1Factory3 *iface, REFCLSID effect_id)
 {
-    FIXME("iface %p, effect_id %s stub!\n", iface, debugstr_guid(effect_id));
+    struct d2d_factory *factory = impl_from_ID2D1Factory3(iface);
+    struct d2d_effect_reg *iter, *iter2;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, effect_id %s.\n", iface, debugstr_guid(effect_id));
+
+    LIST_FOR_EACH_ENTRY_SAFE(iter, iter2, &factory->effect_regs, struct d2d_effect_reg, entry)
+    {
+        if (IsEqualGUID(effect_id, &iter->id))
+        {
+            --iter->count;
+            if (!iter->count)
+            {
+                list_remove(&iter->entry);
+                d2d_effect_reg_cleanup(iter);
+            }
+            return S_OK;
+        }
+    }
+
+    return D2DERR_EFFECT_IS_NOT_REGISTERED;
 }
 
 static HRESULT STDMETHODCALLTYPE d2d_factory_GetRegisteredEffects(ID2D1Factory3 *iface,
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 970706bc569..7d60d3c52a2 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -10772,7 +10772,11 @@ static void test_effect_register(BOOL d3d11)
         winetest_push_context("Test %u", i);
 
         hr = ID2D1Factory1_RegisterEffectFromString(factory, &CLSID_TestEffect, test->xml, NULL, 0, effect_impl_create);
-        todo_wine_if(test->hr != S_OK)
+        todo_wine_if(test->xml == effect_xml_without_inputs
+                || test->xml == effect_xml_lower_case_property
+                || test->xml == effect_xml_lower_case_inputs
+                || test->xml == effect_xml_min_max_inputs_a
+                || test->xml == effect_xml_min_max_inputs_b)
         ok(hr == test->hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, test->hr);
         if (hr == S_OK)
         {
@@ -10780,9 +10784,9 @@ static void test_effect_register(BOOL d3d11)
             hr = ID2D1DeviceContext_CreateEffect(device_context, &CLSID_TestEffect, &effect);
             todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
             hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-            todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+            ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
             hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-            todo_wine ok(hr == D2DERR_EFFECT_IS_NOT_REGISTERED, "Got unexpected hr %#lx.\n", hr);
+            ok(hr == D2DERR_EFFECT_IS_NOT_REGISTERED, "Got unexpected hr %#lx.\n", hr);
             if (effect)
                 ID2D1Effect_Release(effect);
         }
@@ -10805,11 +10809,11 @@ static void test_effect_register(BOOL d3d11)
         hr = ID2D1Factory1_RegisterEffectFromString(factory, &CLSID_TestEffect, test->xml, NULL, 0, effect_impl_create);
         ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
         hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-        todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+        ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
         hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-        todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+        ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
         hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-        todo_wine ok(hr == D2DERR_EFFECT_IS_NOT_REGISTERED, "Got unexpected hr %#lx.\n", hr);
+        ok(hr == D2DERR_EFFECT_IS_NOT_REGISTERED, "Got unexpected hr %#lx.\n", hr);
 
         winetest_pop_context();
     }
@@ -10844,9 +10848,9 @@ static void test_effect_register(BOOL d3d11)
     }
 
     hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-    todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+    ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
     hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-    todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+    ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
 
     /* Register effect with property binding */
     for (i = 0; i < ARRAY_SIZE(binding_tests); ++i)
@@ -10856,7 +10860,6 @@ static void test_effect_register(BOOL d3d11)
 
         hr = ID2D1Factory1_RegisterEffectFromString(factory, &CLSID_TestEffect,
                 test->effect_xml, test->binding, test->binding_count, effect_impl_create);
-        todo_wine_if(test->hr != S_OK)
         ok(hr == test->hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, test->hr);
         ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
 
@@ -10905,13 +10908,13 @@ static void test_effect_register(BOOL d3d11)
     }
 
     hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-    todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+    ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
     hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-    todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+    ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
 
     /* Unregister builtin effect */
     hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_D2D1Composite);
-    todo_wine ok(hr == D2DERR_EFFECT_IS_NOT_REGISTERED, "Got unexpected hr %#lx.\n", hr);
+    ok(hr == D2DERR_EFFECT_IS_NOT_REGISTERED, "Got unexpected hr %#lx.\n", hr);
 
     release_test_context(&ctx);
 }
@@ -10989,7 +10992,6 @@ done:
     if (effect)
         ID2D1Effect_Release(effect);
     hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-    todo_wine
     ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
     release_test_context(&ctx);
 }
@@ -11147,7 +11149,7 @@ static void test_effect_properties(BOOL d3d11)
         if (effect)
             ID2D1Effect_Release(effect);
         hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-        todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+        ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
         winetest_pop_context();
     }
 
@@ -11240,7 +11242,7 @@ done:
     if (effect)
         ID2D1Effect_Release(effect);
     hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
-    todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+    ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
 
     release_test_context(&ctx);
 }
-- 
2.25.1




More information about the wine-devel mailing list