[PATCH 4/4] dwrite: Update to IDWriteFontFamily2.

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


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/font.c | 206 +++++++++++++++++++++++++--------------------
 1 file changed, 117 insertions(+), 89 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index ce376e339f..be9ff88fe4 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -125,10 +125,11 @@ struct dwrite_fontcollection
     size_t count;
 };
 
-struct dwrite_fontfamily {
-    IDWriteFontFamily1 IDWriteFontFamily1_iface;
+struct dwrite_fontfamily
+{
+    IDWriteFontFamily2 IDWriteFontFamily2_iface;
     IDWriteFontList1 IDWriteFontList1_iface;
-    LONG ref;
+    LONG refcount;
 
     struct dwrite_fontfamily_data *data;
     struct dwrite_fontcollection *collection;
@@ -286,9 +287,9 @@ static inline struct dwrite_fontfile *impl_from_IDWriteFontFile(IDWriteFontFile
     return CONTAINING_RECORD(iface, struct dwrite_fontfile, IDWriteFontFile_iface);
 }
 
-static inline struct dwrite_fontfamily *impl_from_IDWriteFontFamily1(IDWriteFontFamily1 *iface)
+static inline struct dwrite_fontfamily *impl_from_IDWriteFontFamily2(IDWriteFontFamily2 *iface)
 {
-    return CONTAINING_RECORD(iface, struct dwrite_fontfamily, IDWriteFontFamily1_iface);
+    return CONTAINING_RECORD(iface, struct dwrite_fontfamily, IDWriteFontFamily2_iface);
 }
 
 static inline struct dwrite_fontfamily *impl_family_from_IDWriteFontList1(IDWriteFontList1 *iface)
@@ -1473,7 +1474,7 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont3 *iface)
     TRACE("(%p)->(%d)\n", This, ref);
 
     if (!ref) {
-        IDWriteFontFamily1_Release(&This->family->IDWriteFontFamily1_iface);
+        IDWriteFontFamily2_Release(&This->family->IDWriteFontFamily2_iface);
         release_font_data(This->data);
         heap_free(This);
     }
@@ -1830,7 +1831,7 @@ static HRESULT create_font(struct dwrite_fontfamily *family, UINT32 index, IDWri
     This->IDWriteFont3_iface.lpVtbl = &dwritefontvtbl;
     This->ref = 1;
     This->family = family;
-    IDWriteFontFamily1_AddRef(&family->IDWriteFontFamily1_iface);
+    IDWriteFontFamily2_AddRef(&family->IDWriteFontFamily2_iface);
     This->data = family->data->fonts[index];
     This->style = This->data->style;
     addref_font_data(This->data);
@@ -1882,7 +1883,7 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList1 *iface)
 
         for (i = 0; i < This->font_count; i++)
             release_font_data(This->fonts[i]);
-        IDWriteFontFamily1_Release(&This->family->IDWriteFontFamily1_iface);
+        IDWriteFontFamily2_Release(&This->family->IDWriteFontFamily2_iface);
         heap_free(This->fonts);
         heap_free(This);
     }
@@ -1893,7 +1894,7 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList1 *iface)
 static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList1 *iface, IDWriteFontCollection **collection)
 {
     struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
-    return IDWriteFontFamily1_GetFontCollection(&This->family->IDWriteFontFamily1_iface, collection);
+    return IDWriteFontFamily2_GetFontCollection(&This->family->IDWriteFontFamily2_iface, collection);
 }
 
 static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList1 *iface)
@@ -1979,26 +1980,27 @@ static const IDWriteFontList1Vtbl dwritefontlistvtbl = {
     dwritefontlist1_GetFontFaceReference
 };
 
