[PATCH 3/4] dwrite: Update to IDWriteFontCollection3.

Nikolay Sivov nsivov at codeweavers.com
Tue Oct 8 05:04:34 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/dwrite_private.h |   7 +-
 dlls/dwrite/font.c           | 147 ++++++++++++++++++++++++-----------
 dlls/dwrite/main.c           |   8 +-
 dlls/dwrite/tests/font.c     |  15 ++++
 include/dwrite_3.idl         |   2 +-
 5 files changed, 125 insertions(+), 54 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index d0fed98d6f..406664a590 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -239,13 +239,14 @@ extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLoca
 extern void    set_en_localizedstring(IDWriteLocalizedStrings*,const WCHAR*) DECLSPEC_HIDDEN;
 extern void    sort_localizedstrings(IDWriteLocalizedStrings*) DECLSPEC_HIDDEN;
 extern HRESULT get_system_fontcollection(IDWriteFactory5*,IDWriteFontCollection1**) DECLSPEC_HIDDEN;
-extern HRESULT get_eudc_fontcollection(IDWriteFactory5*,IDWriteFontCollection1**) DECLSPEC_HIDDEN;
+extern HRESULT get_eudc_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection3 **collection) DECLSPEC_HIDDEN;
 extern IDWriteTextAnalyzer *get_text_analyzer(void) DECLSPEC_HIDDEN;
 extern HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, IDWriteFontFile **font_file) DECLSPEC_HIDDEN;
 extern void    init_local_fontfile_loader(void) DECLSPEC_HIDDEN;
 extern IDWriteFontFileLoader *get_local_fontfile_loader(void) DECLSPEC_HIDDEN;
 extern HRESULT create_fontface(const struct fontface_desc*,struct list*,IDWriteFontFace4**) DECLSPEC_HIDDEN;
-extern HRESULT create_font_collection(IDWriteFactory5*,IDWriteFontFileEnumerator*,BOOL,IDWriteFontCollection1**) DECLSPEC_HIDDEN;
+extern HRESULT create_font_collection(IDWriteFactory5 *factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system,
+       IDWriteFontCollection3 **collection) DECLSPEC_HIDDEN;
 extern HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc*,IDWriteGlyphRunAnalysis**) DECLSPEC_HIDDEN;
 extern BOOL    is_system_collection(IDWriteFontCollection*) DECLSPEC_HIDDEN;
 extern HRESULT get_local_refkey(const WCHAR*,const FILETIME*,void**,UINT32*) DECLSPEC_HIDDEN;
@@ -264,7 +265,7 @@ extern HRESULT create_fontfacereference(IDWriteFactory5*,IDWriteFontFile*,UINT32
     IDWriteFontFaceReference**) DECLSPEC_HIDDEN;
 extern HRESULT factory_get_cached_fontface(IDWriteFactory5*,IDWriteFontFile*const*,UINT32,DWRITE_FONT_SIMULATIONS,
         struct list**,REFIID,void**) DECLSPEC_HIDDEN;
-extern void factory_detach_fontcollection(IDWriteFactory5*,IDWriteFontCollection1*) DECLSPEC_HIDDEN;
+extern void factory_detach_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection3 *collection) DECLSPEC_HIDDEN;
 extern void factory_detach_gdiinterop(IDWriteFactory5*,IDWriteGdiInterop1*) DECLSPEC_HIDDEN;
 extern struct fontfacecached *factory_cache_fontface(IDWriteFactory5*,struct list*,IDWriteFontFace4*) DECLSPEC_HIDDEN;
 extern void    get_logfont_from_font(IDWriteFont*,LOGFONTW*) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 604c67f565..ce376e339f 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -116,7 +116,7 @@ struct dwrite_fontfamily_data
 
 struct dwrite_fontcollection
 {
-    IDWriteFontCollection1 IDWriteFontCollection1_iface;
+    IDWriteFontCollection3 IDWriteFontCollection3_iface;
     LONG refcount;
 
     IDWriteFactory5 *factory;
@@ -296,9 +296,9 @@ static inline struct dwrite_fontfamily *impl_family_from_IDWriteFontList1(IDWrit
     return CONTAINING_RECORD(iface, struct dwrite_fontfamily, IDWriteFontList1_iface);
 }
 
-static inline struct dwrite_fontcollection *impl_from_IDWriteFontCollection1(IDWriteFontCollection1 *iface)
+static inline struct dwrite_fontcollection *impl_from_IDWriteFontCollection3(IDWriteFontCollection3 *iface)
 {
-    return CONTAINING_RECORD(iface, struct dwrite_fontcollection, IDWriteFontCollection1_iface);
+    return CONTAINING_RECORD(iface, struct dwrite_fontcollection, IDWriteFontCollection3_iface);
 }
 
 static inline struct dwrite_glyphrunanalysis *impl_from_IDWriteGlyphRunAnalysis(IDWriteGlyphRunAnalysis *iface)
@@ -2025,7 +2025,7 @@ static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily1 *iface)
 
     if (!ref)
     {
-        IDWriteFontCollection1_Release(&This->collection->IDWriteFontCollection1_iface);
+        IDWriteFontCollection3_Release(&This->collection->IDWriteFontCollection3_iface);
         release_fontfamily_data(This->data);
         heap_free(This);
     }
