Module: wine Branch: master Commit: 2c1a42bc675425f9820f05752a9904268a8a610c URL: https://source.winehq.org/git/wine.git/?a=commit;h=2c1a42bc675425f9820f05752...
Author: Alexandre Julliard julliard@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@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;