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:
parent
2c1a42bc67
commit
7b291a094d
|
@ -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};
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue