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;
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;
}

View File

@ -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);
}