From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/font.c | 37 +++++++++++++++++++++++++++++++++---- dlls/dwrite/tests/font.c | 17 ++++++++++++----- 2 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index b34244238a2..65bf7021938 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -3402,11 +3402,38 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec return hr; }
+static HRESULT fontset_create_from_font_collection(struct dwrite_fontcollection *collection, IDWriteFontSet1 **fontset) +{ + struct dwrite_font_data **fonts; + size_t count = 0, i, j, k = 0; + HRESULT hr; + + *fontset = NULL; + + for (i = 0; i < collection->count; ++i) + count += collection->family_data[i]->count; + + if (!(fonts = calloc(count, sizeof(*fonts)))) + return E_OUTOFMEMORY; + + for (i = 0; i < collection->count; ++i) + for (j = 0; j < collection->family_data[i]->count; ++j) + fonts[k++] = collection->family_data[i]->fonts[j]; + + hr = fontset_create_from_font_data(collection->factory, fonts, count, fontset); + + free(fonts); + + return hr; +} + static HRESULT WINAPI dwritefontcollection1_GetFontSet(IDWriteFontCollection3 *iface, IDWriteFontSet **fontset) { - FIXME("%p, %p.\n", iface, fontset); + struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, fontset); + + return fontset_create_from_font_collection(collection, (IDWriteFontSet1 **)fontset); }
static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection3 *iface, UINT32 index, @@ -3469,9 +3496,11 @@ static DWRITE_FONT_FAMILY_MODEL WINAPI dwritefontcollection2_GetFontFamilyModel(
static HRESULT WINAPI dwritefontcollection2_GetFontSet(IDWriteFontCollection3 *iface, IDWriteFontSet1 **fontset) { - FIXME("%p, %p.\n", iface, fontset); + struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection3(iface);
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, fontset); + + return fontset_create_from_font_collection(collection, fontset); }
static HANDLE WINAPI dwritefontcollection3_GetExpirationEvent(IDWriteFontCollection3 *iface) diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index d299d994273..46f2927a05d 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -2582,8 +2582,9 @@ static void test_system_fontcollection(void) ok(i == (UINT32)-1, "got %u\n", i);
hr = IDWriteFontCollection_QueryInterface(collection, &IID_IDWriteFontCollection1, (void**)&collection1); - if (hr == S_OK) { - IDWriteFontSet *fontset, *fontset2; + if (hr == S_OK) + { + IDWriteFontSet *fontset, *fontset2, *fontset3; IDWriteFontFamily1 *family1; IDWriteFactory3 *factory3;
@@ -2605,10 +2606,9 @@ static void test_system_fontcollection(void) EXPECT_REF(collection1, 2); EXPECT_REF(factory, 2); hr = IDWriteFontCollection1_GetFontSet(collection1, &fontset); - todo_wine ok(hr == S_OK, "Failed to get fontset, hr %#lx.\n", hr); - if (hr == S_OK) { EXPECT_REF(collection1, 2); + todo_wine EXPECT_REF(factory, 2); EXPECT_REF(fontset, 1);
@@ -2621,18 +2621,25 @@ static void test_system_fontcollection(void) hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory3, (void **)&factory3); ok(hr == S_OK, "Failed to get IDWriteFactory3 interface, hr %#lx.\n", hr);
+ todo_wine EXPECT_REF(factory, 3); hr = IDWriteFactory3_GetSystemFontSet(factory3, &fontset2); ok(hr == S_OK, "Failed to get system font set, hr %#lx.\n", hr); ok(fontset != fontset2, "Expected new fontset instance.\n"); EXPECT_REF(fontset2, 1); + todo_wine EXPECT_REF(factory, 4);
+ hr = IDWriteFactory3_GetSystemFontSet(factory3, &fontset3); + ok(hr == S_OK, "Failed to get system font set, hr %#lx.\n", hr); + todo_wine + ok(fontset2 == fontset3, "Expected new fontset instance.\n"); + + IDWriteFontSet_Release(fontset3); IDWriteFontSet_Release(fontset2); IDWriteFontSet_Release(fontset);
IDWriteFactory3_Release(factory3); - } IDWriteFontCollection1_Release(collection1); } else