Nikolay Sivov : dwrite: Use regular QI way to return interface client asked for.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 28 09:12:37 CDT 2016


Module: wine
Branch: master
Commit: 7c6dcab73f9b34ae6dba662a2eb374298098a4f4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7c6dcab73f9b34ae6dba662a2eb374298098a4f4

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Mar 28 13:33:56 2016 +0300

dwrite: Use regular QI way to return interface client asked for.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/main.c       | 22 +++++++---------------
 dlls/dwrite/tests/font.c |  9 +++++++++
 2 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index e081e11..b82a4b0 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -1313,21 +1313,14 @@ static void init_dwritefactory(struct dwritefactory *factory, DWRITE_FACTORY_TYP
 HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE type, REFIID riid, IUnknown **ret)
 {
     struct dwritefactory *factory;
+    HRESULT hr;
 
     TRACE("(%d, %s, %p)\n", type, debugstr_guid(riid), ret);
 
     *ret = NULL;
 
-    if (!IsEqualIID(riid, &IID_IDWriteFactory) &&
-        !IsEqualIID(riid, &IID_IDWriteFactory1) &&
-        !IsEqualIID(riid, &IID_IDWriteFactory2))
-        return E_FAIL;
-
-    if (type == DWRITE_FACTORY_TYPE_SHARED && shared_factory) {
-        *ret = (IUnknown*)shared_factory;
-        IDWriteFactory2_AddRef(shared_factory);
-        return S_OK;
-    }
+    if (type == DWRITE_FACTORY_TYPE_SHARED && shared_factory)
+        return IDWriteFactory2_QueryInterface(shared_factory, riid, (void**)ret);
 
     factory = heap_alloc(sizeof(struct dwritefactory));
     if (!factory) return E_OUTOFMEMORY;
@@ -1337,11 +1330,10 @@ HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE type, REFIID riid, IUnkno
     if (type == DWRITE_FACTORY_TYPE_SHARED)
         if (InterlockedCompareExchangePointer((void**)&shared_factory, &factory->IDWriteFactory2_iface, NULL)) {
             release_shared_factory(&factory->IDWriteFactory2_iface);
-            *ret = (IUnknown*)shared_factory;
-            IDWriteFactory2_AddRef(shared_factory);
-            return S_OK;
+            return IDWriteFactory2_QueryInterface(shared_factory, riid, (void**)ret);
         }
 
-    *ret = (IUnknown*)&factory->IDWriteFactory2_iface;
-    return S_OK;
+    hr = IDWriteFactory2_QueryInterface(&factory->IDWriteFactory2_iface, riid, (void**)ret);
+    IDWriteFactory2_Release(&factory->IDWriteFactory2_iface);
+    return hr;
 }
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 7c19f00..766df39 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -2312,6 +2312,11 @@ static void test_shared_isolated(void)
     hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, (IUnknown**)&shared2);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(shared == shared2, "got %p, and %p\n", shared, shared2);
+    IDWriteFactory_Release(shared2);
+
+    hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IUnknown, (IUnknown**)&shared2);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(shared == shared2, "got %p, and %p\n", shared, shared2);
 
     IDWriteFactory_Release(shared);
     IDWriteFactory_Release(shared2);
@@ -2330,6 +2335,10 @@ static void test_shared_isolated(void)
     ok(isolated != isolated2, "got %p, and %p\n", isolated, isolated2);
     IDWriteFactory_Release(isolated2);
 
+    hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_ISOLATED, &IID_IUnknown, (IUnknown**)&isolated2);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    IDWriteFactory_Release(isolated2);
+
     hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED+1, &IID_IDWriteFactory, (IUnknown**)&isolated2);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(shared != isolated2, "got %p, and %p\n", shared, isolated2);




More information about the wine-cvs mailing list