[PATCH 5/5] dwrite: Update to IDWriteFontList1

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


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/font.c       | 76 ++++++++++++++++++++++++++++++++--------------
 dlls/dwrite/tests/font.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 131 insertions(+), 24 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 0c04d56..32bd9bb 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -97,7 +97,7 @@ struct dwrite_font_data {
 };
 
 struct dwrite_fontlist {
-    IDWriteFontList IDWriteFontList_iface;
+    IDWriteFontList1 IDWriteFontList1_iface;
     LONG ref;
 
     IDWriteFontFamily1 *family;
@@ -277,9 +277,9 @@ static inline struct dwrite_colorglyphenum *impl_from_IDWriteColorGlyphRunEnumer
     return CONTAINING_RECORD(iface, struct dwrite_colorglyphenum, IDWriteColorGlyphRunEnumerator_iface);
 }
 
-static inline struct dwrite_fontlist *impl_from_IDWriteFontList(IDWriteFontList *iface)
+static inline struct dwrite_fontlist *impl_from_IDWriteFontList1(IDWriteFontList1 *iface)
 {
-    return CONTAINING_RECORD(iface, struct dwrite_fontlist, IDWriteFontList_iface);
+    return CONTAINING_RECORD(iface, struct dwrite_fontlist, IDWriteFontList1_iface);
 }
 
 static inline const char *debugstr_tag(UINT32 tag)
@@ -1561,18 +1561,19 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily1 *fa
     return S_OK;
 }
 
-/* IDWriteFontList */
-static HRESULT WINAPI dwritefontlist_QueryInterface(IDWriteFontList *iface, REFIID riid, void **obj)
+/* IDWriteFontList1 */
+static HRESULT WINAPI dwritefontlist_QueryInterface(IDWriteFontList1 *iface, REFIID riid, void **obj)
 {
-    struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface);
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
 
-    if (IsEqualIID(riid, &IID_IDWriteFontList) ||
+    if (IsEqualIID(riid, &IID_IDWriteFontList1) ||
+        IsEqualIID(riid, &IID_IDWriteFontList) ||
         IsEqualIID(riid, &IID_IUnknown))
     {
         *obj = iface;
-        IDWriteFontList_AddRef(iface);
+        IDWriteFontList1_AddRef(iface);
         return S_OK;
     }
 
@@ -1580,17 +1581,17 @@ static HRESULT WINAPI dwritefontlist_QueryInterface(IDWriteFontList *iface, REFI
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI dwritefontlist_AddRef(IDWriteFontList *iface)
+static ULONG WINAPI dwritefontlist_AddRef(IDWriteFontList1 *iface)
 {
-    struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface);
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
     ULONG ref = InterlockedIncrement(&This->ref);
     TRACE("(%p)->(%d)\n", This, ref);
     return ref;
 }
 
-static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface)
+static ULONG WINAPI dwritefontlist_Release(IDWriteFontList1 *iface)
 {
-    struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface);
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->(%d)\n", This, ref);
@@ -1607,22 +1608,22 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface)
     return ref;
 }
 
-static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList *iface, IDWriteFontCollection **collection)
+static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList1 *iface, IDWriteFontCollection **collection)
 {
-    struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface);
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
     return IDWriteFontFamily1_GetFontCollection(This->family, collection);
 }
 
-static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList *iface)
+static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList1 *iface)
 {
-    struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface);
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
     TRACE("(%p)\n", This);
     return This->font_count;
 }
 
-static HRESULT WINAPI dwritefontlist_GetFont(IDWriteFontList *iface, UINT32 index, IDWriteFont **font)
+static HRESULT WINAPI dwritefontlist_GetFont(IDWriteFontList1 *iface, UINT32 index, IDWriteFont **font)
 {
-    struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface);
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
 
     TRACE("(%p)->(%u %p)\n", This, index, font);
 
@@ -1637,13 +1638,44 @@ static HRESULT WINAPI dwritefontlist_GetFont(IDWriteFontList *iface, UINT32 inde
     return create_font(This->fonts[index], This->family, (IDWriteFont3**)font);
 }
 
-static const IDWriteFontListVtbl dwritefontlistvtbl = {
+static DWRITE_LOCALITY WINAPI dwritefontlist1_GetFontLocality(IDWriteFontList1 *iface, UINT32 index)
+{
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
+
+    FIXME("(%p)->(%u): stub\n", This, index);
+
+    return DWRITE_LOCALITY_LOCAL;
+}
+
+static HRESULT WINAPI dwritefontlist1_GetFont(IDWriteFontList1 *iface, UINT32 index, IDWriteFont3 **font)
+{
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
+
+    FIXME("(%p)->(%u %p): stub\n", This, index, font);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontlist1_GetFontFaceReference(IDWriteFontList1 *iface, UINT32 index,
+    IDWriteFontFaceReference **reference)
+{
+    struct dwrite_fontlist *This = impl_from_IDWriteFontList1(iface);
+
+    FIXME("(%p)->(%u %p): stub\n", This, index, reference);
+
+    return E_NOTIMPL;
+}
+
+static const IDWriteFontList1Vtbl dwritefontlistvtbl = {
     dwritefontlist_QueryInterface,
     dwritefontlist_AddRef,
     dwritefontlist_Release,
     dwritefontlist_GetFontCollection,
     dwritefontlist_GetFontCount,
-    dwritefontlist_GetFont
+    dwritefontlist_GetFont,
+    dwritefontlist1_GetFontLocality,
+    dwritefontlist1_GetFont,
+    dwritefontlist1_GetFontFaceReference
 };
 
 static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily1 *iface, REFIID riid, void **obj)
@@ -1856,7 +1888,7 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily1 *ifac
         return E_OUTOFMEMORY;
     }
 
