From: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/dwrite/dwrite_private.h | 2 +- dlls/dwrite/font.c | 34 +++++++++++++++++++++------------- dlls/dwrite/main.c | 8 ++++---- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 688ac2d12f6..345c64277da 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -376,7 +376,7 @@ extern void factory_unlock(IDWriteFactory7 *factory); extern HRESULT create_inmemory_fileloader(IDWriteInMemoryFontFileLoader **loader); extern HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UINT32 face_index, IDWriteFontResource **resource); -extern HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2 **ret); +extern HRESULT create_fontset_builder(IDWriteFactory7 *factory, BOOL is_system, IDWriteFontSetBuilder2 **ret); extern HRESULT compute_glyph_origins(DWRITE_GLYPH_RUN const *run, DWRITE_MEASURING_MODE measuring_mode, D2D1_POINT_2F baseline_origin, DWRITE_MATRIX const *transform, D2D1_POINT_2F *origins); extern HRESULT create_font_collection_from_set(IDWriteFactory7 *factory, IDWriteFontSet *set, diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 4eb9961d8df..c7fade678bf 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -485,6 +485,8 @@ struct dwrite_fontset struct dwrite_fontset_entry **entries; unsigned int count; + + BOOL is_system; }; struct dwrite_fontset_builder @@ -496,6 +498,8 @@ struct dwrite_fontset_builder struct dwrite_fontset_entry **entries; size_t count; size_t capacity; + + BOOL is_system; }; static HRESULT fontset_create_from_font_data(IDWriteFactory7 *factory, struct dwrite_font_data **fonts, @@ -4898,6 +4902,9 @@ HRESULT create_font_collection_from_set(IDWriteFactory7 *factory, IDWriteFontSet } } + if (set->is_system) + fontcollection_add_replacements(collection); + hr = IDWriteFontCollection3_QueryInterface(&collection->IDWriteFontCollection3_iface, riid, ret); IDWriteFontCollection3_Release(&collection->IDWriteFontCollection3_iface); @@ -7715,7 +7722,7 @@ static IDWriteLocalizedStrings * fontset_entry_get_property(struct dwrite_fontse } static void init_fontset(struct dwrite_fontset *object, IDWriteFactory7 *factory, - struct dwrite_fontset_entry **entries, unsigned int count); + struct dwrite_fontset_entry **entries, unsigned int count, BOOL is_system); static ULONG WINAPI dwritefontset_Release(IDWriteFontSet3 *iface) { @@ -7908,7 +7915,7 @@ static HRESULT WINAPI dwritefontset_GetMatchingFonts(IDWriteFontSet3 *iface, DWR entries = NULL; } - init_fontset(object, set->factory, entries, matched_count); + init_fontset(object, set->factory, entries, matched_count, FALSE); *filtered_set = (IDWriteFontSet *)&object->IDWriteFontSet3_iface; @@ -8115,7 +8122,7 @@ static HRESULT fontset_create_entry(IDWriteFontFile *file, DWRITE_FONT_FACE_TYPE } static void init_fontset(struct dwrite_fontset *object, IDWriteFactory7 *factory, - struct dwrite_fontset_entry **entries, unsigned int count) + struct dwrite_fontset_entry **entries, unsigned int count, BOOL is_system) { object->IDWriteFontSet3_iface.lpVtbl = &fontsetvtbl; object->refcount = 1; @@ -8123,6 +8130,7 @@ static void init_fontset(struct dwrite_fontset *object, IDWriteFactory7 *factory IDWriteFactory7_AddRef(object->factory); object->entries = entries; object->count = count; + object->is_system = is_system; } static HRESULT fontset_create_from_font_data(IDWriteFactory7 *factory, struct dwrite_font_data **fonts, @@ -8147,15 +8155,14 @@ static HRESULT fontset_create_from_font_data(IDWriteFactory7 *factory, struct dw fonts[i]->simulations, &entries[i]); } } - init_fontset(object, factory, entries, count); + init_fontset(object, factory, entries, count, FALSE); *ret = (IDWriteFontSet1 *)&object->IDWriteFontSet3_iface; return S_OK; } -static HRESULT fontset_builder_create_fontset(IDWriteFactory7 *factory, struct dwrite_fontset_entry **src_entries, - unsigned int count, IDWriteFontSet **ret) +static HRESULT fontset_builder_create_fontset(struct dwrite_fontset_builder *builder, IDWriteFontSet **ret) { struct dwrite_fontset_entry **entries = NULL; struct dwrite_fontset *object; @@ -8164,14 +8171,14 @@ static HRESULT fontset_builder_create_fontset(IDWriteFactory7 *factory, struct d if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY; - if (count) + if (builder->count) { - entries = calloc(count, sizeof(*entries)); + entries = calloc(builder->count, sizeof(*entries)); - for (i = 0; i < count; ++i) - entries[i] = addref_fontset_entry(src_entries[i]); + for (i = 0; i < builder->count; ++i) + entries[i] = addref_fontset_entry(builder->entries[i]); } - init_fontset(object, factory, entries, count); + init_fontset(object, builder->factory, entries, builder->count, builder->is_system); *ret = (IDWriteFontSet *)&object->IDWriteFontSet3_iface; @@ -8325,7 +8332,7 @@ static HRESULT WINAPI dwritefontsetbuilder_CreateFontSet(IDWriteFontSetBuilder2 TRACE("%p, %p.\n", iface, fontset); - return fontset_builder_create_fontset(builder->factory, builder->entries, builder->count, fontset); + return fontset_builder_create_fontset(builder, fontset); } static HRESULT WINAPI dwritefontsetbuilder1_AddFontFile(IDWriteFontSetBuilder2 *iface, IDWriteFontFile *file) @@ -8378,7 +8385,7 @@ static const IDWriteFontSetBuilder2Vtbl fontsetbuildervtbl = dwritefontsetbuilder2_AddFontFile, }; -HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2 **ret) +HRESULT create_fontset_builder(IDWriteFactory7 *factory, BOOL is_system, IDWriteFontSetBuilder2 **ret) { struct dwrite_fontset_builder *builder; @@ -8389,6 +8396,7 @@ HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2 builder->IDWriteFontSetBuilder2_iface.lpVtbl = &fontsetbuildervtbl; builder->refcount = 1; + builder->is_system = is_system; builder->factory = factory; IDWriteFactory7_AddRef(builder->factory); diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index d4ae2bf4477..b25dd8b4053 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -1632,7 +1632,7 @@ HRESULT create_system_fontset(IDWriteFactory7 *factory, REFIID riid, void **obj) *obj = NULL; - if (FAILED(hr = create_fontset_builder(factory, &builder))) return hr; + if (FAILED(hr = create_fontset_builder(factory, TRUE, &builder))) return hr; if (SUCCEEDED(hr = create_system_path_list(&paths, &count))) { @@ -1677,7 +1677,7 @@ static HRESULT WINAPI dwritefactory3_CreateFontSetBuilder(IDWriteFactory7 *iface { TRACE("%p, %p.\n", iface, builder); - return create_fontset_builder(iface, (IDWriteFontSetBuilder2 **)builder); + return create_fontset_builder(iface, FALSE, (IDWriteFontSetBuilder2 **)builder); } static HRESULT WINAPI dwritefactory3_CreateFontCollectionFromFontSet(IDWriteFactory7 *iface, IDWriteFontSet *fontset, @@ -1796,7 +1796,7 @@ static HRESULT WINAPI dwritefactory5_CreateFontSetBuilder(IDWriteFactory7 *iface { TRACE("%p, %p.\n", iface, builder); - return create_fontset_builder(iface, (IDWriteFontSetBuilder2 **)builder); + return create_fontset_builder(iface, FALSE, (IDWriteFontSetBuilder2 **)builder); } static HRESULT WINAPI dwritefactory5_CreateInMemoryFontFileLoader(IDWriteFactory7 *iface, @@ -1885,7 +1885,7 @@ static HRESULT WINAPI dwritefactory6_CreateFontSetBuilder(IDWriteFactory7 *iface { TRACE("%p, %p.\n", iface, builder); - return create_fontset_builder(iface, builder); + return create_fontset_builder(iface, FALSE, builder); } static HRESULT WINAPI dwritefactory6_CreateTextFormat(IDWriteFactory7 *iface, const WCHAR *family_name, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8961