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>
This commit is contained in:
Alexandre Julliard 2020-10-27 10:27:32 +01:00
parent 2c1a42bc67
commit 7b291a094d
3 changed files with 58 additions and 85 deletions

View File

@ -359,36 +359,26 @@ CRITICAL_SECTION font_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
#define WINE_FONT_DIR "fonts" #define WINE_FONT_DIR "fonts"
#endif #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 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}; static const WCHAR winebuilddirW[] = {'W','I','N','E','B','U','I','L','D','D','I','R',0};
if (GetEnvironmentVariableW( winedatadirW, path, MAX_PATH )) if (GetEnvironmentVariableW( winedatadirW, path, MAX_PATH ))
{ {
const char fontdir[] = WINE_FONT_DIR; const char fontdir[] = "\\" WINE_FONT_DIR "\\";
strcatW( path, slashW );
MultiByteToWideChar( CP_ACP, 0, fontdir, -1, path + strlenW(path), MAX_PATH - strlenW(path) ); MultiByteToWideChar( CP_ACP, 0, fontdir, -1, path + strlenW(path), MAX_PATH - strlenW(path) );
} }
else if (GetEnvironmentVariableW( winebuilddirW, path, MAX_PATH )) else if (GetEnvironmentVariableW( winebuilddirW, path, MAX_PATH ))
{ {
strcatW( path, fontsW ); strcatW( path, fontsW );
} }
strcatW( path, file );
if (path[5] == ':') memmove( path, path + 4, (strlenW(path) - 3) * sizeof(WCHAR) ); if (path[5] == ':') memmove( path, path + 4, (strlenW(path) - 3) * sizeof(WCHAR) );
else path[1] = '\\'; /* change \??\ to \\?\ */ 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 void get_fonts_win_dir_path( const WCHAR *file, WCHAR *path )
{ {
static const WCHAR fontsW[] = {'\\','f','o','n','t','s','\\',0}; static const WCHAR fontsW[] = {'\\','f','o','n','t','s','\\',0};
@ -5402,6 +5392,56 @@ void load_system_bitmap_fonts(void)
RegCloseKey( hkey ); 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) void load_registry_fonts(void)
{ {
static const WCHAR dot_fonW[] = {'.','f','o','n',0}; static const WCHAR dot_fonW[] = {'.','f','o','n',0};

View File

@ -329,7 +329,6 @@ static struct list font_list = LIST_INIT(font_list);
static const struct font_backend_funcs font_funcs; 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','\\', 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','\\', 'W','i','n','d','o','w','s','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', '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); list_add_tail(&system_links, &system_font_link->entry);
} }
#ifdef __ANDROID__
static BOOL ReadFontDir(const char *dirname, BOOL external_fonts) static BOOL ReadFontDir(const char *dirname, BOOL external_fonts)
{ {
DIR *dir; DIR *dir;
@ -2585,16 +2585,7 @@ static BOOL ReadFontDir(const char *dirname, BOOL external_fonts)
closedir(dir); closedir(dir);
return TRUE; return TRUE;
} }
#endif
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 );
}
}
#ifdef SONAME_LIBFONTCONFIG #ifdef SONAME_LIBFONTCONFIG
@ -3407,24 +3398,9 @@ sym_not_found:
static void init_font_list(void) 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(); delete_external_font_keys();
load_system_bitmap_fonts(); load_system_bitmap_fonts();
load_file_system_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_registry_fonts(); load_registry_fonts();
#ifdef SONAME_LIBFONTCONFIG #ifdef SONAME_LIBFONTCONFIG
@ -3434,49 +3410,6 @@ static void init_font_list(void)
#elif defined(__ANDROID__) #elif defined(__ANDROID__)
ReadFontDir("/system/fonts", TRUE); ReadFontDir("/system/fonts", TRUE);
#endif #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) static BOOL move_to_front(const WCHAR *name)

View File

@ -389,8 +389,8 @@ struct font_backend_funcs
void (CDECL *destroy_font)( struct gdi_font *font ); 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_system_bitmap_fonts(void) DECLSPEC_HIDDEN;
extern void load_file_system_fonts(void) DECLSPEC_HIDDEN;
extern void load_registry_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 struct gdi_font *alloc_gdi_font( const WCHAR *file, void *data_ptr, SIZE_T data_size ) DECLSPEC_HIDDEN;