[PATCH rebase 3/4] gdi32: Add a helper for trying to load fonts from %WINDIR%\fonts first.

Jactry Zeng jzeng at codeweavers.com
Tue Mar 10 08:22:11 CDT 2020


Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
---
 dlls/gdi32/freetype.c | 52 +++++++++++++++++++++------------------------------
 1 file changed, 21 insertions(+), 31 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 3ed093701d..72e6f35fc1 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -3049,7 +3049,7 @@ static char *get_data_dir_path( LPCWSTR file )
     return unix_name;
 }
 
-static BOOL load_font_from_data_dir(LPCWSTR file)
+static BOOL load_font_from_data_dir(LPCWSTR file, DWORD flags)
 {
     BOOL ret = FALSE;
     char *unix_name = get_data_dir_path( file );
@@ -3057,7 +3057,7 @@ static BOOL load_font_from_data_dir(LPCWSTR file)
     if (unix_name)
     {
         EnterCriticalSection( &freetype_cs );
-        ret = AddFontToList(unix_name, NULL, 0, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
+        ret = AddFontToList(unix_name, NULL, 0, flags);
         LeaveCriticalSection( &freetype_cs );
         HeapFree(GetProcessHeap(), 0, unix_name);
     }
@@ -3076,32 +3076,34 @@ static char *get_winfonts_dir_path(LPCWSTR file)
     return wine_get_unix_file_name( windowsdir );
 }
 
+static void load_font_from_fonts_dir(const WCHAR *filename, DWORD flags)
+{
+    BOOL added = FALSE;
+    char *unixname;
+
+    unixname = get_winfonts_dir_path(filename);
+    if (unixname)
+    {
+        added = AddFontToList(unixname, NULL, 0, flags);
+        HeapFree(GetProcessHeap(), 0, unixname);
+    }
+    if (!added)
+        load_font_from_data_dir(filename, flags);
+}
+
 static void load_system_fonts(void)
 {
     HKEY hkey;
-    WCHAR data[MAX_PATH], windowsdir[MAX_PATH], pathW[MAX_PATH];
+    WCHAR data[MAX_PATH];
     const WCHAR * const *value;
     DWORD dlen, type;
-    static const WCHAR fmtW[] = {'%','s','\\','%','s','\0'};
-    char *unixname;
 
     if(RegOpenKeyW(HKEY_CURRENT_CONFIG, system_fonts_reg_key, &hkey) == ERROR_SUCCESS) {
-        GetWindowsDirectoryW(windowsdir, ARRAY_SIZE(windowsdir));
-        strcatW(windowsdir, fontsW);
         for(value = SystemFontValues; *value; value++) { 
             dlen = sizeof(data);
             if(RegQueryValueExW(hkey, *value, 0, &type, (void*)data, &dlen) == ERROR_SUCCESS &&
-               type == REG_SZ) {
-                BOOL added = FALSE;
-
-                sprintfW(pathW, fmtW, windowsdir, data);
-                if((unixname = wine_get_unix_file_name(pathW))) {
-                    added = AddFontToList(unixname, NULL, 0, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
-                    HeapFree(GetProcessHeap(), 0, unixname);
-                }
-                if (!added)
-                    load_font_from_data_dir(data);
-            }
+               type == REG_SZ)
+                load_font_from_fonts_dir(data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
         }
         RegCloseKey(hkey);
     }
@@ -4295,20 +4297,8 @@ static void init_font_list(void)
                     }
                 }
                 else if(dlen / 2 >= 6 && !strcmpiW(data + dlen / 2 - 5, dot_fonW))
-                {
-                    WCHAR pathW[MAX_PATH];
-                    static const WCHAR fmtW[] = {'%','s','\\','%','s','\0'};
-                    BOOL added = FALSE;
+                    load_font_from_fonts_dir(data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
 
-                    sprintfW(pathW, fmtW, windowsdir, data);
-                    if((unixname = wine_get_unix_file_name(pathW)))
-                    {
-                        added = AddFontToList(unixname, NULL, 0, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
-                        HeapFree(GetProcessHeap(), 0, unixname);
-                    }
-                    if (!added)
-                        load_font_from_data_dir(data);
-                }
                 /* reset dlen and vlen */
                 dlen = datalen;
                 vlen = valuelen;
-- 
2.15.2 (Apple Git-101.1)




More information about the wine-devel mailing list