dwrite: Update to IDWriteFontFamily1.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2016-03-08 22:46:51 +03:00 committed by Alexandre Julliard
parent 1da5af9364
commit 05e42a55ec
2 changed files with 109 additions and 43 deletions

View File

@ -100,7 +100,7 @@ struct dwrite_fontlist {
IDWriteFontList IDWriteFontList_iface; IDWriteFontList IDWriteFontList_iface;
LONG ref; LONG ref;
IDWriteFontFamily *family; IDWriteFontFamily1 *family;
struct dwrite_font_data **fonts; struct dwrite_font_data **fonts;
UINT32 font_count; UINT32 font_count;
}; };
@ -129,7 +129,7 @@ struct dwrite_fontcollection {
}; };
struct dwrite_fontfamily { struct dwrite_fontfamily {
IDWriteFontFamily IDWriteFontFamily_iface; IDWriteFontFamily1 IDWriteFontFamily1_iface;
LONG ref; LONG ref;
struct dwrite_fontfamily_data *data; struct dwrite_fontfamily_data *data;
@ -141,7 +141,7 @@ struct dwrite_font {
IDWriteFont3 IDWriteFont3_iface; IDWriteFont3 IDWriteFont3_iface;
LONG ref; LONG ref;
IDWriteFontFamily *family; IDWriteFontFamily1 *family;
DWRITE_FONT_STYLE style; DWRITE_FONT_STYLE style;
struct dwrite_font_data *data; 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); 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) 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); TRACE("(%p)->(%d)\n", This, ref);
if (!ref) { if (!ref) {
IDWriteFontFamily_Release(This->family); IDWriteFontFamily1_Release(This->family);
release_font_data(This->data); release_font_data(This->data);
heap_free(This); heap_free(This);
} }
@ -1272,7 +1272,7 @@ static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont3 *iface, IDWriteFontF
struct dwrite_font *This = impl_from_IDWriteFont3(iface); struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)->(%p)\n", This, family); TRACE("(%p)->(%p)\n", This, family);
*family = This->family; *family = (IDWriteFontFamily*)This->family;
IDWriteFontFamily_AddRef(*family); IDWriteFontFamily_AddRef(*family);
return S_OK; return S_OK;
} }
@ -1541,7 +1541,7 @@ static const IDWriteFont3Vtbl dwritefontvtbl = {
dwritefont3_GetLocality 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; struct dwrite_font *This;
*font = NULL; *font = NULL;
@ -1552,7 +1552,7 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *fam
This->IDWriteFont3_iface.lpVtbl = &dwritefontvtbl; This->IDWriteFont3_iface.lpVtbl = &dwritefontvtbl;
This->ref = 1; This->ref = 1;
This->family = family; This->family = family;
IDWriteFontFamily_AddRef(family); IDWriteFontFamily1_AddRef(family);
This->style = data->style; This->style = data->style;
This->data = data; This->data = data;
InterlockedIncrement(&This->data->ref); InterlockedIncrement(&This->data->ref);
@ -1601,7 +1601,7 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface)
for (i = 0; i < This->font_count; i++) for (i = 0; i < This->font_count; i++)
release_font_data(This->fonts[i]); release_font_data(This->fonts[i]);
IDWriteFontFamily_Release(This->family); IDWriteFontFamily1_Release(This->family);
heap_free(This); heap_free(This);
} }
@ -1611,7 +1611,7 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface)
static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList *iface, IDWriteFontCollection **collection) static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList *iface, IDWriteFontCollection **collection)
{ {
struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); 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) static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList *iface)
@ -1647,17 +1647,19 @@ static const IDWriteFontListVtbl dwritefontlistvtbl = {
dwritefontlist_GetFont 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); 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_IDWriteFontList) ||
IsEqualIID(riid, &IID_IDWriteFontFamily)) IsEqualIID(riid, &IID_IUnknown))
{ {
*obj = iface; *obj = iface;
IDWriteFontFamily_AddRef(iface); IDWriteFontFamily1_AddRef(iface);
return S_OK; return S_OK;
} }
@ -1665,17 +1667,17 @@ static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily *iface,
return E_NOINTERFACE; 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); ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref); TRACE("(%p)->(%d)\n", This, ref);
return 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); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref); TRACE("(%p)->(%d)\n", This, ref);
@ -1690,9 +1692,9 @@ static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily *iface)
return ref; 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); TRACE("(%p)->(%p)\n", This, collection);
*collection = This->collection; *collection = This->collection;
@ -1700,16 +1702,16 @@ static HRESULT WINAPI dwritefontfamily_GetFontCollection(IDWriteFontFamily *ifac
return S_OK; 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); TRACE("(%p)\n", This);
return This->data->font_count; 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); 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); 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); 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; 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) 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_propvec req;
struct dwrite_font_data *match; struct dwrite_font_data *match;
UINT32 i; 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) 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; matching_filter_func func = NULL;
struct dwrite_font_propvec req; struct dwrite_font_propvec req;
struct dwrite_fontlist *fonts; struct dwrite_fontlist *fonts;
@ -1858,7 +1860,7 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily *iface
fonts->IDWriteFontList_iface.lpVtbl = &dwritefontlistvtbl; fonts->IDWriteFontList_iface.lpVtbl = &dwritefontlistvtbl;
fonts->ref = 1; fonts->ref = 1;
fonts->family = iface; fonts->family = iface;
IDWriteFontFamily_AddRef(fonts->family); IDWriteFontFamily1_AddRef(fonts->family);
fonts->font_count = 0; fonts->font_count = 0;
/* Normal style accepts Normal or Italic, Oblique and Italic - both Oblique and Italic styles */ /* 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; 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_QueryInterface,
dwritefontfamily_AddRef, dwritefontfamily_AddRef,
dwritefontfamily_Release, dwritefontfamily_Release,
@ -1896,10 +1926,13 @@ static const IDWriteFontFamilyVtbl fontfamilyvtbl = {
dwritefontfamily_GetFont, dwritefontfamily_GetFont,
dwritefontfamily_GetFamilyNames, dwritefontfamily_GetFamilyNames,
dwritefontfamily_GetFirstMatchingFont, 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; 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)); This = heap_alloc(sizeof(struct dwrite_fontfamily));
if (!This) return E_OUTOFMEMORY; if (!This) return E_OUTOFMEMORY;
This->IDWriteFontFamily_iface.lpVtbl = &fontfamilyvtbl; This->IDWriteFontFamily1_iface.lpVtbl = &fontfamilyvtbl;
This->ref = 1; This->ref = 1;
This->collection = collection; This->collection = collection;
IDWriteFontCollection_AddRef(collection); IDWriteFontCollection_AddRef(collection);
This->data = data; This->data = data;
InterlockedIncrement(&This->data->ref); InterlockedIncrement(&This->data->ref);
*family = &This->IDWriteFontFamily_iface; *family = &This->IDWriteFontFamily1_iface;
return S_OK; return S_OK;
} }
@ -1990,7 +2023,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection *
return E_FAIL; 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) 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_fontcollection *This = impl_from_IDWriteFontCollection(iface);
struct dwrite_fontfamily_data *found_family = NULL; struct dwrite_fontfamily_data *found_family = NULL;
struct dwrite_font_data *found_font = NULL; struct dwrite_font_data *found_font = NULL;
IDWriteFontFamily *family; IDWriteFontFamily1 *family;
UINT32 i, j, face_index; UINT32 i, j, face_index;
IDWriteFontFile *file; IDWriteFontFile *file;
HRESULT hr; HRESULT hr;
@ -2089,7 +2122,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
return hr; return hr;
hr = create_font(found_font, family, font); hr = create_font(found_font, family, font);
IDWriteFontFamily_Release(family); IDWriteFontFamily1_Release(family);
return hr; return hr;
} }

View File

@ -1055,6 +1055,7 @@ static void test_GetFontFamily(void)
IDWriteFontCollection *collection, *collection2; IDWriteFontCollection *collection, *collection2;
IDWriteFontCollection *syscoll; IDWriteFontCollection *syscoll;
IDWriteFontFamily *family, *family2; IDWriteFontFamily *family, *family2;
IDWriteFontFamily1 *family1;
IDWriteGdiInterop *interop; IDWriteGdiInterop *interop;
IDWriteFont *font, *font2; IDWriteFont *font, *font2;
IDWriteFactory *factory; IDWriteFactory *factory;
@ -1117,13 +1118,45 @@ if (0) /* crashes on native */
ok(collection == collection2, "got %p, %p\n", collection, collection2); ok(collection == collection2, "got %p, %p\n", collection, collection2);
ok(collection == syscoll, "got %p, %p\n", collection, syscoll); 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(syscoll);
IDWriteFontCollection_Release(collection2); IDWriteFontCollection_Release(collection2);
IDWriteFontCollection_Release(collection); IDWriteFontCollection_Release(collection);
IDWriteFontFamily_Release(family2); IDWriteFontFamily_Release(family2);
IDWriteFontFamily_Release(family); IDWriteFontFamily_Release(family);
IDWriteFont_Release(font);
IDWriteFont_Release(font2);
IDWriteGdiInterop_Release(interop); IDWriteGdiInterop_Release(interop);
IDWriteFactory_Release(factory); IDWriteFactory_Release(factory);
} }