-static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily1 *iface, REFIID riid, void **obj)
+static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily2 *iface, REFIID riid, void **obj)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(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_IDWriteFontFamily1) ||
+    if (IsEqualIID(riid, &IID_IDWriteFontFamily2) ||
+        IsEqualIID(riid, &IID_IDWriteFontFamily1) ||
         IsEqualIID(riid, &IID_IDWriteFontFamily) ||
         IsEqualIID(riid, &IID_IUnknown))
     {
         *obj = iface;
-        IDWriteFontFamily1_AddRef(iface);
+        IDWriteFontFamily2_AddRef(iface);
         return S_OK;
     }
 
     if (IsEqualIID(riid, &IID_IDWriteFontList1) ||
         IsEqualIID(riid, &IID_IDWriteFontList))
     {
-        *obj = &This->IDWriteFontList1_iface;
-        IDWriteFontList1_AddRef(&This->IDWriteFontList1_iface);
+        *obj = &family->IDWriteFontList1_iface;
+        IDWriteFontList1_AddRef(&family->IDWriteFontList1_iface);
         return S_OK;
     }
 
@@ -2008,54 +2010,56 @@ static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily1 *iface,
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI dwritefontfamily_AddRef(IDWriteFontFamily1 *iface)
+static ULONG WINAPI dwritefontfamily_AddRef(IDWriteFontFamily2 *iface)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
-    ULONG ref = InterlockedIncrement(&This->ref);
-    TRACE("(%p)->(%d)\n", This, ref);
-    return ref;
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
+    ULONG refcount = InterlockedIncrement(&family->refcount);
+
+    TRACE("%p, %u.\n", iface, refcount);
+
+    return refcount;
 }
 
-static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily1 *iface)
+static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily2 *iface)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
-    ULONG ref = InterlockedDecrement(&This->ref);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
+    ULONG refcount = InterlockedDecrement(&family->refcount);
 
-    TRACE("(%p)->(%d)\n", This, ref);
+    TRACE("%p, %u.\n", iface, refcount);
 
-    if (!ref)
+    if (!refcount)
     {
-        IDWriteFontCollection3_Release(&This->collection->IDWriteFontCollection3_iface);
-        release_fontfamily_data(This->data);
-        heap_free(This);
+        IDWriteFontCollection3_Release(&family->collection->IDWriteFontCollection3_iface);
+        release_fontfamily_data(family->data);
+        heap_free(family);
     }
 
-    return ref;
+    return refcount;
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFontCollection(IDWriteFontFamily1 *iface, IDWriteFontCollection **collection)
+static HRESULT WINAPI dwritefontfamily_GetFontCollection(IDWriteFontFamily2 *iface, IDWriteFontCollection **collection)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
 
-    TRACE("(%p)->(%p)\n", This, collection);
+    TRACE("%p, %p.\n", iface, collection);
 
-    *collection = (IDWriteFontCollection*)This->collection;
+    *collection = (IDWriteFontCollection *)family->collection;
     IDWriteFontCollection_AddRef(*collection);
     return S_OK;
 }
 
-static UINT32 WINAPI dwritefontfamily_GetFontCount(IDWriteFontFamily1 *iface)
+static UINT32 WINAPI dwritefontfamily_GetFontCount(IDWriteFontFamily2 *iface)
 {
-    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily1(iface);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
 
     TRACE("%p.\n", iface);
 
     return family->data->count;
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily1 *iface, UINT32 index, IDWriteFont **font)
+static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily2 *iface, UINT32 index, IDWriteFont **font)
 {
-    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily1(iface);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
 
     TRACE("%p, %u, %p.\n", iface, index, font);
 
@@ -2070,10 +2074,10 @@ static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily1 *iface, UINT32
     return create_font(family, index, (IDWriteFont3 **)font);
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily1 *iface, IDWriteLocalizedStrings **names)
+static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily2 *iface, IDWriteLocalizedStrings **names)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
-    return clone_localizedstring(This->data->familyname, names);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
+    return clone_localizedstring(family->data->familyname, names);
 }
 
 static BOOL is_better_font_match(const struct dwrite_font_propvec *next, const struct dwrite_font_propvec *cur,
@@ -2117,10 +2121,10 @@ static BOOL is_better_font_match(const struct dwrite_font_propvec *next, const s
     return FALSE;
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily1 *iface, DWRITE_FONT_WEIGHT weight,
-    DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFont **font)
+static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily2 *iface, DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFont **font)
 {
-    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily1(iface);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
     struct dwrite_font_propvec req;
     size_t i, match;
 
@@ -2178,10 +2182,10 @@ static void matchingfonts_sort(struct dwrite_fontlist *fonts, const struct dwrit
     };
 }
 