-    fonts->IDWriteFontList_iface.lpVtbl = &dwritefontlistvtbl;
+    fonts->IDWriteFontList1_iface.lpVtbl = &dwritefontlistvtbl;
     fonts->ref = 1;
     fonts->family = iface;
     IDWriteFontFamily1_AddRef(fonts->family);
@@ -1884,7 +1916,7 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily1 *ifac
     init_font_prop_vec(weight, stretch, style, &req);
     matchingfonts_sort(fonts, &req);
 
-    *ret = &fonts->IDWriteFontList_iface;
+    *ret = (IDWriteFontList*)&fonts->IDWriteFontList1_iface;
     return S_OK;
 }
 
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 82eb885..7c19f00 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -1123,6 +1123,7 @@ if (0) /* crashes on native */
 
     hr = IDWriteFontFamily_QueryInterface(family, &IID_IDWriteFontFamily1, (void**)&family1);
     if (hr == S_OK) {
+        IDWriteFontList *fontlist;
         IDWriteFont3 *font3;
         IDWriteFont1 *font1;
 
@@ -1142,6 +1143,13 @@ if (0) /* crashes on native */
         ok(hr == S_OK, "got 0x%08x\n", hr);
         IDWriteFont1_Release(font1);
 
+        hr = IDWriteFontFamily1_QueryInterface(family1, &IID_IDWriteFontList1, (void**)&fontlist);
+        ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
+        hr = IDWriteFontFamily1_QueryInterface(family1, &IID_IDWriteFontList, (void**)&fontlist);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        IDWriteFontList_Release(fontlist);
+
         IDWriteFont3_Release(font3);
         IDWriteFontFamily1_Release(family1);
     }
@@ -2473,22 +2481,88 @@ static void test_GetFontFromFontFace(void)
 static void test_GetFirstMatchingFont(void)
 {
     DWRITE_FONT_SIMULATIONS simulations;
+    IDWriteFontCollection *collection;
+    IDWriteFontFamily *family;
     IDWriteFont *font, *font2;
     IDWriteFactory *factory;
+    HRESULT hr;
 
     factory = create_factory();
 
-    font = get_tahoma_instance(factory, DWRITE_FONT_STYLE_NORMAL);
-    font2 = get_tahoma_instance(factory, DWRITE_FONT_STYLE_NORMAL);
+    hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFontCollection_GetFontFamily(collection, 0, &family);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFontFamily_GetFirstMatchingFont(family, DWRITE_FONT_WEIGHT_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, &font);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFontFamily_GetFirstMatchingFont(family, DWRITE_FONT_WEIGHT_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, &font2);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(font != font2, "got %p, %p\n", font, font2);
     IDWriteFont_Release(font);
     IDWriteFont_Release(font2);
 
+    IDWriteFontFamily_Release(family);
+
     font = get_tahoma_instance(factory, DWRITE_FONT_STYLE_ITALIC);
     simulations = IDWriteFont_GetSimulations(font);
     ok(simulations == DWRITE_FONT_SIMULATIONS_OBLIQUE, "%d\n", simulations);
     IDWriteFont_Release(font);
 
+    IDWriteFontCollection_Release(collection);
+    IDWriteFactory_Release(factory);
+}
+
+static void test_GetMatchingFonts(void)
+{
+    IDWriteFontCollection *collection;
+    IDWriteFontFamily *family;
+    IDWriteFactory *factory;
+    IDWriteFontList *fontlist, *fontlist2;
+    IDWriteFontList1 *fontlist1;
+    HRESULT hr;
+
+    factory = create_factory();
+
+    hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFontCollection_GetFontFamily(collection, 0, &family);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFontFamily_GetMatchingFonts(family, DWRITE_FONT_WEIGHT_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, &fontlist);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFontFamily_GetMatchingFonts(family, DWRITE_FONT_WEIGHT_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, &fontlist2);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(fontlist != fontlist2, "got %p, %p\n", fontlist, fontlist2);
+    IDWriteFontList_Release(fontlist2);
+
+    hr = IDWriteFontList_QueryInterface(fontlist, &IID_IDWriteFontList1, (void**)&fontlist1);
+    if (hr == S_OK) {
+        IDWriteFont3 *font;
+
+        font = (void*)0xdeadbeef;
+        hr = IDWriteFontList1_GetFont(fontlist1, ~0u, &font);
+    todo_wine {
+        ok(hr == E_FAIL, "got 0x%08x\n", hr);
+        ok(font == NULL, "got %p\n", font);
+    }
+        IDWriteFontList1_Release(fontlist1);
+    }
+    else
+        win_skip("IDWriteFontList1 is not supported.\n");
+
+    IDWriteFontList_Release(fontlist);
+    IDWriteFontFamily_Release(family);
+
+    IDWriteFontCollection_Release(collection);
     IDWriteFactory_Release(factory);
 }
 
@@ -5378,6 +5452,7 @@ START_TEST(font)
     test_GetUnicodeRanges();
     test_GetFontFromFontFace();
     test_GetFirstMatchingFont();
+    test_GetMatchingFonts();
     test_GetInformationalStrings();
     test_GetGdiInterop();
     test_CreateFontFaceFromHdc();
-- 
2.7.0




More information about the wine-patches mailing list