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, &current);
@@ -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