dwrite: Make sure same files are scanned once when building font collection
Nikolay Sivov
nsivov at codeweavers.com
Thu Sep 3 15:52:22 CDT 2015
---
-------------- next part --------------
From 57cb5e0a8f1e60a0e78904f3db312c1b33bfda27 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu, 3 Sep 2015 23:50:45 +0300
Subject: [PATCH] dwrite: Make sure same files are scanned once when building
font collection
---
dlls/dwrite/font.c | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index baa5ace..a181395 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -2866,7 +2866,13 @@ static void fontfamily_add_oblique_simulated_face(struct dwrite_fontfamily_data
HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system, IDWriteFontCollection **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;
UINT32 i;
@@ -2886,12 +2892,13 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat
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;
IDWriteFontFile *file;
UINT32 face_count;
- BOOL supported;
current = FALSE;
hr = IDWriteFontFileEnumerator_MoveNext(enumerator, ¤t);
@@ -2902,6 +2909,17 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat
if (FAILED(hr))
break;
+ /* check if we've scanned this file already */
+ LIST_FOR_EACH_ENTRY(fileenum, &scannedfiles, struct fontfile_enum, entry) {
+ if ((same = is_same_fontfile(fileenum->file, file)))
+ break;
+ }
+
+ if (same) {
+ IDWriteFontFile_Release(file);
+ continue;
+ }
+
/* failed font files are skipped */
hr = IDWriteFontFile_Analyze(file, &supported, &file_type, &face_type, &face_count);
if (FAILED(hr) || !supported || face_count == 0) {
@@ -2911,6 +2929,11 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat
continue;
}
+ /* add to scanned list */
+ fileenum = heap_alloc(sizeof(*fileenum));
+ fileenum->file = file;
+ list_add_tail(&scannedfiles, &fileenum->entry);
+
for (i = 0; i < face_count; i++) {
IDWriteLocalizedStrings *family_name = NULL;
struct dwrite_font_data *font_data;
@@ -2948,8 +2971,12 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat
if (FAILED(hr))
break;
}
+ }
- IDWriteFontFile_Release(file);
+ LIST_FOR_EACH_ENTRY_SAFE(fileenum, fileenum2, &scannedfiles, struct fontfile_enum, entry) {
+ IDWriteFontFile_Release(fileenum->file);
+ list_remove(&fileenum->entry);
+ heap_free(fileenum);
}
for (i = 0; i < collection->family_count; i++) {
--
2.1.4
More information about the wine-patches
mailing list