Alexandre Julliard : gdi32: Add a separate backend function to load the font list.
Alexandre Julliard
julliard at winehq.org
Tue Nov 3 15:55:54 CST 2020
Module: wine
Branch: master
Commit: a84c60ed2ad79cc3cc6e57cfd4989b701e9be5d5
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a84c60ed2ad79cc3cc6e57cfd4989b701e9be5d5
Author: Alexandre Julliard <julliard at 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 at 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 );
More information about the wine-cvs
mailing list