[PATCH 6/8] gdi32: Cleanup ReadFontDir and return the number of faces added.

Rémi Bernon rbernon at codeweavers.com
Wed Sep 9 05:22:02 CDT 2020


Rename it to add_faces_from_dir / add_faces_from_unix_dir, as we will
later add fontconfig dir support.

Move add_faces_from_dir below fontconfig functions, so we can use them
later.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/gdi32/freetype.c | 81 +++++++++++++++++++++----------------------
 1 file changed, 39 insertions(+), 42 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index c613171e237..e26526462ba 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -2757,55 +2757,41 @@ skip_internal:
     list_add_tail(&system_links, &system_font_link->entry);
 }
 
-static BOOL ReadFontDir(const char *dirname, BOOL external_fonts)
+static int add_faces_from_unix_dir( const char *unix_name, DWORD flags )
 {
-    DIR *dir;
     struct dirent *dent;
     char path[MAX_PATH];
+    DIR *dir;
+    int ret = 0;
 
-    TRACE("Loading fonts from %s\n", debugstr_a(dirname));
+    TRACE( "Loading fonts from %s\n", debugstr_a(unix_name) );
 
-    dir = opendir(dirname);
-    if(!dir) {
-        WARN("Can't open directory %s\n", debugstr_a(dirname));
-	return FALSE;
+    if (!(dir = opendir( unix_name )))
+    {
+        WARN( "Can't open directory %s\n", debugstr_a(unix_name) );
+        return 0;
     }
-    while((dent = readdir(dir)) != NULL) {
-	struct stat statbuf;
-
-        if(!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
-	    continue;
 
-	TRACE("Found %s in %s\n", debugstr_a(dent->d_name), debugstr_a(dirname));
+    while ((dent = readdir( dir )) != NULL)
+    {
+        struct stat statbuf;
+        if (!strcmp( dent->d_name, "." ) || !strcmp( dent->d_name, ".." )) continue;
 
-	sprintf(path, "%s/%s", dirname, dent->d_name);
+        TRACE( "Found %s in %s\n", debugstr_a(dent->d_name), debugstr_a(unix_name) );
 
-	if(stat(path, &statbuf) == -1)
-	{
-	    WARN("Can't stat %s\n", debugstr_a(path));
-	    continue;
-	}
-	if(S_ISDIR(statbuf.st_mode))
-	    ReadFontDir(path, external_fonts);
-	else
+        sprintf( path, "%s/%s", unix_name, dent->d_name );
+        if (stat( path, &statbuf ) == -1)
         {
-            DWORD addfont_flags = ADDFONT_ADD_TO_CACHE;
-            if(external_fonts) addfont_flags |= ADDFONT_EXTERNAL_FONT;
-            AddFontToList( path, addfont_flags );
+            WARN( "Can't stat %s\n", debugstr_a(path) );
+            continue;
         }
-    }
-    closedir(dir);
-    return TRUE;
-}
 
-static void read_font_dir( const WCHAR *dirname, BOOL external_fonts )
-{
-    char *unixname = wine_get_unix_file_name( dirname );
-    if (unixname)
-    {
-        ReadFontDir( unixname, external_fonts );
-        HeapFree( GetProcessHeap(), 0, unixname );
+        if (S_ISDIR( statbuf.st_mode )) ret += add_faces_from_unix_dir( path, flags );
+        else ret += AddFontToList( path, flags );
     }
+
+    closedir( dir );
+    return ret;
 }
 
 #ifdef SONAME_LIBFONTCONFIG
@@ -3056,6 +3042,17 @@ static void load_mac_fonts(void)
 
 #endif
 
+static int add_faces_from_dir( const WCHAR *dirname, DWORD flags )
+{
+    int ret;
+    char *unix_name = wine_get_unix_file_name( dirname );
+    if (!unix_name) return 0;
+
+    ret = add_faces_from_unix_dir( unix_name, flags );
+    HeapFree( GetProcessHeap(), 0, unix_name );
+    return ret;
+}
+
 static void get_font_dir( WCHAR *path )
 {
     static const WCHAR slashW[] = {'\\',0};
@@ -4197,15 +4194,15 @@ static void init_font_list(void)
     /* load in the fonts from %WINDOWSDIR%\\Fonts first of all */
     GetWindowsDirectoryW(path, ARRAY_SIZE(path));
     strcatW(path, fontsW);
-    read_font_dir( path, FALSE );
+    add_faces_from_dir( path, ADDFONT_ADD_TO_CACHE );
 
     /* load the wine fonts */
     get_font_dir( path );
-    read_font_dir( path, TRUE );
+    add_faces_from_dir( path, ADDFONT_ADD_TO_CACHE | ADDFONT_EXTERNAL_FONT );
 
     /* now look under HKLM\Software\Microsoft\Windows[ NT]\CurrentVersion\Fonts
        for any fonts not installed in %WINDOWSDIR%\Fonts.  They will have their
-       full path as the entry.  Also look for any .fon fonts, since ReadFontDir
+       full path as the entry.  Also look for any .fon fonts, since add_faces_from_unix_dir
        will skip these. */
     if(RegOpenKeyW(HKEY_LOCAL_MACHINE,
                    is_win9x() ? win9x_font_reg_key : winnt_font_reg_key,
@@ -4255,7 +4252,7 @@ static void init_font_list(void)
 #elif defined(HAVE_CARBON_CARBON_H)
     load_mac_fonts();
 #elif defined(__ANDROID__)
-    ReadFontDir("/system/fonts", TRUE);
+    add_faces_from_unix_dir( "/system/fonts", ADDFONT_ADD_TO_CACHE | ADDFONT_EXTERNAL_FONT );
 #endif
 
     /* then look in any directories that we've specified in the config file */
@@ -4287,11 +4284,11 @@ static void init_font_list(void)
                     {
                         strcpy( unixname, home );
                         strcat( unixname, ptr + 1 );
-                        ReadFontDir( unixname, TRUE );
+                        add_faces_from_unix_dir( unixname, ADDFONT_ADD_TO_CACHE | ADDFONT_EXTERNAL_FONT );
                         HeapFree( GetProcessHeap(), 0, unixname );
                     }
                     else
-                        ReadFontDir( ptr, TRUE );
+                        add_faces_from_unix_dir( ptr, ADDFONT_ADD_TO_CACHE | ADDFONT_EXTERNAL_FONT );
                     ptr = next;
                 }
                 HeapFree( GetProcessHeap(), 0, valueA );
-- 
2.28.0




More information about the wine-devel mailing list