-static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily1 *iface, DWRITE_FONT_WEIGHT weight,
-    DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFontList **ret)
+static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily2 *iface, DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFontList **ret)
 {
-    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily1(iface);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
     matching_filter_func func = NULL;
     struct dwrite_font_propvec req;
     struct dwrite_fontlist *fonts;
@@ -2205,7 +2209,7 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily1 *ifac
     fonts->IDWriteFontList1_iface.lpVtbl = &dwritefontlistvtbl;
     fonts->ref = 1;
     fonts->family = family;
-    IDWriteFontFamily1_AddRef(&fonts->family->IDWriteFontFamily1_iface);
+    IDWriteFontFamily2_AddRef(&fonts->family->IDWriteFontFamily2_iface);
     fonts->font_count = 0;
 
     /* Normal style accepts Normal or Italic, Oblique and Italic - both Oblique and Italic styles */
@@ -2236,18 +2240,16 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily1 *ifac
     return S_OK;
 }
 
-static DWRITE_LOCALITY WINAPI dwritefontfamily1_GetFontLocality(IDWriteFontFamily1 *iface, UINT32 index)
+static DWRITE_LOCALITY WINAPI dwritefontfamily1_GetFontLocality(IDWriteFontFamily2 *iface, UINT32 index)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
-
-    FIXME("(%p)->(%u): stub\n", This, index);
+    FIXME("%p, %u.\n", iface, index);
 
     return DWRITE_LOCALITY_LOCAL;
 }
 
-static HRESULT WINAPI dwritefontfamily1_GetFont(IDWriteFontFamily1 *iface, UINT32 index, IDWriteFont3 **font)
+static HRESULT WINAPI dwritefontfamily1_GetFont(IDWriteFontFamily2 *iface, UINT32 index, IDWriteFont3 **font)
 {
-    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily1(iface);
+    struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
 
     TRACE("%p, %u, %p.\n", iface, index, font);
 
@@ -2262,18 +2264,17 @@ static HRESULT WINAPI dwritefontfamily1_GetFont(IDWriteFontFamily1 *iface, UINT3
     return create_font(family, index, font);
 }
 
-static HRESULT WINAPI dwritefontfamily1_GetFontFaceReference(IDWriteFontFamily1 *iface, UINT32 index,
-    IDWriteFontFaceReference **reference)
+static HRESULT WINAPI dwritefontfamily1_GetFontFaceReference(IDWriteFontFamily2 *iface, UINT32 index,
+        IDWriteFontFaceReference **reference)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     IDWriteFont3 *font;
     HRESULT hr;
 
-    TRACE("(%p)->(%u %p)\n", This, index, reference);
+    TRACE("%p, %u, %p.\n", iface, index, reference);
 
     *reference = NULL;
 
-    hr = IDWriteFontFamily1_GetFont(iface, index, &font);
+    hr = IDWriteFontFamily2_GetFont(iface, index, &font);
     if (FAILED(hr))
         return hr;
 
@@ -2283,7 +2284,23 @@ static HRESULT WINAPI dwritefontfamily1_GetFontFaceReference(IDWriteFontFamily1
     return hr;
 }
 
-static const IDWriteFontFamily1Vtbl fontfamilyvtbl = {
+static HRESULT WINAPI dwritefontfamily2_GetMatchingFonts(IDWriteFontFamily2 *iface,
+        DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_values, IDWriteFontList2 **fontlist)
+{
+    FIXME("%p, %p, %u, %p.\n", iface, axis_values, num_values, fontlist);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontfamily2_GetFontSet(IDWriteFontFamily2 *iface, IDWriteFontSet1 **fontset)
+{
+    FIXME("%p, %p.\n", iface, fontset);
+
+    return E_NOTIMPL;
+}
+
+static const IDWriteFontFamily2Vtbl fontfamilyvtbl =
+{
     dwritefontfamily_QueryInterface,
     dwritefontfamily_AddRef,
     dwritefontfamily_Release,
@@ -2295,63 +2312,65 @@ static const IDWriteFontFamily1Vtbl fontfamilyvtbl = {
     dwritefontfamily_GetMatchingFonts,
     dwritefontfamily1_GetFontLocality,
     dwritefontfamily1_GetFont,
-    dwritefontfamily1_GetFontFaceReference
+    dwritefontfamily1_GetFontFaceReference,
+    dwritefontfamily2_GetMatchingFonts,
+    dwritefontfamily2_GetFontSet,
 };
 
 static HRESULT WINAPI dwritefontfamilylist_QueryInterface(IDWriteFontList1 *iface, REFIID riid, void **obj)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily_QueryInterface(&This->IDWriteFontFamily1_iface, riid, obj);
+    return dwritefontfamily_QueryInterface(&This->IDWriteFontFamily2_iface, riid, obj);
 }
 
 static ULONG WINAPI dwritefontfamilylist_AddRef(IDWriteFontList1 *iface)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily_AddRef(&This->IDWriteFontFamily1_iface);
+    return dwritefontfamily_AddRef(&This->IDWriteFontFamily2_iface);
 }
 
 static ULONG WINAPI dwritefontfamilylist_Release(IDWriteFontList1 *iface)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily_Release(&This->IDWriteFontFamily1_iface);
+    return dwritefontfamily_Release(&This->IDWriteFontFamily2_iface);
 }
 
 static HRESULT WINAPI dwritefontfamilylist_GetFontCollection(IDWriteFontList1 *iface,
         IDWriteFontCollection **collection)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily_GetFontCollection(&This->IDWriteFontFamily1_iface, collection);
+    return dwritefontfamily_GetFontCollection(&This->IDWriteFontFamily2_iface, collection);
 }
 
 static UINT32 WINAPI dwritefontfamilylist_GetFontCount(IDWriteFontList1 *iface)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily_GetFontCount(&This->IDWriteFontFamily1_iface);