@@ -2380,7 +2380,7 @@ static HRESULT create_fontfamily(struct dwrite_fontcollection *collection, UINT3
     object->IDWriteFontList1_iface.lpVtbl = &fontfamilylistvtbl;
     object->ref = 1;
     object->collection = collection;
-    IDWriteFontCollection1_AddRef(&collection->IDWriteFontCollection1_iface);
+    IDWriteFontCollection3_AddRef(&collection->IDWriteFontCollection3_iface);
     object->data = collection->family_data[index];
     InterlockedIncrement(&object->data->refcount);
 
@@ -2395,17 +2395,20 @@ BOOL is_system_collection(IDWriteFontCollection *collection)
     return IDWriteFontCollection_QueryInterface(collection, &IID_issystemcollection, &obj) == S_OK;
 }
 
-static HRESULT WINAPI dwritesystemfontcollection_QueryInterface(IDWriteFontCollection1 *iface, REFIID riid, void **obj)
+static HRESULT WINAPI dwritesystemfontcollection_QueryInterface(IDWriteFontCollection3 *iface, REFIID riid, void **obj)
 {
-    struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
-    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
+
+    TRACE("%p, %s, %p.\n", collection, debugstr_guid(riid), obj);
 
-    if (IsEqualIID(riid, &IID_IDWriteFontCollection1) ||
+    if (IsEqualIID(riid, &IID_IDWriteFontCollection3) ||
+        IsEqualIID(riid, &IID_IDWriteFontCollection2) ||
+        IsEqualIID(riid, &IID_IDWriteFontCollection1) ||
         IsEqualIID(riid, &IID_IDWriteFontCollection) ||
         IsEqualIID(riid, &IID_IUnknown))
     {
         *obj = iface;
-        IDWriteFontCollection1_AddRef(iface);
+        IDWriteFontCollection3_AddRef(iface);
         return S_OK;
     }
 
@@ -2419,17 +2422,18 @@ static HRESULT WINAPI dwritesystemfontcollection_QueryInterface(IDWriteFontColle
     return E_NOINTERFACE;
 }
 
-static HRESULT WINAPI dwritefontcollection_QueryInterface(IDWriteFontCollection1 *iface, REFIID riid, void **obj)
+static HRESULT WINAPI dwritefontcollection_QueryInterface(IDWriteFontCollection3 *iface, REFIID riid, void **obj)
 {
-    struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
-    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
 
-    if (IsEqualIID(riid, &IID_IDWriteFontCollection1) ||
+    if (IsEqualIID(riid, &IID_IDWriteFontCollection3) ||
+        IsEqualIID(riid, &IID_IDWriteFontCollection2) ||
+        IsEqualIID(riid, &IID_IDWriteFontCollection1) ||
         IsEqualIID(riid, &IID_IDWriteFontCollection) ||
         IsEqualIID(riid, &IID_IUnknown))
     {
         *obj = iface;
-        IDWriteFontCollection1_AddRef(iface);
+        IDWriteFontCollection3_AddRef(iface);
         return S_OK;
     }
 
@@ -2440,9 +2444,9 @@ static HRESULT WINAPI dwritefontcollection_QueryInterface(IDWriteFontCollection1
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI dwritefontcollection_AddRef(IDWriteFontCollection1 *iface)
+static ULONG WINAPI dwritefontcollection_AddRef(IDWriteFontCollection3 *iface)
 {
-    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
     ULONG refcount = InterlockedIncrement(&collection->refcount);
 
     TRACE("%p, refcount %d.\n", collection, refcount);
@@ -2450,9 +2454,9 @@ static ULONG WINAPI dwritefontcollection_AddRef(IDWriteFontCollection1 *iface)
     return refcount;
 }
 
-static ULONG WINAPI dwritefontcollection_Release(IDWriteFontCollection1 *iface)
+static ULONG WINAPI dwritefontcollection_Release(IDWriteFontCollection3 *iface)
 {
-    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
     ULONG refcount = InterlockedDecrement(&collection->refcount);
     size_t i;
 
@@ -2470,19 +2474,19 @@ static ULONG WINAPI dwritefontcollection_Release(IDWriteFontCollection1 *iface)
     return refcount;
 }
 
-static UINT32 WINAPI dwritefontcollection_GetFontFamilyCount(IDWriteFontCollection1 *iface)
+static UINT32 WINAPI dwritefontcollection_GetFontFamilyCount(IDWriteFontCollection3 *iface)
 {
-    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
 
     TRACE("%p.\n", iface);
 
     return collection->count;
 }
 
-static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection1 *iface, UINT32 index,
+static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection3 *iface, UINT32 index,
         IDWriteFontFamily **family)
 {
-    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
 
     TRACE("%p, %u, %p.\n", iface, index, family);
 
@@ -2516,11 +2520,14 @@ static UINT32 collection_find_family(struct dwrite_fontcollection *collection, c
     return ~0u;
 }
 
-static HRESULT WINAPI dwritefontcollection_FindFamilyName(IDWriteFontCollection1 *iface, const WCHAR *name, UINT32 *index, BOOL *exists)
+static HRESULT WINAPI dwritefontcollection_FindFamilyName(IDWriteFontCollection3 *iface, const WCHAR *name,
+        UINT32 *index, BOOL *exists)
 {
-    struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
-    TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(name), index, exists);
-    *index = collection_find_family(This, name);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
+
+    TRACE("%p, %s, %p, %p.\n", iface, debugstr_w(name), index, exists);
+
+    *index = collection_find_family(collection, name);
     *exists = *index != ~0u;
     return S_OK;
 }
@@ -2548,10 +2555,10 @@ static BOOL is_same_fontfile(IDWriteFontFile *left, IDWriteFontFile *right)
     return !memcmp(left_key, right_key, left_key_size);
 }
 
-static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollection1 *iface, IDWriteFontFace *face,
+static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollection3 *iface, IDWriteFontFace *face,
         IDWriteFont **font)
 {
-    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
     IDWriteFontFamily1 *family;
     BOOL found_font = FALSE;
     IDWriteFontFile *file;
@@ -2604,19 +2611,17 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
     return hr;
 }
 
-static HRESULT WINAPI dwritefontcollection1_GetFontSet(IDWriteFontCollection1 *iface, IDWriteFontSet **fontset)
+static HRESULT WINAPI dwritefontcollection1_GetFontSet(IDWriteFontCollection3 *iface, IDWriteFontSet **fontset)
 {
-    struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
-
-    FIXME("(%p)->(%p): stub\n", This, fontset);
+    FIXME("%p, %p.\n", iface, fontset);
 
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection1 *iface, UINT32 index,
+static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection3 *iface, UINT32 index,
         IDWriteFontFamily1 **family)
 {
-    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+    struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
 
     TRACE("%p, %u, %p.\n", iface, index, family);
 
@@ -2629,7 +2634,46 @@ static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection1
     return create_fontfamily(collection, index, family);
 }
 
-static const IDWriteFontCollection1Vtbl fontcollectionvtbl = {
+static HRESULT WINAPI dwritefontcollection2_GetFontFamily(IDWriteFontCollection3 *iface,
+        UINT32 index, IDWriteFontFamily2 **family)
+{
+    FIXME("%p, %u, %p.\n", iface, index, family);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontcollection2_GetMatchingFonts(IDWriteFontCollection3 *iface,
+        const WCHAR *familyname, DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_values,
+        IDWriteFontList2 **fontlist)
+{
+    FIXME("%p, %s, %p, %u, %p.\n", iface, debugstr_w(familyname), axis_values, num_values, fontlist);
+
+    return E_NOTIMPL;
+}
+
+static DWRITE_FONT_FAMILY_MODEL WINAPI dwritefontcollection2_GetFontFamilyModel(IDWriteFontCollection3 *iface)
+{
+    FIXME("%p.\n", iface);
+
+    return DWRITE_FONT_FAMILY_MODEL_WEIGHT_STRETCH_STYLE;
+}
+
+static HRESULT WINAPI dwritefontcollection2_GetFontSet(IDWriteFontCollection3 *iface, IDWriteFontSet1 **fontset)
+{
+    FIXME("%p, %p.\n", iface, fontset);
+
+    return E_NOTIMPL;
+}
+
+static HANDLE WINAPI dwritefontcollection3_GetExpirationEvent(IDWriteFontCollection3 *iface)
+{
+    FIXME("%p.\n", iface);
+
+    return NULL;
+}
+
+static const IDWriteFontCollection3Vtbl fontcollectionvtbl =
+{
     dwritefontcollection_QueryInterface,
     dwritefontcollection_AddRef,
     dwritefontcollection_Release,
@@ -2638,10 +2682,16 @@ static const IDWriteFontCollection1Vtbl fontcollectionvtbl = {
     dwritefontcollection_FindFamilyName,
     dwritefontcollection_GetFontFromFontFace,
     dwritefontcollection1_GetFontSet,
-    dwritefontcollection1_GetFontFamily
+    dwritefontcollection1_GetFontFamily,
+    dwritefontcollection2_GetFontFamily,
+    dwritefontcollection2_GetMatchingFonts,
+    dwritefontcollection2_GetFontFamilyModel,
+    dwritefontcollection2_GetFontSet,
+    dwritefontcollection3_GetExpirationEvent,
 };
 
-static const IDWriteFontCollection1Vtbl systemfontcollectionvtbl = {
+static const IDWriteFontCollection3Vtbl systemfontcollectionvtbl =
+{
     dwritesystemfontcollection_QueryInterface,
     dwritefontcollection_AddRef,
     dwritefontcollection_Release,
@@ -2650,7 +2700,12 @@ static const IDWriteFontCollection1Vtbl systemfontcollectionvtbl = {
     dwritefontcollection_FindFamilyName,
     dwritefontcollection_GetFontFromFontFace,
     dwritefontcollection1_GetFontSet,
-    dwritefontcollection1_GetFontFamily
+    dwritefontcollection1_GetFontFamily,
+    dwritefontcollection2_GetFontFamily,
+    dwritefontcollection2_GetMatchingFonts,
+    dwritefontcollection2_GetFontFamilyModel,
+    dwritefontcollection2_GetFontSet,
+    dwritefontcollection3_GetExpirationEvent,
 };
 
 static HRESULT fontfamily_add_font(struct dwrite_fontfamily_data *family_data, struct dwrite_font_data *font_data)
@@ -2686,7 +2741,7 @@ static HRESULT fontcollection_add_family(struct dwrite_fontcollection *collectio
 
 static HRESULT init_font_collection(struct dwrite_fontcollection *collection, BOOL is_system)
 {
-    collection->IDWriteFontCollection1_iface.lpVtbl = is_system ? &systemfontcollectionvtbl : &fontcollectionvtbl;
+    collection->IDWriteFontCollection3_iface.lpVtbl = is_system ? &systemfontcollectionvtbl : &fontcollectionvtbl;
     collection->refcount = 1;
     collection->count = 0;
     collection->size = 0;
@@ -3765,7 +3820,7 @@ static void fontcollection_add_replacements(struct dwrite_fontcollection *collec
 }
 
 HRESULT create_font_collection(IDWriteFactory5 *factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system,
-    IDWriteFontCollection1 **ret)
+    IDWriteFontCollection3 **ret)
 {
     struct fontfile_enum {
         struct list entry;
@@ -3789,7 +3844,7 @@ HRESULT create_font_collection(IDWriteFactory5 *factory, IDWriteFontFileEnumerat
         return hr;
     }
 
-    *ret = &collection->IDWriteFontCollection1_iface;
+    *ret = &collection->IDWriteFontCollection3_iface;
 
     TRACE("building font collection:\n");
 
@@ -4130,7 +4185,7 @@ HRESULT get_system_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollectio
         return hr;
 
     TRACE("building system font collection for factory %p\n", factory);
-    hr = create_font_collection(factory, enumerator, TRUE, collection);
+    hr = create_font_collection(factory, enumerator, TRUE, (IDWriteFontCollection3 **)collection);
     IDWriteFontFileEnumerator_Release(enumerator);
     return hr;
 }
@@ -4223,7 +4278,7 @@ static HRESULT eudc_collection_add_family(IDWriteFactory5 *factory, struct dwrit
     return hr;
 }
 
-HRESULT get_eudc_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection1 **ret)
+HRESULT get_eudc_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection3 **ret)
 {
     static const WCHAR eudckeyfmtW[] = {'E','U','D','C','\\','%','u',0};
     struct dwrite_fontcollection *collection;
@@ -4249,7 +4304,7 @@ HRESULT get_eudc_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection1
         return hr;
     }
 
-    *ret = &collection->IDWriteFontCollection1_iface;
+    *ret = &collection->IDWriteFontCollection3_iface;
     collection->factory = factory;
     IDWriteFactory5_AddRef(factory);
 
@@ -4278,7 +4333,7 @@ HRESULT get_eudc_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection1
 
     /* try to add global default if not defined for specific codepage */
     exists = FALSE;
-    hr = IDWriteFontCollection1_FindFamilyName(&collection->IDWriteFontCollection1_iface, emptyW,
+    hr = IDWriteFontCollection3_FindFamilyName(&collection->IDWriteFontCollection3_iface, emptyW,
         &index, &exists);
     if (FAILED(hr) || !exists) {
         static const WCHAR globaldefaultW[] = {'E','U','D','C','.','T','T','E',0};
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index fc72013feb..ccf4cb51b9 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -753,7 +753,7 @@ static HRESULT WINAPI dwritefactory_CreateCustomFontCollection(IDWriteFactory5 *
     if (FAILED(hr))
         return hr;
 
-    hr = create_font_collection(iface, enumerator, FALSE, (IDWriteFontCollection1**)collection);
+    hr = create_font_collection(iface, enumerator, FALSE, (IDWriteFontCollection3 **)collection);
     IDWriteFontFileEnumerator_Release(enumerator);
     return hr;
 }
@@ -1292,7 +1292,7 @@ static HRESULT WINAPI dwritefactory1_GetEudcFontCollection(IDWriteFactory5 *ifac
     if (This->eudc_collection)
         IDWriteFontCollection1_AddRef(This->eudc_collection);
     else {
-        IDWriteFontCollection1 *eudc_collection;
+        IDWriteFontCollection3 *eudc_collection;
 
         if (FAILED(hr = get_eudc_fontcollection(iface, &eudc_collection))) {
             *collection = NULL;
@@ -1301,7 +1301,7 @@ static HRESULT WINAPI dwritefactory1_GetEudcFontCollection(IDWriteFactory5 *ifac
         }
 
         if (InterlockedCompareExchangePointer((void **)&This->eudc_collection, eudc_collection, NULL))
-            IDWriteFontCollection1_Release(eudc_collection);
+            IDWriteFontCollection3_Release(eudc_collection);
     }
 
     *collection = (IDWriteFontCollection *)This->eudc_collection;
@@ -1827,7 +1827,7 @@ static void init_dwritefactory(struct dwritefactory *factory, DWRITE_FACTORY_TYP
     factory->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": dwritefactory.lock");
 }
 
-void factory_detach_fontcollection(IDWriteFactory5 *iface, IDWriteFontCollection1 *collection)
+void factory_detach_fontcollection(IDWriteFactory5 *iface, IDWriteFontCollection3 *collection)
 {
     struct dwritefactory *factory = impl_from_IDWriteFactory5(iface);
     InterlockedCompareExchangePointer((void **)&factory->system_collection, NULL, collection);
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 7d434222a3..2fdf93106b 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -2365,6 +2365,7 @@ static void test_system_fontcollection(void)
     IDWriteFontCollection *collection, *coll2;
     IDWriteLocalFontFileLoader *localloader;
     IDWriteFontCollection1 *collection1;
+    IDWriteFontCollection3 *collection3;
     IDWriteFactory *factory, *factory2;
     IDWriteFontFileLoader *loader;
     IDWriteFontFamily *family;
@@ -2540,6 +2541,20 @@ static void test_system_fontcollection(void)
     else
         win_skip("IDWriteFontCollection1 is not supported.\n");
 
+    hr = IDWriteFontCollection_QueryInterface(collection, &IID_IDWriteFontCollection3, (void **)&collection3);
+    if (SUCCEEDED(hr))
+    {
+        HANDLE event;
+
+        event = IDWriteFontCollection3_GetExpirationEvent(collection3);
+todo_wine
+        ok(!!event, "Expected event handle.\n");
+
+        IDWriteFontCollection3_Release(collection3);
+    }
+    else
+        win_skip("IDWriteFontCollection3 is not supported.\n");
+
     ref = IDWriteFontCollection_Release(collection);
     ok(ref == 0, "collection not released, %u\n", ref);
     ref = IDWriteFactory_Release(factory);
diff --git a/include/dwrite_3.idl b/include/dwrite_3.idl
index b148bd725b..f7cb97dff6 100644
--- a/include/dwrite_3.idl
+++ b/include/dwrite_3.idl
@@ -377,7 +377,7 @@ interface IDWriteFontCollection2 : IDWriteFontCollection1
 ]
 interface IDWriteFontCollection3 : IDWriteFontCollection2
 {
-    HANDLE GetExiprationEvent();
+    HANDLE GetExpirationEvent();
 }
 
 [
-- 
2.23.0




More information about the wine-devel mailing list