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

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2016-03-28 13:33:56 +03:00 committed by Alexandre Julliard
parent 19777292a3
commit 7c6dcab73f
2 changed files with 16 additions and 15 deletions

View file

@ -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;
}

View file

@ -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);