Aric Stewart : dwrite: Implement Font File Loader registration.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 20 14:30:34 CDT 2014
Module: wine
Branch: master
Commit: a254741b36108936fcb65a818da8dc756c46b602
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a254741b36108936fcb65a818da8dc756c46b602
Author: Aric Stewart <aric at codeweavers.com>
Date: Tue Aug 12 14:11:30 2014 -0500
dwrite: Implement Font File Loader registration.
---
dlls/dwrite/main.c | 55 ++++++++++++++++++++++++++++++++++++++++----
dlls/dwrite/tests/font.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 110 insertions(+), 4 deletions(-)
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 566a6eb..3620718 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -365,6 +365,8 @@ struct dwritefactory{
IDWriteFontCollectionLoader **loaders;
LONG loader_count;
+ IDWriteFontFileLoader **file_loaders;
+ LONG file_loader_count;
};
static inline struct dwritefactory *impl_from_IDWriteFactory(IDWriteFactory *iface)
@@ -412,6 +414,10 @@ static ULONG WINAPI dwritefactory_Release(IDWriteFactory *iface)
if (This->loaders[i])
IDWriteFontCollectionLoader_Release(This->loaders[i]);
heap_free(This->loaders);
+ for (i = 0; i < This->file_loader_count; i++)
+ if (This->file_loaders[i])
+ IDWriteFontFileLoader_Release(This->file_loaders[i]);
+ heap_free(This->file_loaders);
heap_free(This);
}
@@ -554,16 +560,55 @@ static HRESULT WINAPI dwritefactory_CreateCustomRenderingParams(IDWriteFactory *
static HRESULT WINAPI dwritefactory_RegisterFontFileLoader(IDWriteFactory *iface, IDWriteFontFileLoader *loader)
{
+ int i;
struct dwritefactory *This = impl_from_IDWriteFactory(iface);
- FIXME("(%p)->(%p): stub\n", This, loader);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, loader);
+
+ if (!loader)
+ return E_INVALIDARG;
+
+ for (i = 0; i < This->file_loader_count; i++)
+ if (This->file_loaders[i] == loader)
+ return DWRITE_E_ALREADYREGISTERED;
+ else if (This->file_loaders[i] == NULL)
+ break;
+
+ if (i == This->file_loader_count)
+ {
+ IDWriteFontFileLoader **new_list = NULL;
+ int new_count = 0;
+
+ new_count = This->file_loader_count * 2;
+ new_list = heap_realloc(This->file_loaders, new_count * sizeof(*This->file_loaders));
+
+ if (!new_list)
+ return E_OUTOFMEMORY;
+ else
+ {
+ This->file_loader_count = new_count;
+ This->file_loaders = new_list;
+ }
+ }
+ IDWriteFontFileLoader_AddRef(loader);
+ This->file_loaders[i] = loader;
+
+ return S_OK;
}
static HRESULT WINAPI dwritefactory_UnregisterFontFileLoader(IDWriteFactory *iface, IDWriteFontFileLoader *loader)
{
+ int i;
struct dwritefactory *This = impl_from_IDWriteFactory(iface);
- FIXME("(%p)->(%p): stub\n", This, loader);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, loader);
+
+ for (i = 0; i < This->file_loader_count; i++)
+ if (This->file_loaders[i] == loader) break;
+ if (i == This->file_loader_count)
+ return E_INVALIDARG;
+ IDWriteFontFileLoader_Release(This->file_loaders[i]);
+ This->file_loaders[i] = NULL;
+
+ return S_OK;
}
static HRESULT WINAPI dwritefactory_CreateTextFormat(IDWriteFactory *iface, WCHAR const* family_name,
@@ -687,6 +732,8 @@ HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE type, REFIID riid, IUnkno
This->ref = 1;
This->loader_count = 2;
This->loaders = heap_alloc_zero(sizeof(*This->loaders) * 2);
+ This->file_loader_count = 2;
+ This->file_loaders = heap_alloc_zero(sizeof(*This->file_loaders) * 2);
*factory = (IUnknown*)&This->IDWriteFactory_iface;
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 6366817..243af9f 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -722,6 +722,64 @@ static void test_CustomFontCollection(void)
ok(hr == S_OK, "got 0x%08x\n", hr);
}
+static HRESULT WINAPI fontfileloader_QueryInterface(IDWriteFontFileLoader *iface, REFIID riid, void **obj)
+{
+ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteFontFileLoader))
+ {
+ *obj = iface;
+ IDWriteFontFileLoader_AddRef(iface);
+ return S_OK;
+ }
+
+ *obj = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI fontfileloader_AddRef(IDWriteFontFileLoader *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI fontfileloader_Release(IDWriteFontFileLoader *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI fontfileloader_CreateStreamFromKey(IDWriteFontFileLoader *iface, const void *fontFileReferenceKey, UINT32 fontFileReferenceKeySize, IDWriteFontFileStream **fontFileStream)
+{
+ return 0x8faecafe;
+}
+
+static const struct IDWriteFontFileLoaderVtbl dwritefontfileloadervtbl = {
+ fontfileloader_QueryInterface,
+ fontfileloader_AddRef,
+ fontfileloader_Release,
+ fontfileloader_CreateStreamFromKey
+};
+
+static void test_FontLoader(void)
+{
+ IDWriteFontFileLoader floader = { &dwritefontfileloadervtbl };
+ IDWriteFontFileLoader floader2 = { &dwritefontfileloadervtbl };
+ HRESULT hr;
+
+ hr = IDWriteFactory_RegisterFontFileLoader(factory, NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+ hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader2);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader);
+ ok(hr == DWRITE_E_ALREADYREGISTERED, "got 0x%08x\n", hr);
+
+ hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+ hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader2);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+}
+
START_TEST(font)
{
HRESULT hr;
@@ -743,6 +801,7 @@ START_TEST(font)
test_system_fontcollection();
test_ConvertFontFaceToLOGFONT();
test_CustomFontCollection();
+ test_FontLoader();
IDWriteFactory_Release(factory);
}
More information about the wine-cvs
mailing list