From: Nikolay Sivov nsivov@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,