[PATCH 4/5] dwrite: Return font set for matched font list.
Nikolay Sivov
nsivov at codeweavers.com
Thu Mar 4 09:39:37 CST 2021
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/font.c | 44 ++++++++++++++++++++++++++++++++++++++--
dlls/dwrite/tests/font.c | 29 ++++++++++++++++++++++++++
2 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index b0b8e3c34f4..b64ea53692f 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -278,6 +278,9 @@ struct dwrite_fontset_builder
size_t capacity;
};
+static HRESULT fontset_create_from_font_data(IDWriteFactory7 *factory, struct dwrite_font_data **fonts,
+ unsigned int count, IDWriteFontSet1 **ret);
+
static void dwrite_grab_font_table(void *context, UINT32 table, const BYTE **data, UINT32 *size, void **data_context)
{
struct dwrite_fontface *fontface = context;
@@ -2385,9 +2388,12 @@ static HRESULT WINAPI dwritefontlist1_GetFontFaceReference(IDWriteFontList2 *ifa
static HRESULT WINAPI dwritefontlist2_GetFontSet(IDWriteFontList2 *iface, IDWriteFontSet1 **fontset)
{
- FIXME("%p, %p.\n", iface, fontset);
+ struct dwrite_fontlist *fontlist = impl_from_IDWriteFontList2(iface);
- return E_NOTIMPL;
+ TRACE("%p, %p.\n", iface, fontset);
+
+ return fontset_create_from_font_data(fontlist->family->collection->factory, fontlist->fonts,
+ fontlist->font_count, fontset);
}
static const IDWriteFontList2Vtbl dwritefontlistvtbl =
@@ -7410,6 +7416,40 @@ static const IDWriteFontSet3Vtbl fontsetvtbl =
dwritefontset3_GetFontSourceName,
};
+static HRESULT fontset_create_from_font_data(IDWriteFactory7 *factory, struct dwrite_font_data **fonts,
+ unsigned int count, IDWriteFontSet1 **ret)
+{
+ struct dwrite_fontset *object;
+ unsigned int i;
+
+ if (!(object = heap_alloc_zero(sizeof(*object))))
+ return E_OUTOFMEMORY;
+
+ object->IDWriteFontSet3_iface.lpVtbl = &fontsetvtbl;
+ object->refcount = 1;
+ object->factory = factory;
+ IDWriteFactory7_AddRef(object->factory);
+
+ if (count)
+ {
+ object->entries = heap_calloc(count, sizeof(*object->entries));
+ object->count = count;
+
+ /* FIXME: set available properties too */
+ for (i = 0; i < object->count; ++i)
+ {
+ object->entries[i].file = fonts[i]->file;
+ object->entries[i].face_index = fonts[i]->face_index;
+ object->entries[i].simulations = fonts[i]->simulations;
+ IDWriteFontFile_AddRef(object->entries[i].file);
+ }
+ }
+
+ *ret = (IDWriteFontSet1 *)&object->IDWriteFontSet3_iface;
+
+ return S_OK;
+}
+
static HRESULT fontset_builder_create_fontset(IDWriteFactory7 *factory, struct dwrite_fontset_entry *entries,
unsigned int count, IDWriteFontSet **ret)
{
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 4dcbbc4d077..12ea78b634b 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -1626,7 +1626,24 @@ if (0) /* crashes on native */
if (SUCCEEDED(IDWriteFontFamily1_QueryInterface(family1, &IID_IDWriteFontList2, (void **)&fontlist2)))
{
+ IDWriteFontSet1 *fontset = NULL, *fontset2 = NULL;
+
ok(fontlist == (IDWriteFontList *)fontlist2, "Unexpected interface pointer.\n");
+
+ hr = IDWriteFontList2_GetFontSet(fontlist2, &fontset);
+ todo_wine
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IDWriteFontList2_GetFontSet(fontlist2, &fontset2);
+ todo_wine {
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(fontset != fontset2, "Unexpected instance.\n");
+ }
+ if (fontset2)
+ IDWriteFontSet1_Release(fontset2);
+ if (fontset)
+ IDWriteFontSet1_Release(fontset);
+
IDWriteFontList2_Release(fontlist2);
}
else
@@ -4067,6 +4084,18 @@ static void test_GetMatchingFonts(void)
if (SUCCEEDED(IDWriteFontList_QueryInterface(fontlist, &IID_IDWriteFontList2, (void **)&fontlist3)))
{
+ IDWriteFontSet1 *fontset, *fontset2;
+
+ hr = IDWriteFontList2_GetFontSet(fontlist3, &fontset);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IDWriteFontList2_GetFontSet(fontlist3, &fontset2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(fontset != fontset2, "Unexpected instance.\n");
+
+ IDWriteFontSet1_Release(fontset2);
+ IDWriteFontSet1_Release(fontset);
+
IDWriteFontList2_Release(fontlist3);
}
else
--
2.30.1
More information about the wine-devel
mailing list