+    return dwritefontfamily_GetFontCount(&This->IDWriteFontFamily2_iface);
 }
 
 static HRESULT WINAPI dwritefontfamilylist_GetFont(IDWriteFontList1 *iface, UINT32 index, IDWriteFont **font)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily_GetFont(&This->IDWriteFontFamily1_iface, index, font);
+    return dwritefontfamily_GetFont(&This->IDWriteFontFamily2_iface, index, font);
 }
 
 static DWRITE_LOCALITY WINAPI dwritefontfamilylist1_GetFontLocality(IDWriteFontList1 *iface, UINT32 index)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily1_GetFontLocality(&This->IDWriteFontFamily1_iface, index);
+    return dwritefontfamily1_GetFontLocality(&This->IDWriteFontFamily2_iface, index);
 }
 
 static HRESULT WINAPI dwritefontfamilylist1_GetFont(IDWriteFontList1 *iface, UINT32 index, IDWriteFont3 **font)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily1_GetFont(&This->IDWriteFontFamily1_iface, index, font);
+    return dwritefontfamily1_GetFont(&This->IDWriteFontFamily2_iface, index, font);
 }
 
 static HRESULT WINAPI dwritefontfamilylist1_GetFontFaceReference(IDWriteFontList1 *iface, UINT32 index,
         IDWriteFontFaceReference **reference)
 {
     struct dwrite_fontfamily *This = impl_family_from_IDWriteFontList1(iface);
-    return dwritefontfamily1_GetFontFaceReference(&This->IDWriteFontFamily1_iface, index, reference);
+    return dwritefontfamily1_GetFontFaceReference(&This->IDWriteFontFamily2_iface, index, reference);
 }
 
 static const IDWriteFontList1Vtbl fontfamilylistvtbl = {
@@ -2366,7 +2385,8 @@ static const IDWriteFontList1Vtbl fontfamilylistvtbl = {
     dwritefontfamilylist1_GetFontFaceReference,
 };
 
-static HRESULT create_fontfamily(struct dwrite_fontcollection *collection, UINT32 index, IDWriteFontFamily1 **family)
+static HRESULT create_fontfamily(struct dwrite_fontcollection *collection, UINT32 index,
+        struct dwrite_fontfamily **family)
 {
     struct dwrite_fontfamily *object;
 
@@ -2376,15 +2396,15 @@ static HRESULT create_fontfamily(struct dwrite_fontcollection *collection, UINT3
     if (!object)
         return E_OUTOFMEMORY;
 
-    object->IDWriteFontFamily1_iface.lpVtbl = &fontfamilyvtbl;
+    object->IDWriteFontFamily2_iface.lpVtbl = &fontfamilyvtbl;
     object->IDWriteFontList1_iface.lpVtbl = &fontfamilylistvtbl;
-    object->ref = 1;
+    object->refcount = 1;
     object->collection = collection;
     IDWriteFontCollection3_AddRef(&collection->IDWriteFontCollection3_iface);
     object->data = collection->family_data[index];
     InterlockedIncrement(&object->data->refcount);
 
-    *family = &object->IDWriteFontFamily1_iface;
+    *family = object;
 
     return S_OK;
 }
@@ -2484,19 +2504,23 @@ static UINT32 WINAPI dwritefontcollection_GetFontFamilyCount(IDWriteFontCollecti
 }
 
 static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection3 *iface, UINT32 index,
-        IDWriteFontFamily **family)
+        IDWriteFontFamily **ret)
 {
     struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
+    struct dwrite_fontfamily *family;
+    HRESULT hr;
+
+    TRACE("%p, %u, %p.\n", iface, index, ret);
 
-    TRACE("%p, %u, %p.\n", iface, index, family);
+    *ret = NULL;
 
     if (index >= collection->count)
-    {
-        *family = NULL;
         return E_FAIL;
-    }
 
-    return create_fontfamily(collection, index, (IDWriteFontFamily1 **)family);
+    if (SUCCEEDED(hr = create_fontfamily(collection, index, &family)))
+        *ret = (IDWriteFontFamily *)&family->IDWriteFontFamily2_iface;
+
+    return hr;
 }
 
 static UINT32 collection_find_family(struct dwrite_fontcollection *collection, const WCHAR *name)
