Module: wine Branch: master Commit: dc9f12170c2151d65da6e5b3570c5396576922ae URL: https://source.winehq.org/git/wine.git/?a=commit;h=dc9f12170c2151d65da6e5b35...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Jan 21 16:36:52 2021 +0300
dwrite: Add font set builder stub.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/dwrite_private.h | 1 + dlls/dwrite/font.c | 146 +++++++++++++++++++++++++++++++++++++++++++ dlls/dwrite/main.c | 12 ++-- dlls/dwrite/tests/font.c | 17 +++-- 4 files changed, 161 insertions(+), 15 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index f3636876251..9fd9e0bc68f 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -346,6 +346,7 @@ extern void factory_unlock(IDWriteFactory7 *factory) DECLSPEC_HIDDEN; extern HRESULT create_inmemory_fileloader(IDWriteInMemoryFontFileLoader **loader) DECLSPEC_HIDDEN; extern HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UINT32 face_index, IDWriteFontResource **resource) DECLSPEC_HIDDEN; +extern HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2 **ret) DECLSPEC_HIDDEN;
struct dwrite_fontface;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 392c1dd0ee8..014240a1c8f 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -250,6 +250,13 @@ struct dwrite_fontresource IDWriteFactory7 *factory; };
+struct dwrite_fontset_builder +{ + IDWriteFontSetBuilder2 IDWriteFontSetBuilder2_iface; + LONG refcount; + IDWriteFactory7 *factory; +}; + static void dwrite_grab_font_table(void *context, UINT32 table, const BYTE **data, UINT32 *size, void **data_context) { struct dwrite_fontface *fontface = context; @@ -373,6 +380,11 @@ static struct dwrite_fontresource *impl_from_IDWriteFontResource(IDWriteFontReso return CONTAINING_RECORD(iface, struct dwrite_fontresource, IDWriteFontResource_iface); }
+static struct dwrite_fontset_builder *impl_from_IDWriteFontSetBuilder2(IDWriteFontSetBuilder2 *iface) +{ + return CONTAINING_RECORD(iface, struct dwrite_fontset_builder, IDWriteFontSetBuilder2_iface); +} + static HRESULT get_cached_glyph_metrics(struct dwrite_fontface *fontface, UINT16 glyph, DWRITE_GLYPH_METRICS *metrics) { static const DWRITE_GLYPH_METRICS nil; @@ -7105,3 +7117,137 @@ HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UI
return S_OK; } + +static HRESULT WINAPI dwritefontsetbuilder_QueryInterface(IDWriteFontSetBuilder2 *iface, + REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IDWriteFontSetBuilder2) || + IsEqualIID(riid, &IID_IDWriteFontSetBuilder1) || + IsEqualIID(riid, &IID_IDWriteFontSetBuilder) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IDWriteFontSetBuilder2_AddRef(iface); + return S_OK; + } + + WARN("Unsupported interface %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI dwritefontsetbuilder_AddRef(IDWriteFontSetBuilder2 *iface) +{ + struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface); + ULONG refcount = InterlockedIncrement(&builder->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI dwritefontsetbuilder_Release(IDWriteFontSetBuilder2 *iface) +{ + struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface); + ULONG refcount = InterlockedDecrement(&builder->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + IDWriteFactory7_Release(builder->factory); + heap_free(builder); + } + + return refcount; +} + +static HRESULT WINAPI dwritefontsetbuilder_AddFontFaceReference_(IDWriteFontSetBuilder2 *iface, + IDWriteFontFaceReference *ref, DWRITE_FONT_PROPERTY const *props, UINT32 prop_count) +{ + FIXME("%p, %p, %p, %u.\n", iface, ref, props, prop_count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefontsetbuilder_AddFontFaceReference(IDWriteFontSetBuilder2 *iface, + IDWriteFontFaceReference *ref) +{ + FIXME("%p, %p.\n", iface, ref); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefontsetbuilder_AddFontSet(IDWriteFontSetBuilder2 *iface, IDWriteFontSet *fontset) +{ + FIXME("%p, %p.\n", iface, fontset); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefontsetbuilder_CreateFontSet(IDWriteFontSetBuilder2 *iface, IDWriteFontSet **fontset) +{ + FIXME("%p, %p.\n", iface, fontset); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefontsetbuilder1_AddFontFile(IDWriteFontSetBuilder2 *iface, IDWriteFontFile *file) +{ + FIXME("%p, %p.\n", iface, file); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefontsetbuilder2_AddFont(IDWriteFontSetBuilder2 *iface, IDWriteFontFile *file, + unsigned int face_index, DWRITE_FONT_SIMULATIONS simulations, const DWRITE_FONT_AXIS_VALUE *axis_values, + unsigned int num_values, const DWRITE_FONT_AXIS_RANGE *axis_ranges, unsigned int num_ranges, + const DWRITE_FONT_PROPERTY *props, unsigned int num_properties) +{ + FIXME("%p, %p, %u, %#x, %p, %u, %p, %u, %p, %u.\n", iface, file, face_index, simulations, axis_values, num_values, + axis_ranges, num_ranges, props, num_properties); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefontsetbuilder2_AddFontFile(IDWriteFontSetBuilder2 *iface, const WCHAR *filepath) +{ + FIXME("%p, %s.\n", iface, debugstr_w(filepath)); + + return E_NOTIMPL; +} + +static const IDWriteFontSetBuilder2Vtbl fontsetbuildervtbl = +{ + dwritefontsetbuilder_QueryInterface, + dwritefontsetbuilder_AddRef, + dwritefontsetbuilder_Release, + dwritefontsetbuilder_AddFontFaceReference_, + dwritefontsetbuilder_AddFontFaceReference, + dwritefontsetbuilder_AddFontSet, + dwritefontsetbuilder_CreateFontSet, + dwritefontsetbuilder1_AddFontFile, + dwritefontsetbuilder2_AddFont, + dwritefontsetbuilder2_AddFontFile, +}; + +HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2 **ret) +{ + struct dwrite_fontset_builder *builder; + + *ret = NULL; + + if (!(builder = heap_alloc_zero(sizeof(*builder)))) + return E_OUTOFMEMORY; + + builder->IDWriteFontSetBuilder2_iface.lpVtbl = &fontsetbuildervtbl; + builder->refcount = 1; + builder->factory = factory; + IDWriteFactory7_AddRef(builder->factory); + + *ret = &builder->IDWriteFontSetBuilder2_iface; + + return S_OK; +} diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index dd9bd4dc6a3..0cc0edd1ffc 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -1501,9 +1501,9 @@ static HRESULT WINAPI dwritefactory3_GetSystemFontSet(IDWriteFactory7 *iface, ID
static HRESULT WINAPI dwritefactory3_CreateFontSetBuilder(IDWriteFactory7 *iface, IDWriteFontSetBuilder **builder) { - FIXME("%p, %p: stub\n", iface, builder); + TRACE("%p, %p.\n", iface, builder);
- return E_NOTIMPL; + return create_fontset_builder(iface, (IDWriteFontSetBuilder2 **)builder); }
static HRESULT WINAPI dwritefactory3_CreateFontCollectionFromFontSet(IDWriteFactory7 *iface, IDWriteFontSet *fontset, @@ -1644,9 +1644,9 @@ static HRESULT WINAPI dwritefactory4_ComputeGlyphOrigins(IDWriteFactory7 *iface,
static HRESULT WINAPI dwritefactory5_CreateFontSetBuilder(IDWriteFactory7 *iface, IDWriteFontSetBuilder1 **builder) { - FIXME("%p, %p: stub\n", iface, builder); + TRACE("%p, %p.\n", iface, builder);
- return E_NOTIMPL; + return create_fontset_builder(iface, (IDWriteFontSetBuilder2 **)builder); }
static HRESULT WINAPI dwritefactory5_CreateInMemoryFontFileLoader(IDWriteFactory7 *iface, @@ -1725,9 +1725,9 @@ static HRESULT WINAPI dwritefactory6_CreateFontCollectionFromFontSet(IDWriteFact
static HRESULT WINAPI dwritefactory6_CreateFontSetBuilder(IDWriteFactory7 *iface, IDWriteFontSetBuilder2 **builder) { - FIXME("%p, %p.\n", iface, builder); + TRACE("%p, %p.\n", iface, builder);
- return E_NOTIMPL; + return create_fontset_builder(iface, builder); }
static HRESULT WINAPI dwritefactory6_CreateTextFormat(IDWriteFactory7 *iface, const WCHAR *familyname, diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 193f8ed9c48..872405b1639 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -9371,21 +9371,15 @@ static void test_fontsetbuilder(void) HRESULT hr;
factory = create_factory_iid(&IID_IDWriteFactory3); - if (!factory) { - skip("IDWriteFontSetBuilder is not supported.\n"); + if (!factory) + { + win_skip("IDWriteFontSetBuilder is not supported.\n"); return; }
EXPECT_REF(factory, 1); hr = IDWriteFactory3_CreateFontSetBuilder(factory, &builder); -todo_wine ok(hr == S_OK, "Failed to create font set builder, hr %#x.\n", hr); - - if (FAILED(hr)) { - IDWriteFactory3_Release(factory); - return; - } - EXPECT_REF(factory, 2); IDWriteFontSetBuilder_Release(builder);
@@ -9419,12 +9413,16 @@ todo_wine
EXPECT_REF(ref, 1); hr = IDWriteFontSetBuilder_AddFontFaceReference(builder, ref); + todo_wine ok(hr == S_OK, "Failed to add fontface reference, hr %#x.\n", hr); EXPECT_REF(ref, 1);
hr = IDWriteFontSetBuilder_CreateFontSet(builder, &fontset); + todo_wine ok(hr == S_OK, "Failed to create a font set, hr %#x.\n", hr);
+ if (SUCCEEDED(hr)) + { setcount = IDWriteFontSet_GetFontCount(fontset); ok(setcount == 1, "Unexpected font count %u.\n", setcount);
@@ -9490,6 +9488,7 @@ todo_wine }
IDWriteFontSet_Release(fontset); + } IDWriteFontFaceReference_Release(ref); IDWriteFontSetBuilder_Release(builder);