Module: wine Branch: master Commit: 7b291a094d20e315d44ae88a09529581556fd9d6 URL: https://source.winehq.org/git/wine.git/?a=commit;h=7b291a094d20e315d44ae88a0...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Oct 27 10:27:32 2020 +0100
gdi32: Move the loading of filesystem fonts out of freetype.c.
The fonts Path value now expects DOS paths.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdi32/font.c | 68 ++++++++++++++++++++++++++++++++++---------- dlls/gdi32/freetype.c | 73 ++---------------------------------------------- dlls/gdi32/gdi_private.h | 2 +- 3 files changed, 58 insertions(+), 85 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 3718d73f871..4e1c69d886e 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -359,36 +359,26 @@ CRITICAL_SECTION font_cs = { &critsect_debug, -1, 0, 0, 0, 0 }; #define WINE_FONT_DIR "fonts" #endif
-void get_font_dir( WCHAR *path ) +static void get_fonts_data_dir_path( const WCHAR *file, WCHAR *path ) { - static const WCHAR slashW[] = {'\',0}; - static const WCHAR fontsW[] = {'\','f','o','n','t','s',0}; + static const WCHAR fontsW[] = {'\','f','o','n','t','s','\',0}; static const WCHAR winedatadirW[] = {'W','I','N','E','D','A','T','A','D','I','R',0}; static const WCHAR winebuilddirW[] = {'W','I','N','E','B','U','I','L','D','D','I','R',0};
if (GetEnvironmentVariableW( winedatadirW, path, MAX_PATH )) { - const char fontdir[] = WINE_FONT_DIR; - strcatW( path, slashW ); + const char fontdir[] = "\" WINE_FONT_DIR "\"; MultiByteToWideChar( CP_ACP, 0, fontdir, -1, path + strlenW(path), MAX_PATH - strlenW(path) ); } else if (GetEnvironmentVariableW( winebuilddirW, path, MAX_PATH )) { strcatW( path, fontsW ); } + strcatW( path, file ); if (path[5] == ':') memmove( path, path + 4, (strlenW(path) - 3) * sizeof(WCHAR) ); else path[1] = '\'; /* change ??\ to \?\ */ }
-static void get_fonts_data_dir_path( const WCHAR *file, WCHAR *path ) -{ - static const WCHAR slashW[] = {'\',0}; - - get_font_dir( path ); - strcatW( path, slashW ); - strcatW( path, file ); -} - static void get_fonts_win_dir_path( const WCHAR *file, WCHAR *path ) { static const WCHAR fontsW[] = {'\','f','o','n','t','s','\',0}; @@ -5402,6 +5392,56 @@ void load_system_bitmap_fonts(void) RegCloseKey( hkey ); }
+static void load_directory_fonts( WCHAR *path, UINT flags ) +{ + HANDLE handle; + WIN32_FIND_DATAW data; + WCHAR *p; + + p = path + strlenW(path) - 1; + TRACE( "loading fonts from %s\n", debugstr_w(path) ); + handle = FindFirstFileW( path, &data ); + if (handle == INVALID_HANDLE_VALUE) return; + do + { + if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; + strcpyW( p, data.cFileName ); + font_funcs->add_font( path, flags ); + } while (FindNextFileW( handle, &data )); + FindClose( handle ); +} + +void load_file_system_fonts(void) +{ + static const WCHAR pathW[] = {'P','a','t','h',0}; + static const WCHAR slashstarW[] = {'\','*',0}; + static const WCHAR starW[] = {'*',0}; + WCHAR *ptr, *next, path[MAX_PATH], value[1024]; + DWORD len = ARRAY_SIZE(value); + + /* Windows directory */ + get_fonts_win_dir_path( starW, path ); + load_directory_fonts( path, ADDFONT_ADD_TO_CACHE ); + + /* Wine data directory */ + get_fonts_data_dir_path( starW, path ); + load_directory_fonts( path, ADDFONT_ADD_TO_CACHE | ADDFONT_EXTERNAL_FONT ); + + /* custom paths */ + /* @@ Wine registry key: HKCU\Software\Wine\Fonts */ + if (!RegQueryValueExW( wine_fonts_key, pathW, NULL, NULL, (BYTE *)value, &len )) + { + for (ptr = value; ptr; ptr = next) + { + if ((next = strchrW( ptr, ';' ))) *next++ = 0; + if (next && next - ptr < 2) continue; + lstrcpynW( path, ptr, MAX_PATH - 2 ); + strcatW( path, slashstarW ); + load_directory_fonts( path, ADDFONT_ADD_TO_CACHE | ADDFONT_EXTERNAL_FONT ); + } + } +} + void load_registry_fonts(void) { static const WCHAR dot_fonW[] = {'.','f','o','n',0}; diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index ee628a08304..0a5f5af491b 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -329,7 +329,6 @@ static struct list font_list = LIST_INIT(font_list);
static const struct font_backend_funcs font_funcs;
-static const WCHAR fontsW[] = {'\','f','o','n','t','s','\0'}; static const WCHAR win9x_font_reg_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','\', @@ -2545,6 +2544,7 @@ skip_internal: list_add_tail(&system_links, &system_font_link->entry); }
+#ifdef __ANDROID__ static BOOL ReadFontDir(const char *dirname, BOOL external_fonts) { DIR *dir; @@ -2585,16 +2585,7 @@ static BOOL ReadFontDir(const char *dirname, BOOL external_fonts) 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 ); - } -} +#endif
#ifdef SONAME_LIBFONTCONFIG
@@ -3407,24 +3398,9 @@ sym_not_found:
static void init_font_list(void) { - static const WCHAR pathW[] = {'P','a','t','h',0}; - HKEY hkey; - WCHAR path[MAX_PATH]; - char *unixname; - delete_external_font_keys(); - load_system_bitmap_fonts(); - - /* load in the fonts from %WINDOWSDIR%\Fonts first of all */ - GetWindowsDirectoryW(path, ARRAY_SIZE(path)); - strcatW(path, fontsW); - read_font_dir( path, FALSE ); - - /* load the wine fonts */ - get_font_dir( path ); - read_font_dir( path, TRUE ); - + load_file_system_fonts(); load_registry_fonts();
#ifdef SONAME_LIBFONTCONFIG @@ -3434,49 +3410,6 @@ static void init_font_list(void) #elif defined(__ANDROID__) ReadFontDir("/system/fonts", TRUE); #endif - - /* then look in any directories that we've specified in the config file */ - /* @@ Wine registry key: HKCU\Software\Wine\Fonts */ - if(RegOpenKeyA(HKEY_CURRENT_USER, "Software\Wine\Fonts", &hkey) == ERROR_SUCCESS) - { - DWORD len; - LPWSTR valueW; - LPSTR valueA, ptr; - - if (RegQueryValueExW( hkey, pathW, NULL, NULL, NULL, &len ) == ERROR_SUCCESS) - { - len += sizeof(WCHAR); - valueW = HeapAlloc( GetProcessHeap(), 0, len ); - if (RegQueryValueExW( hkey, pathW, NULL, NULL, (LPBYTE)valueW, &len ) == ERROR_SUCCESS) - { - len = WideCharToMultiByte( CP_UNIXCP, 0, valueW, -1, NULL, 0, NULL, NULL ); - valueA = HeapAlloc( GetProcessHeap(), 0, len ); - WideCharToMultiByte( CP_UNIXCP, 0, valueW, -1, valueA, len, NULL, NULL ); - TRACE( "got font path %s\n", debugstr_a(valueA) ); - ptr = valueA; - while (ptr) - { - const char* home; - LPSTR next = strchr( ptr, ':' ); - if (next) *next++ = 0; - if (ptr[0] == '~' && ptr[1] == '/' && (home = getenv( "HOME" )) && - (unixname = HeapAlloc( GetProcessHeap(), 0, strlen(ptr) + strlen(home) ))) - { - strcpy( unixname, home ); - strcat( unixname, ptr + 1 ); - ReadFontDir( unixname, TRUE ); - HeapFree( GetProcessHeap(), 0, unixname ); - } - else - ReadFontDir( ptr, TRUE ); - ptr = next; - } - HeapFree( GetProcessHeap(), 0, valueA ); - } - HeapFree( GetProcessHeap(), 0, valueW ); - } - RegCloseKey(hkey); - } }
static BOOL move_to_front(const WCHAR *name) diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 080f53c1b61..aa6e6ddcaa9 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -389,8 +389,8 @@ struct font_backend_funcs void (CDECL *destroy_font)( struct gdi_font *font ); };
-extern void get_font_dir( WCHAR *path ) DECLSPEC_HIDDEN; extern void load_system_bitmap_fonts(void) DECLSPEC_HIDDEN; +extern void load_file_system_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;