[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