@@ -2559,7 +2583,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
         IDWriteFont **font)
 {
     struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
-    IDWriteFontFamily1 *family;
+    struct dwrite_fontfamily *family;
     BOOL found_font = FALSE;
     IDWriteFontFile *file;
     UINT32 face_index, count;
@@ -2606,8 +2630,8 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
     if (FAILED(hr))
         return hr;
 
-    hr = create_font(impl_from_IDWriteFontFamily1(family), j, (IDWriteFont3 **)font);
-    IDWriteFontFamily1_Release(family);
+    hr = create_font(family, j, (IDWriteFont3 **)font);
+    IDWriteFontFamily2_Release(&family->IDWriteFontFamily2_iface);
     return hr;
 }
 
@@ -2619,19 +2643,23 @@ static HRESULT WINAPI dwritefontcollection1_GetFontSet(IDWriteFontCollection3 *i
 }
 
 static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection3 *iface, UINT32 index,
-        IDWriteFontFamily1 **family)
+        IDWriteFontFamily1 **ret)
 {
     struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
+    struct dwrite_fontfamily *family;
+    HRESULT hr;
 
-    TRACE("%p, %u, %p.\n", iface, index, family);
+    TRACE("%p, %u, %p.\n", iface, index, ret);
+
+    *ret = NULL;
 
     if (index >= collection->count)
-    {
-        *family = NULL;
         return E_FAIL;
-    }
 
-    return create_fontfamily(collection, index, family);
+    if (SUCCEEDED(hr = create_fontfamily(collection, index, &family)))
+        *ret = (IDWriteFontFamily1 *)&family->IDWriteFontFamily2_iface;
+
+    return hr;
 }
 
 static HRESULT WINAPI dwritefontcollection2_GetFontFamily(IDWriteFontCollection3 *iface,
-- 
2.23.0




More information about the wine-devel mailing list