Module: wine Branch: master Commit: a84c60ed2ad79cc3cc6e57cfd4989b701e9be5d5 URL: https://source.winehq.org/git/wine.git/?a=commit;h=a84c60ed2ad79cc3cc6e57cfd...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Nov 3 11:26:12 2020 +0100
gdi32: Add a separate backend function to load the font list.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdi32/font.c | 11 ++++++++++- dlls/gdi32/freetype.c | 41 ++++++++++++++++++----------------------- dlls/gdi32/gdi_private.h | 1 + 3 files changed, 29 insertions(+), 24 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 26f183e4864..7bb0f513ca7 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -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(); diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 50df968226b..dea032b7185 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -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(); +} + +/************************************************************* + * 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
- ReleaseMutex(font_mutex); + *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, diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 4350be34851..f77ed4ec345 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -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 );