From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/dwrite/dwrite_private.h | 4 +- dlls/dwrite/font.c | 131 ++++++----------------------------- dlls/dwrite/main.c | 2 +- 3 files changed, 24 insertions(+), 113 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 345c64277da..dc25ce351c6 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -338,8 +338,8 @@ extern void init_local_fontfile_loader(void); extern IDWriteFontFileLoader *get_local_fontfile_loader(void); extern HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_list, IDWriteFontFace5 **fontface); -extern HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system, - IDWriteFontCollection3 **collection); +extern HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerator *enumerator, + IDWriteFontCollection3 **collection); extern HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc*,IDWriteGlyphRunAnalysis**); extern HRESULT get_local_refkey(const WCHAR*,const FILETIME*,void**,UINT32*); extern HRESULT get_filestream_from_file(IDWriteFontFile*,IDWriteFontFileStream**); diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 8af7cf34296..f89df74f054 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -4640,49 +4640,32 @@ static void fontcollection_add_replacements(struct dwrite_fontcollection *collec RegCloseKey(hkey); }
-HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system, - IDWriteFontCollection3 **ret) +HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerator *enumerator, IDWriteFontCollection3 **ret) { struct fontfile_enum { struct list entry; IDWriteFontFile *file; }; struct fontfile_enum *fileenum, *fileenum2; - struct dwrite_fontcollection *collection; struct list scannedfiles; - BOOL current = FALSE; - HRESULT hr = S_OK; - size_t i; + IDWriteFontSetBuilder1 *builder; + IDWriteFontSet *fontset = NULL; + BOOL current; + HRESULT hr;
*ret = NULL;
- if (!(collection = calloc(1, sizeof(*collection)))) - return E_OUTOFMEMORY; - - hr = init_font_collection(collection, factory, DWRITE_FONT_FAMILY_MODEL_WEIGHT_STRETCH_STYLE); - if (FAILED(hr)) - { - free(collection); + if (FAILED(hr = create_fontset_builder(factory, FALSE, (IDWriteFontSetBuilder2 **)&builder))) return hr; - } - - *ret = &collection->IDWriteFontCollection3_iface;
TRACE("building font collection:\n");
list_init(&scannedfiles); - while (hr == S_OK) { - DWRITE_FONT_FACE_TYPE face_type; - DWRITE_FONT_FILE_TYPE file_type; - BOOL supported, same = FALSE; - IDWriteFontFileStream *stream; - IDWriteFontFile *file; - UINT32 face_count;
- current = FALSE; - hr = IDWriteFontFileEnumerator_MoveNext(enumerator, ¤t); - if (FAILED(hr) || !current) - break; + while (IDWriteFontFileEnumerator_MoveNext(enumerator, ¤t) == S_OK && current) + { + IDWriteFontFile *file; + BOOL same = FALSE;
hr = IDWriteFontFileEnumerator_GetCurrentFontFile(enumerator, &file); if (FAILED(hr)) @@ -4699,88 +4682,21 @@ HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerat continue; }
- if (FAILED(get_filestream_from_file(file, &stream))) { - IDWriteFontFile_Release(file); - continue; - } - - /* Unsupported formats are skipped. */ - hr = opentype_analyze_font(stream, &supported, &file_type, &face_type, &face_count); - if (FAILED(hr) || !supported || face_count == 0) { - TRACE("Unsupported font (%p, 0x%08lx, %d, %u)\n", file, hr, supported, face_count); - IDWriteFontFileStream_Release(stream); - IDWriteFontFile_Release(file); - hr = S_OK; - continue; - } - /* add to scanned list */ fileenum = malloc(sizeof(*fileenum)); fileenum->file = file; list_add_tail(&scannedfiles, &fileenum->entry);
- for (i = 0; i < face_count; ++i) - { - struct dwrite_font_data *font_data; - struct fontface_desc desc; - WCHAR familyW[255]; - UINT32 index; - - desc.factory = factory; - desc.face_type = face_type; - desc.file = file; - desc.stream = stream; - desc.index = i; - desc.simulations = DWRITE_FONT_SIMULATIONS_NONE; - desc.font_data = NULL; - - /* Allocate an initialize new font data structure. */ - hr = init_font_data(&desc, DWRITE_FONT_FAMILY_MODEL_WEIGHT_STRETCH_STYLE, &font_data); - if (FAILED(hr)) - { - /* move to next one */ - hr = S_OK; - continue; - } - - fontstrings_get_en_string(font_data->family_names, familyW, ARRAY_SIZE(familyW)); - - /* ignore dot named faces */ - if (familyW[0] == '.') - { - WARN("Ignoring face %s\n", debugstr_w(familyW)); - release_font_data(font_data); - continue; - } - - index = collection_find_family(collection, familyW); - if (index != ~0u) - hr = fontfamily_add_font(collection->family_data[index], font_data); - else { - struct dwrite_fontfamily_data *family_data; - - /* create and init new family */ - hr = init_fontfamily_data(font_data->family_names, &family_data); - if (hr == S_OK) { - /* add font to family, family - to collection */ - hr = fontfamily_add_font(family_data, font_data); - if (hr == S_OK) - hr = fontcollection_add_family(collection, family_data); - - if (FAILED(hr)) - release_fontfamily_data(family_data); - } - } + if (FAILED(hr = IDWriteFontSetBuilder1_AddFontFile(builder, file))) + break; + }
- if (FAILED(hr)) - { - release_font_data(font_data); - break; - } - } + if (SUCCEEDED(hr)) + hr = IDWriteFontSetBuilder1_CreateFontSet(builder, &fontset);
- IDWriteFontFileStream_Release(stream); - } + if (SUCCEEDED(hr)) + hr = create_font_collection_from_set(factory, fontset, DWRITE_FONT_FAMILY_MODEL_WEIGHT_STRETCH_STYLE, + &IID_IDWriteFontCollection3, (void **)ret);
LIST_FOR_EACH_ENTRY_SAFE(fileenum, fileenum2, &scannedfiles, struct fontfile_enum, entry) { @@ -4789,14 +4705,9 @@ HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerat free(fileenum); }
- for (i = 0; i < collection->count; ++i) - { - fontfamily_add_bold_simulated_face(collection->family_data[i]); - fontfamily_add_oblique_simulated_face(collection->family_data[i]); - } - - if (is_system) - fontcollection_add_replacements(collection); + if (fontset) + IDWriteFontSet_Release(fontset); + IDWriteFontSetBuilder1_Release(builder);
return hr; } diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index b25dd8b4053..9c6afa5de98 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -823,7 +823,7 @@ static HRESULT WINAPI dwritefactory_CreateCustomFontCollection(IDWriteFactory7 * if (FAILED(hr)) return hr;
- hr = create_font_collection(iface, enumerator, FALSE, (IDWriteFontCollection3 **)collection); + hr = create_font_collection(iface, enumerator, (IDWriteFontCollection3 **)collection); IDWriteFontFileEnumerator_Release(enumerator); return hr; }