diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 6369ffeb7b4..ef552bfc896 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -574,7 +574,7 @@ static struct gdi_font_family *create_family( const WCHAR *name, const WCHAR *se return family; } -void release_family( struct gdi_font_family *family ) +static void release_family( struct gdi_font_family *family ) { if (--family->refcount) return; assert( list_empty( &family->faces )); @@ -754,7 +754,7 @@ static void reorder_font_list(void) default_sans = set_default_family( default_sans_list ); } -void release_face( struct gdi_font_face *face ) +static void release_face( struct gdi_font_face *face ) { if (--face->refcount) return; if (face->family) @@ -770,6 +770,33 @@ void release_face( struct gdi_font_face *face ) HeapFree( GetProcessHeap(), 0, face ); } +static int remove_font( const WCHAR *file, DWORD flags ) +{ + struct gdi_font_family *family, *family_next; + struct gdi_font_face *face, *face_next; + int count = 0; + + EnterCriticalSection( &font_cs ); + LIST_FOR_EACH_ENTRY_SAFE( family, family_next, &font_list, struct gdi_font_family, entry ) + { + family->refcount++; + LIST_FOR_EACH_ENTRY_SAFE( face, face_next, &family->faces, struct gdi_font_face, entry ) + { + if (!face->file) continue; + if (LOWORD(face->flags) != LOWORD(flags)) continue; + if (!strcmpiW( face->file, file )) + { + TRACE( "removing matching face %s refcount %d\n", debugstr_w(face->file), face->refcount ); + release_face( face ); + count++; + } + } + release_family( family ); + } + LeaveCriticalSection( &font_cs ); + return count; +} + static inline BOOL faces_equal( const struct gdi_font_face *f1, const struct gdi_font_face *f2 ) { if (strcmpiW( f1->full_name, f2->full_name )) return FALSE; @@ -7351,15 +7378,10 @@ static BOOL remove_system_font_resource( LPCWSTR file, DWORD flags ) int ret; get_fonts_win_dir_path( file, path ); - EnterCriticalSection( &font_cs ); - ret = font_funcs->remove_font( path, flags ); - LeaveCriticalSection( &font_cs ); - if (!ret) + if (!(ret = remove_font( path, flags ))) { get_fonts_data_dir_path( file, path ); - EnterCriticalSection( &font_cs ); - ret = font_funcs->remove_font( path, flags ); - LeaveCriticalSection( &font_cs ); + ret = remove_font( path, flags ); } return ret; } @@ -7395,9 +7417,7 @@ static BOOL remove_font_resource( LPCWSTR file, DWORD flags ) DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE; if (!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE; - EnterCriticalSection( &font_cs ); - ret = font_funcs->remove_font( path, addfont_flags ); - LeaveCriticalSection( &font_cs ); + ret = remove_font( path, addfont_flags ); } if (!ret && !strchrW( file, '\\' )) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 755f1286eda..83fe76115ef 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -1178,34 +1178,6 @@ static INT CDECL freetype_add_mem_font( void *ptr, SIZE_T size, DWORD flags ) return AddFontToList( NULL, NULL, ptr, size, flags ); } -/************************************************************* - * freetype_remove_font - */ -static INT CDECL freetype_remove_font( const WCHAR *file, DWORD flags ) -{ - Family *family, *family_next; - Face *face, *face_next; - int count = 0; - - LIST_FOR_EACH_ENTRY_SAFE( family, family_next, &font_list, Family, entry ) - { - family->refcount++; - LIST_FOR_EACH_ENTRY_SAFE( face, face_next, &family->faces, Face, entry ) - { - if (!face->file) continue; - if (LOWORD(face->flags) != LOWORD(flags)) continue; - if (!strcmpiW( face->file, file )) - { - TRACE( "removing matching face %s refcount %d\n", debugstr_w(face->file), face->refcount ); - release_face( face ); - count++; - } - } - release_family( family ); - } - return count; -} - #ifdef __ANDROID__ static BOOL ReadFontDir(const char *dirname, BOOL external_fonts) { @@ -4431,7 +4403,6 @@ static const struct font_backend_funcs font_funcs = freetype_load_fonts, freetype_add_font, freetype_add_mem_font, - freetype_remove_font, freetype_load_font, freetype_get_font_data, freetype_get_aa_flags, diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 1afbddf603a..7147d8ebc41 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -430,7 +430,6 @@ struct font_backend_funcs 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 ); BOOL (CDECL *load_font)( struct gdi_font *gdi_font ); DWORD (CDECL *get_font_data)( struct gdi_font *gdi_font, DWORD table, DWORD offset, @@ -452,9 +451,7 @@ struct font_backend_funcs extern const WCHAR *get_gdi_font_subst( const WCHAR *from_name, int from_charset, int *to_charset ) DECLSPEC_HIDDEN; extern struct list font_list DECLSPEC_HIDDEN; -extern void release_family( struct gdi_font_family *family ) DECLSPEC_HIDDEN; extern struct gdi_font_family *find_family_from_any_name( const WCHAR *name ) DECLSPEC_HIDDEN; -extern void release_face( struct gdi_font_face *face ) DECLSPEC_HIDDEN; extern int add_gdi_face( const WCHAR *family_name, const WCHAR *second_name, const WCHAR *style, const WCHAR *fullname, const WCHAR *file, void *data_ptr, SIZE_T data_size, UINT index, FONTSIGNATURE fs,