gdi32: Add a separate backend function to load the font list.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2020-11-03 11:26:12 +01:00
parent fc44dcdd03
commit a84c60ed2a
3 changed files with 29 additions and 24 deletions

View File

@ -3238,13 +3238,22 @@ static void init_font_options(void)
*/
void font_init(void)
{
static const WCHAR mutex_nameW[] = {'_','_','W','I','N','E','_','F','O','N','T','_','M','U','T','E','X','_','_',0};
HANDLE mutex;
if (RegCreateKeyExA( HKEY_CURRENT_USER, "Software\\Wine\\Fonts", 0, NULL, 0,
KEY_ALL_ACCESS, NULL, &wine_fonts_key, NULL ))
return;
init_font_options();
update_codepage();
WineEngInit( &font_funcs );
if (!WineEngInit( &font_funcs )) return;
if (!(mutex = CreateMutexW( NULL, FALSE, mutex_nameW ))) return;
WaitForSingleObject( mutex, INFINITE );
font_funcs->load_fonts();
ReleaseMutex( mutex );
reorder_font_list();
load_gdi_font_subst();
load_gdi_font_replacements();

View File

@ -286,8 +286,6 @@ static struct list mappings_list = LIST_INIT( mappings_list );
static UINT default_aa_flags;
static HKEY hkey_font_cache;
static const WCHAR font_mutex_nameW[] = {'_','_','W','I','N','E','_','F','O','N','T','_','M','U','T','E','X','_','_','\0'};
static BOOL CDECL freetype_set_outline_text_metrics( struct gdi_font *font );
static BOOL CDECL freetype_set_bitmap_text_metrics( struct gdi_font *font );
static void remove_face_from_cache( Face *face );
@ -2168,29 +2166,11 @@ static void init_font_list(void)
}
/*************************************************************
* WineEngInit
*
* Initialize FreeType library and create a list of available faces
* freetype_load_fonts
*/
BOOL WineEngInit( const struct font_backend_funcs **funcs )
static void CDECL freetype_load_fonts(void)
{
DWORD disposition;
HANDLE font_mutex;
if(!init_freetype()) return FALSE;
#ifdef SONAME_LIBFONTCONFIG
init_fontconfig();
#endif
*funcs = &font_funcs;
if((font_mutex = CreateMutexW(NULL, FALSE, font_mutex_nameW)) == NULL)
{
ERR("Failed to create font mutex\n");
return FALSE;
}
WaitForSingleObject(font_mutex, INFINITE);
create_font_cache_key(&hkey_font_cache, &disposition);
@ -2201,8 +2181,22 @@ BOOL WineEngInit( const struct font_backend_funcs **funcs )
if(disposition == REG_CREATED_NEW_KEY)
update_reg_entries();
}
ReleaseMutex(font_mutex);
/*************************************************************
* WineEngInit
*
* Initialize FreeType library and create a list of available faces
*/
BOOL WineEngInit( const struct font_backend_funcs **funcs )
{
if(!init_freetype()) return FALSE;
#ifdef SONAME_LIBFONTCONFIG
init_fontconfig();
#endif
*funcs = &font_funcs;
return TRUE;
}
@ -5020,6 +5014,7 @@ static DWORD CDECL freetype_get_kerning_pairs( struct gdi_font *font, KERNINGPAI
static const struct font_backend_funcs font_funcs =
{
freetype_SelectFont,
freetype_load_fonts,
freetype_add_font,
freetype_add_mem_font,
freetype_remove_font,

View File

@ -427,6 +427,7 @@ struct font_backend_funcs
{
struct gdi_font * (CDECL *pSelectFont)( DC *dc, HFONT hfont );
void (CDECL *load_fonts)(void);
INT (CDECL *add_font)( const WCHAR *file, DWORD flags );
INT (CDECL *add_mem_font)( void *ptr, SIZE_T size, DWORD flags );
BOOL (CDECL *remove_font)( const WCHAR *file, DWORD flags );