[PATCH 1/5] dwrite: Update to IDWriteFontFamily1

Nikolay Sivov nsivov at codeweavers.com
Tue Mar 8 13:46:51 CST 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/font.c       | 115 ++++++++++++++++++++++++++++++-----------------
 dlls/dwrite/tests/font.c |  37 ++++++++++++++-
 2 files changed, 109 insertions(+), 43 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 6ce439d..76321bb 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -100,7 +100,7 @@ struct dwrite_fontlist {
     IDWriteFontList IDWriteFontList_iface;
     LONG ref;
 
-    IDWriteFontFamily *family;
+    IDWriteFontFamily1 *family;
     struct dwrite_font_data **fonts;
     UINT32 font_count;
 };
@@ -129,7 +129,7 @@ struct dwrite_fontcollection {
 };
 
 struct dwrite_fontfamily {
-    IDWriteFontFamily IDWriteFontFamily_iface;
+    IDWriteFontFamily1 IDWriteFontFamily1_iface;
     LONG ref;
 
     struct dwrite_fontfamily_data *data;
@@ -141,7 +141,7 @@ struct dwrite_font {
     IDWriteFont3 IDWriteFont3_iface;
     LONG ref;
 
-    IDWriteFontFamily *family;
+    IDWriteFontFamily1 *family;
 
     DWRITE_FONT_STYLE style;
     struct dwrite_font_data *data;
@@ -258,9 +258,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_IDWriteFontFamily(IDWriteFontFamily *iface)
+static inline struct dwrite_fontfamily *impl_from_IDWriteFontFamily1(IDWriteFontFamily1 *iface)
 {
-    return CONTAINING_RECORD(iface, struct dwrite_fontfamily, IDWriteFontFamily_iface);
+    return CONTAINING_RECORD(iface, struct dwrite_fontfamily, IDWriteFontFamily1_iface);
 }
 
 static inline struct dwrite_fontcollection *impl_from_IDWriteFontCollection(IDWriteFontCollection *iface)
@@ -1259,7 +1259,7 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont3 *iface)
     TRACE("(%p)->(%d)\n", This, ref);
 
     if (!ref) {
-        IDWriteFontFamily_Release(This->family);
+        IDWriteFontFamily1_Release(This->family);
         release_font_data(This->data);
         heap_free(This);
     }
@@ -1272,7 +1272,7 @@ static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont3 *iface, IDWriteFontF
     struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)->(%p)\n", This, family);
 
-    *family = This->family;
+    *family = (IDWriteFontFamily*)This->family;
     IDWriteFontFamily_AddRef(*family);
     return S_OK;
 }
@@ -1541,7 +1541,7 @@ static const IDWriteFont3Vtbl dwritefontvtbl = {
     dwritefont3_GetLocality
 };
 
-static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *family, IDWriteFont **font)
+static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily1 *family, IDWriteFont **font)
 {
     struct dwrite_font *This;
     *font = NULL;
@@ -1552,7 +1552,7 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *fam
     This->IDWriteFont3_iface.lpVtbl = &dwritefontvtbl;
     This->ref = 1;
     This->family = family;
-    IDWriteFontFamily_AddRef(family);
+    IDWriteFontFamily1_AddRef(family);
     This->style = data->style;
     This->data = data;
     InterlockedIncrement(&This->data->ref);
@@ -1601,7 +1601,7 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface)
 
         for (i = 0; i < This->font_count; i++)
             release_font_data(This->fonts[i]);
-        IDWriteFontFamily_Release(This->family);
+        IDWriteFontFamily1_Release(This->family);
         heap_free(This);
     }
 
@@ -1611,7 +1611,7 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface)
 static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList *iface, IDWriteFontCollection **collection)
 {
     struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface);
-    return IDWriteFontFamily_GetFontCollection(This->family, collection);
+    return IDWriteFontFamily1_GetFontCollection(This->family, collection);
 }
 
 static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList *iface)
@@ -1647,17 +1647,19 @@ static const IDWriteFontListVtbl dwritefontlistvtbl = {
     dwritefontlist_GetFont
 };
 
-static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily *iface, REFIID riid, void **obj)
+static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily1 *iface, REFIID riid, void **obj)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
+
     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
 
-    if (IsEqualIID(riid, &IID_IUnknown) ||
+    if (IsEqualIID(riid, &IID_IDWriteFontFamily1) ||
+        IsEqualIID(riid, &IID_IDWriteFontFamily) ||
         IsEqualIID(riid, &IID_IDWriteFontList) ||
-        IsEqualIID(riid, &IID_IDWriteFontFamily))
+        IsEqualIID(riid, &IID_IUnknown))
     {
         *obj = iface;
-        IDWriteFontFamily_AddRef(iface);
+        IDWriteFontFamily1_AddRef(iface);
         return S_OK;
     }
 
@@ -1665,17 +1667,17 @@ static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily *iface,
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI dwritefontfamily_AddRef(IDWriteFontFamily *iface)
+static ULONG WINAPI dwritefontfamily_AddRef(IDWriteFontFamily1 *iface)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     ULONG ref = InterlockedIncrement(&This->ref);
     TRACE("(%p)->(%d)\n", This, ref);
     return ref;
 }
 
-static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily *iface)
+static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily1 *iface)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->(%d)\n", This, ref);
@@ -1690,9 +1692,9 @@ static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily *iface)
     return ref;
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFontCollection(IDWriteFontFamily *iface, IDWriteFontCollection **collection)
+static HRESULT WINAPI dwritefontfamily_GetFontCollection(IDWriteFontFamily1 *iface, IDWriteFontCollection **collection)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     TRACE("(%p)->(%p)\n", This, collection);
 
     *collection = This->collection;
@@ -1700,16 +1702,16 @@ static HRESULT WINAPI dwritefontfamily_GetFontCollection(IDWriteFontFamily *ifac
     return S_OK;
 }
 
-static UINT32 WINAPI dwritefontfamily_GetFontCount(IDWriteFontFamily *iface)
+static UINT32 WINAPI dwritefontfamily_GetFontCount(IDWriteFontFamily1 *iface)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     TRACE("(%p)\n", This);
     return This->data->font_count;
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily *iface, UINT32 index, IDWriteFont **font)
+static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily1 *iface, UINT32 index, IDWriteFont **font)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
 
     TRACE("(%p)->(%u %p)\n", This, index, font);
 
@@ -1724,9 +1726,9 @@ static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily *iface, UINT32
     return create_font(This->data->fonts[index], iface, font);
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily *iface, IDWriteLocalizedStrings **names)
+static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily1 *iface, IDWriteLocalizedStrings **names)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     return clone_localizedstring(This->data->familyname, names);
 }
 
@@ -1771,10 +1773,10 @@ static BOOL is_better_font_match(const struct dwrite_font_propvec *next, const s
     return FALSE;
 }
 
-static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily *iface, DWRITE_FONT_WEIGHT weight,
+static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily1 *iface, DWRITE_FONT_WEIGHT weight,
     DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFont **font)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     struct dwrite_font_propvec req;
     struct dwrite_font_data *match;
     UINT32 i;
@@ -1831,10 +1833,10 @@ static void matchingfonts_sort(struct dwrite_fontlist *fonts, const struct dwrit
     };
 }
 
-static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily *iface, DWRITE_FONT_WEIGHT weight,
+static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily1 *iface, DWRITE_FONT_WEIGHT weight,
     DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFontList **ret)
 {
-    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
     matching_filter_func func = NULL;
     struct dwrite_font_propvec req;
     struct dwrite_fontlist *fonts;
@@ -1858,7 +1860,7 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily *iface
     fonts->IDWriteFontList_iface.lpVtbl = &dwritefontlistvtbl;
     fonts->ref = 1;
     fonts->family = iface;
-    IDWriteFontFamily_AddRef(fonts->family);
+    IDWriteFontFamily1_AddRef(fonts->family);
     fonts->font_count = 0;
 
     /* Normal style accepts Normal or Italic, Oblique and Italic - both Oblique and Italic styles */
@@ -1887,7 +1889,35 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily *iface
     return S_OK;
 }
 
-static const IDWriteFontFamilyVtbl fontfamilyvtbl = {
+static DWRITE_LOCALITY WINAPI dwritefontfamily1_GetFontLocality(IDWriteFontFamily1 *iface, UINT32 index)
+{
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
+
+    FIXME("(%p)->(%u): stub\n", This, index);
+
+    return DWRITE_LOCALITY_LOCAL;
+}
+
+static HRESULT WINAPI dwritefontfamily1_GetFont(IDWriteFontFamily1 *iface, UINT32 index, IDWriteFont3 **font)
+{
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
+
+    FIXME("(%p)->(%u %p): stub\n", This, index, font);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontfamily1_GetFontFaceReference(IDWriteFontFamily1 *iface, UINT32 index,
+    IDWriteFontFaceReference **ref)
+{
+    struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
+
+    FIXME("(%p)->(%u %p): stub\n", This, index, ref);
+
+    return E_NOTIMPL;
+}
+
+static const IDWriteFontFamily1Vtbl fontfamilyvtbl = {
     dwritefontfamily_QueryInterface,
     dwritefontfamily_AddRef,
     dwritefontfamily_Release,
@@ -1896,10 +1926,13 @@ static const IDWriteFontFamilyVtbl fontfamilyvtbl = {
     dwritefontfamily_GetFont,
     dwritefontfamily_GetFamilyNames,
     dwritefontfamily_GetFirstMatchingFont,
-    dwritefontfamily_GetMatchingFonts
+    dwritefontfamily_GetMatchingFonts,
+    dwritefontfamily1_GetFontLocality,
+    dwritefontfamily1_GetFont,
+    dwritefontfamily1_GetFontFaceReference
 };
 
-static HRESULT create_fontfamily(struct dwrite_fontfamily_data *data, IDWriteFontCollection *collection, IDWriteFontFamily **family)
+static HRESULT create_fontfamily(struct dwrite_fontfamily_data *data, IDWriteFontCollection *collection, IDWriteFontFamily1 **family)
 {
     struct dwrite_fontfamily *This;
 
@@ -1908,14 +1941,14 @@ static HRESULT create_fontfamily(struct dwrite_fontfamily_data *data, IDWriteFon
     This = heap_alloc(sizeof(struct dwrite_fontfamily));
     if (!This) return E_OUTOFMEMORY;
 
-    This->IDWriteFontFamily_iface.lpVtbl = &fontfamilyvtbl;
+    This->IDWriteFontFamily1_iface.lpVtbl = &fontfamilyvtbl;
     This->ref = 1;
     This->collection = collection;
     IDWriteFontCollection_AddRef(collection);
     This->data = data;
     InterlockedIncrement(&This->data->ref);
 
-    *family = &This->IDWriteFontFamily_iface;
+    *family = &This->IDWriteFontFamily1_iface;
 
     return S_OK;
 }
@@ -1990,7 +2023,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection *
         return E_FAIL;
     }
 
-    return create_fontfamily(This->family_data[index], iface, family);
+    return create_fontfamily(This->family_data[index], iface, (IDWriteFontFamily1**)family);
 }
 
 static UINT32 collection_find_family(struct dwrite_fontcollection *collection, const WCHAR *name)
@@ -2050,7 +2083,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
     struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection(iface);
     struct dwrite_fontfamily_data *found_family = NULL;
     struct dwrite_font_data *found_font = NULL;
-    IDWriteFontFamily *family;
+    IDWriteFontFamily1 *family;
     UINT32 i, j, face_index;
     IDWriteFontFile *file;
     HRESULT hr;
@@ -2089,7 +2122,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
         return hr;
 
     hr = create_font(found_font, family, font);
-    IDWriteFontFamily_Release(family);
+    IDWriteFontFamily1_Release(family);
     return hr;
 }
 
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 0e3f6ee..a2c1ce0 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -1055,6 +1055,7 @@ static void test_GetFontFamily(void)
     IDWriteFontCollection *collection, *collection2;
     IDWriteFontCollection *syscoll;
     IDWriteFontFamily *family, *family2;
+    IDWriteFontFamily1 *family1;
     IDWriteGdiInterop *interop;
     IDWriteFont *font, *font2;
     IDWriteFactory *factory;
@@ -1117,13 +1118,45 @@ if (0) /* crashes on native */
     ok(collection == collection2, "got %p, %p\n", collection, collection2);
     ok(collection == syscoll, "got %p, %p\n", collection, syscoll);
 
+    IDWriteFont_Release(font);
+    IDWriteFont_Release(font2);
+
+    hr = IDWriteFontFamily_QueryInterface(family, &IID_IDWriteFontFamily1, (void**)&family1);
+    if (hr == S_OK) {
+        IDWriteFont3 *font3;
+        IDWriteFont1 *font1;
+
+        font3 = (void*)0xdeadbeef;
+        hr = IDWriteFontFamily1_GetFont(family1, ~0u, &font3);
+    todo_wine {
+        ok(hr == E_FAIL, "got 0x%08x\n", hr);
+        ok(font3 == NULL, "got %p\n", font3);
+    }
+        hr = IDWriteFontFamily1_GetFont(family1, 0, &font3);
+    todo_wine
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    if (hr == S_OK) {
+        hr = IDWriteFont3_QueryInterface(font3, &IID_IDWriteFont, (void**)&font);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        IDWriteFont_Release(font);
+
+        hr = IDWriteFont3_QueryInterface(font3, &IID_IDWriteFont1, (void**)&font1);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        IDWriteFont1_Release(font1);
+
+        IDWriteFont3_Release(font3);
+    }
+        IDWriteFontFamily1_Release(family1);
+    }
+    else
+        win_skip("IDWriteFontFamily1 is not supported.\n");
+
     IDWriteFontCollection_Release(syscoll);
     IDWriteFontCollection_Release(collection2);
     IDWriteFontCollection_Release(collection);
     IDWriteFontFamily_Release(family2);
     IDWriteFontFamily_Release(family);
-    IDWriteFont_Release(font);
-    IDWriteFont_Release(font2);
     IDWriteGdiInterop_Release(interop);
     IDWriteFactory_Release(factory);
 }
-- 
2.7.0




More information about the wine-patches mailing list