From 05e42a55ec6093e424da08d34df7f992a1b46e1f Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 8 Mar 2016 22:46:51 +0300 Subject: [PATCH] dwrite: Update to IDWriteFontFamily1. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- 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 6ce439d4825..76321bb0189 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 0e3f6eeb1ce..a2c1ce025bd 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); }