Alexandre Julliard : gdi32: Move the loading of registry fonts out of freetype.c.

Alexandre Julliard julliard at winehq.org
Tue Oct 27 16:43:49 CDT 2020


Module: wine
Branch: master
Commit: 2c1a42bc675425f9820f05752a9904268a8a610c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2c1a42bc675425f9820f05752a9904268a8a610c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Oct 27 10:27:20 2020 +0100

gdi32: Move the loading of registry fonts out of freetype.c.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/font.c        | 49 ++++++++++++++++++++++++++++++++++++++++++--
 dlls/gdi32/freetype.c    | 53 +-----------------------------------------------
 dlls/gdi32/gdi_private.h |  3 +--
 3 files changed, 49 insertions(+), 56 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index d4ed29d7fd9..3718d73f871 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -109,6 +109,11 @@ static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
     return pt[1].y - pt[0].y;
 }
 
+static inline BOOL is_win9x(void)
+{
+    return GetVersion() & 0x80000000;
+}
+
 static inline WCHAR *strdupW( const WCHAR *p )
 {
     WCHAR *ret;
@@ -375,7 +380,7 @@ void get_font_dir( WCHAR *path )
     else path[1] = '\\';  /* change \??\ to \\?\ */
 }
 
-void get_fonts_data_dir_path( const WCHAR *file, WCHAR *path )
+static void get_fonts_data_dir_path( const WCHAR *file, WCHAR *path )
 {
     static const WCHAR slashW[] = {'\\',0};
 
@@ -384,7 +389,7 @@ void get_fonts_data_dir_path( const WCHAR *file, WCHAR *path )
     strcatW( path, file );
 }
 
-void get_fonts_win_dir_path( const WCHAR *file, WCHAR *path )
+static void get_fonts_win_dir_path( const WCHAR *file, WCHAR *path )
 {
     static const WCHAR fontsW[] = {'\\','f','o','n','t','s','\\',0};
 
@@ -5397,6 +5402,46 @@ void load_system_bitmap_fonts(void)
     RegCloseKey( hkey );
 }
 
+void load_registry_fonts(void)
+{
+    static const WCHAR dot_fonW[] = {'.','f','o','n',0};
+    static const WCHAR win9x_key[] = {'S','o','f','t','w','a','r','e','\\',
+                                      'M','i','c','r','o','s','o','f','t','\\',
+                                      'W','i','n','d','o','w','s','\\',
+                                      'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+                                      'F','o','n','t','s',0};
+    static const WCHAR winnt_key[] = {'S','o','f','t','w','a','r','e','\\',
+                                      'M','i','c','r','o','s','o','f','t','\\',
+                                      'W','i','n','d','o','w','s',' ','N','T','\\',
+                                      'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+                                      'F','o','n','t','s',0};
+    WCHAR value[MAX_PATH], data[MAX_PATH];
+    DWORD i = 0, type, dlen, vlen;
+    HKEY hkey;
+
+    /* 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
+       will skip these. */
+    if (RegOpenKeyW( HKEY_LOCAL_MACHINE, is_win9x() ? win9x_key : winnt_key, &hkey ))
+        return;
+
+    vlen = ARRAY_SIZE(value);
+    dlen = sizeof(data);
+    while (!RegEnumValueW( hkey, i++, value, &vlen, NULL, &type, (LPBYTE)data, &dlen ))
+    {
+        dlen /= sizeof(WCHAR);
+        if (data[0] && data[1] == ':')
+            add_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
+        else if (dlen >= 6 && !strcmpiW( data + dlen - 5, dot_fonW ))
+            add_system_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
+
+        vlen = ARRAY_SIZE(value);
+        dlen = sizeof(data);
+    }
+    RegCloseKey( hkey );
+}
+
 /***********************************************************************
  *           AddFontResourceExW    (GDI32.@)
  */
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 0a05f6a701c..ee628a08304 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -768,10 +768,6 @@ static char **expand_mac_font(const char *path)
 
 #endif /* HAVE_CARBON_CARBON_H */
 
-static inline BOOL is_win9x(void)
-{
-    return GetVersion() & 0x80000000;
-}
 /* 
    This function builds an FT_Fixed from a double. It fails if the absolute
    value of the float number is greater than 32768.
@@ -3411,10 +3407,8 @@ sym_not_found:
 
 static void init_font_list(void)
 {
-    static const WCHAR dot_fonW[] = {'.','f','o','n','\0'};
     static const WCHAR pathW[] = {'P','a','t','h',0};
     HKEY hkey;
-    DWORD valuelen, datalen, i = 0, type, dlen, vlen;
     WCHAR path[MAX_PATH];
     char *unixname;
 
@@ -3431,52 +3425,7 @@ static void init_font_list(void)
     get_font_dir( path );
     read_font_dir( path, TRUE );
 
-    /* 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
-       will skip these. */
-    if(RegOpenKeyW(HKEY_LOCAL_MACHINE,
-                   is_win9x() ? win9x_font_reg_key : winnt_font_reg_key,
-                   &hkey) == ERROR_SUCCESS)
-    {
-        LPWSTR data, valueW;
-        RegQueryInfoKeyW(hkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                         &valuelen, &datalen, NULL, NULL);
-
-        valuelen++; /* returned value doesn't include room for '\0' */
-        valueW = HeapAlloc(GetProcessHeap(), 0, valuelen * sizeof(WCHAR));
-        data = HeapAlloc(GetProcessHeap(), 0, datalen * sizeof(WCHAR));
-        if (valueW && data)
-        {
-            dlen = datalen * sizeof(WCHAR);
-            vlen = valuelen;
-            while(RegEnumValueW(hkey, i++, valueW, &vlen, NULL, &type, (LPBYTE)data,
-                                &dlen) == ERROR_SUCCESS)
-            {
-                if(data[0] && (data[1] == ':'))
-                {
-                    freetype_add_font( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
-                }
-                else if(dlen / 2 >= 6 && !strcmpiW(data + dlen / 2 - 5, dot_fonW))
-                {
-                    WCHAR pathW[MAX_PATH];
-
-                    get_fonts_win_dir_path( data, pathW );
-                    if (!freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ))
-                    {
-                        get_fonts_data_dir_path( data, pathW );
-                        freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
-                    }
-                }
-                /* reset dlen and vlen */
-                dlen = datalen;
-                vlen = valuelen;
-            }
-        }
-        HeapFree(GetProcessHeap(), 0, data);
-        HeapFree(GetProcessHeap(), 0, valueW);
-        RegCloseKey(hkey);
-    }
+    load_registry_fonts();
 
 #ifdef SONAME_LIBFONTCONFIG
     load_fontconfig_fonts();
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 5c4da5d629d..080f53c1b61 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -390,9 +390,8 @@ struct font_backend_funcs
 };
 
 extern void get_font_dir( WCHAR *path ) DECLSPEC_HIDDEN;
-extern void get_fonts_data_dir_path( const WCHAR *file, WCHAR *path ) DECLSPEC_HIDDEN;
-extern void get_fonts_win_dir_path( const WCHAR *file, WCHAR *path ) DECLSPEC_HIDDEN;
 extern void load_system_bitmap_fonts(void) DECLSPEC_HIDDEN;
+extern void load_registry_fonts(void) DECLSPEC_HIDDEN;
 
 extern struct gdi_font *alloc_gdi_font( const WCHAR *file, void *data_ptr, SIZE_T data_size ) DECLSPEC_HIDDEN;
 extern void free_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list