Nikolay Sivov : dwrite: Added stub EUDC font collection.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Dec 17 16:32:34 CST 2014
Module: wine
Branch: master
Commit: 00ea0b72b64a190014fcd507f1ed3b182b87c89f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=00ea0b72b64a190014fcd507f1ed3b182b87c89f
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Dec 17 09:54:13 2014 +0300
dwrite: Added stub EUDC font collection.
---
dlls/dwrite/dwrite_private.h | 1 +
dlls/dwrite/font.c | 52 ++++++++++++++++++++++++++++++++++++++++++++
dlls/dwrite/main.c | 22 +++++++++++++++++--
dlls/dwrite/tests/font.c | 28 ++++++++++++++++++++++++
4 files changed, 101 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 3558bf8..907a1c3 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -103,6 +103,7 @@ extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDE
extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN;
extern HRESULT get_system_fontcollection(IDWriteFactory2*,IDWriteFontCollection**) DECLSPEC_HIDDEN;
+extern HRESULT get_eudc_fontcollection(IDWriteFactory2*,IDWriteFontCollection**) DECLSPEC_HIDDEN;
extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) DECLSPEC_HIDDEN;
extern HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, IDWriteFontFile **font_file) DECLSPEC_HIDDEN;
extern HRESULT create_localfontfileloader(IDWriteLocalFontFileLoader** iface) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 61d370b..80b7f07 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -1968,6 +1968,58 @@ HRESULT get_system_fontcollection(IDWriteFactory2 *factory, IDWriteFontCollectio
return hr;
}
+static HRESULT WINAPI eudcfontfileenumerator_QueryInterface(IDWriteFontFileEnumerator *iface, REFIID riid, void **obj)
+{
+ *obj = NULL;
+
+ if (IsEqualIID(riid, &IID_IDWriteFontFileEnumerator) || IsEqualIID(riid, &IID_IUnknown)) {
+ IDWriteFontFileEnumerator_AddRef(iface);
+ *obj = iface;
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI eudcfontfileenumerator_AddRef(IDWriteFontFileEnumerator *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI eudcfontfileenumerator_Release(IDWriteFontFileEnumerator *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI eudcfontfileenumerator_GetCurrentFontFile(IDWriteFontFileEnumerator *iface, IDWriteFontFile **file)
+{
+ *file = NULL;
+ return E_FAIL;
+}
+
+static HRESULT WINAPI eudcfontfileenumerator_MoveNext(IDWriteFontFileEnumerator *iface, BOOL *current)
+{
+ *current = FALSE;
+ return S_OK;
+}
+
+static const struct IDWriteFontFileEnumeratorVtbl eudcfontfileenumeratorvtbl =
+{
+ eudcfontfileenumerator_QueryInterface,
+ eudcfontfileenumerator_AddRef,
+ eudcfontfileenumerator_Release,
+ eudcfontfileenumerator_MoveNext,
+ eudcfontfileenumerator_GetCurrentFontFile
+};
+
+static IDWriteFontFileEnumerator eudc_fontfile_enumerator = { &eudcfontfileenumeratorvtbl };
+
+HRESULT get_eudc_fontcollection(IDWriteFactory2 *factory, IDWriteFontCollection **collection)
+{
+ TRACE("building EUDC font collection for factory %p\n", factory);
+ return create_font_collection(factory, &eudc_fontfile_enumerator, FALSE, collection);
+}
+
static HRESULT WINAPI dwritefontfile_QueryInterface(IDWriteFontFile *iface, REFIID riid, void **obj)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index eeb8728..8ad5097 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -453,6 +453,7 @@ struct dwritefactory {
LONG ref;
IDWriteFontCollection *system_collection;
+ IDWriteFontCollection *eudc_collection;
IDWriteGdiInterop *gdiinterop;
IDWriteLocalFontFileLoader* localfontfileloader;
@@ -505,6 +506,8 @@ static void release_dwritefactory(struct dwritefactory *factory)
if (factory->system_collection)
IDWriteFontCollection_Release(factory->system_collection);
+ if (factory->eudc_collection)
+ IDWriteFontCollection_Release(factory->eudc_collection);
if (factory->gdiinterop)
release_gdiinterop(factory->gdiinterop);
heap_free(factory);
@@ -1025,8 +1028,22 @@ static HRESULT WINAPI dwritefactory1_GetEudcFontCollection(IDWriteFactory2 *ifac
BOOL check_for_updates)
{
struct dwritefactory *This = impl_from_IDWriteFactory2(iface);
- FIXME("(%p)->(%p %d): stub\n", This, collection, check_for_updates);
- return E_NOTIMPL;
+ HRESULT hr = S_OK;
+
+ TRACE("(%p)->(%p %d)\n", This, collection, check_for_updates);
+
+ if (check_for_updates)
+ FIXME("checking for eudc updates not implemented\n");
+
+ if (!This->eudc_collection)
+ hr = get_eudc_fontcollection(iface, &This->eudc_collection);
+
+ if (SUCCEEDED(hr))
+ IDWriteFontCollection_AddRef(This->eudc_collection);
+
+ *collection = This->eudc_collection;
+
+ return hr;
}
static HRESULT WINAPI dwritefactory1_CreateCustomRenderingParams(IDWriteFactory2 *iface, FLOAT gamma,
@@ -1172,6 +1189,7 @@ static void init_dwritefactory(struct dwritefactory *factory, DWRITE_FACTORY_TYP
factory->ref = 1;
factory->localfontfileloader = NULL;
factory->system_collection = NULL;
+ factory->eudc_collection = NULL;
factory->gdiinterop = NULL;
list_init(&factory->collection_loaders);
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index f63ab1d..c3cad68 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -2928,6 +2928,33 @@ static void test_GetGlyphRunOutline(void)
DeleteFileW(test_fontfile);
}
+static void test_GetEudcFontCollection(void)
+{
+ IDWriteFontCollection *coll, *coll2;
+ IDWriteFactory1 *factory1;
+ IDWriteFactory *factory;
+ HRESULT hr;
+
+ factory = create_factory();
+
+ hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory1, (void**)&factory1);
+ IDWriteFactory_Release(factory);
+ if (hr != S_OK) {
+ win_skip("GetEudcFontCollection() is not supported.\n");
+ return;
+ }
+
+ hr = IDWriteFactory1_GetEudcFontCollection(factory1, &coll, FALSE);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IDWriteFactory1_GetEudcFontCollection(factory1, &coll2, FALSE);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(coll == coll2, "got %p, %p\n", coll, coll2);
+ IDWriteFontCollection_Release(coll);
+ IDWriteFontCollection_Release(coll2);
+
+ IDWriteFactory1_Release(factory1);
+}
+
START_TEST(font)
{
IDWriteFactory *factory;
@@ -2965,6 +2992,7 @@ START_TEST(font)
test_GetDesignGlyphAdvances();
test_IsMonospacedFont();
test_GetGlyphRunOutline();
+ test_GetEudcFontCollection();
IDWriteFactory_Release(factory);
}
More information about the wine-cvs
mailing list