diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 2331c7cf784..2e926fa52fc 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -5293,21 +5293,99 @@ fail: return name; } +static int add_system_font_resource( const WCHAR *file, DWORD flags ) +{ + WCHAR path[MAX_PATH]; + int ret; + + /* try in %WINDIR%/fonts, needed for Fotobuch Designer */ + get_fonts_win_dir_path( file, path ); + EnterCriticalSection( &font_cs ); + ret = font_funcs->add_font( path, flags ); + LeaveCriticalSection( &font_cs ); + /* try in datadir/fonts (or builddir/fonts), needed for Magic the Gathering Online */ + if (!ret) + { + get_fonts_data_dir_path( file, path ); + EnterCriticalSection( &font_cs ); + ret = font_funcs->add_font( path, flags ); + LeaveCriticalSection( &font_cs ); + } + return ret; +} + +static BOOL remove_system_font_resource( LPCWSTR file, DWORD flags ) +{ + WCHAR path[MAX_PATH]; + int ret; + + get_fonts_win_dir_path( file, path ); + EnterCriticalSection( &font_cs ); + ret = font_funcs->remove_font( path, flags ); + LeaveCriticalSection( &font_cs ); + if (!ret) + { + get_fonts_data_dir_path( file, path ); + EnterCriticalSection( &font_cs ); + ret = font_funcs->remove_font( path, flags ); + LeaveCriticalSection( &font_cs ); + } + return ret; +} + +static int add_font_resource( LPCWSTR file, DWORD flags ) +{ + WCHAR path[MAX_PATH]; + int ret = 0; + + if (GetFullPathNameW( file, MAX_PATH, path, NULL )) + { + 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->add_font( path, addfont_flags ); + LeaveCriticalSection( &font_cs ); + } + + if (!ret && !strchrW( file, '\\' )) + ret = add_system_font_resource( file, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); + + return ret; +} + +static BOOL remove_font_resource( LPCWSTR file, DWORD flags ) +{ + WCHAR path[MAX_PATH]; + BOOL ret = FALSE; + + if (GetFullPathNameW( file, MAX_PATH, path, NULL )) + { + 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 ); + } + + if (!ret && !strchrW( file, '\\' )) + ret = remove_system_font_resource( file, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); + + return ret; +} + /*********************************************************************** * AddFontResourceExW (GDI32.@) */ -INT WINAPI AddFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv ) +INT WINAPI AddFontResourceExW( LPCWSTR str, DWORD flags, PVOID pdv ) { int ret; WCHAR *filename; BOOL hidden; if (!font_funcs) return 1; - EnterCriticalSection( &font_cs ); - ret = font_funcs->pAddFontResourceEx( str, fl, pdv ); - LeaveCriticalSection( &font_cs ); - - if (!ret) + if (!(ret = add_font_resource( str, flags ))) { /* FreeType <2.3.5 has problems reading resources wrapped in PE files. */ HMODULE hModule = LoadLibraryExW(str, NULL, LOAD_LIBRARY_AS_DATAFILE); @@ -5324,10 +5402,8 @@ INT WINAPI AddFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv ) } else if ((filename = get_scalable_filename( str, &hidden )) != NULL) { - if (hidden) fl |= FR_PRIVATE | FR_NOT_ENUM; - EnterCriticalSection( &font_cs ); - ret = font_funcs->pAddFontResourceEx( filename, fl, pdv ); - LeaveCriticalSection( &font_cs ); + if (hidden) flags |= FR_PRIVATE | FR_NOT_ENUM; + ret = add_font_resource( filename, flags ); HeapFree( GetProcessHeap(), 0, filename ); } } @@ -5411,7 +5487,7 @@ BOOL WINAPI RemoveFontResourceExA( LPCSTR str, DWORD fl, PVOID pdv ) /*********************************************************************** * RemoveFontResourceExW (GDI32.@) */ -BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv ) +BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD flags, PVOID pdv ) { int ret; WCHAR *filename; @@ -5419,11 +5495,7 @@ BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv ) if (!font_funcs) return TRUE; - EnterCriticalSection( &font_cs ); - ret = font_funcs->pRemoveFontResourceEx( str, fl, pdv ); - LeaveCriticalSection( &font_cs ); - - if (!ret) + if (!(ret = remove_font_resource( str, flags ))) { /* FreeType <2.3.5 has problems reading resources wrapped in PE files. */ HMODULE hModule = LoadLibraryExW(str, NULL, LOAD_LIBRARY_AS_DATAFILE); @@ -5434,10 +5506,8 @@ BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv ) } else if ((filename = get_scalable_filename( str, &hidden )) != NULL) { - if (hidden) fl |= FR_PRIVATE | FR_NOT_ENUM; - EnterCriticalSection( &font_cs ); - ret = font_funcs->pRemoveFontResourceEx( filename, fl, pdv ); - LeaveCriticalSection( &font_cs ); + if (hidden) flags |= FR_PRIVATE | FR_NOT_ENUM; + ret = remove_font_resource( filename, flags ); HeapFree( GetProcessHeap(), 0, filename ); } } diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 7129acfeb5c..286af040355 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -272,13 +272,6 @@ typedef struct tagFace { #define FS_DBCS_MASK (FS_JISJAPAN|FS_CHINESESIMP|FS_WANSUNG|FS_CHINESETRAD|FS_JOHAB) -#define ADDFONT_EXTERNAL_FONT 0x01 -#define ADDFONT_ALLOW_BITMAP 0x02 -#define ADDFONT_ADD_TO_CACHE 0x04 -#define ADDFONT_ADD_RESOURCE 0x08 /* added through AddFontResource */ -#define ADDFONT_VERTICAL_FONT 0x10 -#define ADDFONT_AA_FLAGS(flags) ((flags) << 16) - typedef struct tagFamily { struct list entry; unsigned int refcount; @@ -2098,7 +2091,10 @@ static INT AddFontToList(const WCHAR *dos_name, const char *unix_name, void *fon return ret; } -static int add_font_resource( const WCHAR *file, DWORD flags ) +/************************************************************* + * freetype_add_font + */ +static INT CDECL freetype_add_font( const WCHAR *file, DWORD flags ) { int ret = 0; char *unixname = wine_get_unix_file_name( file ); @@ -2111,7 +2107,10 @@ static int add_font_resource( const WCHAR *file, DWORD flags ) return ret; } -static int remove_font_resource( const WCHAR *file, DWORD flags ) +/************************************************************* + * freetype_remove_font + */ +static INT CDECL freetype_remove_font( const WCHAR *file, DWORD flags ) { Family *family, *family_next; Face *face, *face_next; @@ -2867,10 +2866,10 @@ static void load_system_fonts(void) if(RegQueryValueExW(hkey, *value, 0, &type, (void*)data, &dlen) == ERROR_SUCCESS && type == REG_SZ) { get_fonts_win_dir_path( data, pathW ); - if (!add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE )) + if (!freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE )) { get_fonts_data_dir_path( data, pathW ); - add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ); + freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ); } } } @@ -3050,34 +3049,6 @@ static void delete_external_font_keys(void) if(winnt_key) RegCloseKey(winnt_key); } -/************************************************************* - * freetype_AddFontResourceEx - * - */ -static INT CDECL freetype_AddFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv) -{ - WCHAR path[MAX_PATH]; - INT ret = 0; - DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE; - - if (!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE; - if (GetFullPathNameW( file, MAX_PATH, path, NULL )) - ret = add_font_resource( path, addfont_flags ); - - if (!ret && !strchrW(file, '\\')) { - /* Try in %WINDIR%/fonts, needed for Fotobuch Designer */ - get_fonts_win_dir_path( file, path ); - ret = add_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); - /* Try in datadir/fonts (or builddir/fonts), needed for Magic the Gathering Online */ - if (!ret) - { - get_fonts_data_dir_path( file, path ); - ret = add_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); - } - } - return ret; -} - /************************************************************* * freetype_AddFontMemResourceEx * @@ -3103,33 +3074,6 @@ static HANDLE CDECL freetype_AddFontMemResourceEx(PVOID pbFont, DWORD cbFont, PV return (HANDLE)(((INT_PTR)pFontCopy)^0x87654321); } -/************************************************************* - * freetype_RemoveFontResourceEx - * - */ -static BOOL CDECL freetype_RemoveFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv) -{ - WCHAR path[MAX_PATH]; - INT ret = 0; - DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE; - - if(!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE; - if (GetFullPathNameW( file, MAX_PATH, path, NULL )) - ret = remove_font_resource( path, addfont_flags ); - - if (!ret && !strchrW(file, '\\')) - { - get_fonts_win_dir_path( file, path ); - ret = remove_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); - if (!ret) - { - get_fonts_data_dir_path( file, path ); - ret = remove_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); - } - } - return ret; -} - static WCHAR *get_ttf_file_name( LPCWSTR font_file, LPCWSTR font_path ) { WCHAR *fullname; @@ -3565,17 +3509,17 @@ static void init_font_list(void) { if(data[0] && (data[1] == ':')) { - add_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE); + freetype_add_font( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE); } else if(dlen / 2 >= 6 && !strcmpiW(data + dlen / 2 - 5, dot_fonW)) { WCHAR pathW[MAX_PATH]; get_fonts_win_dir_path( data, pathW ); - if (!add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE )) + if (!freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE )) { get_fonts_data_dir_path( data, pathW ); - add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ); + freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ); } } /* reset dlen and vlen */ @@ -7533,10 +7477,10 @@ static const struct font_backend_funcs font_funcs = freetype_GetCharWidthInfo, freetype_GetFontUnicodeRanges, freetype_SelectFont, - freetype_AddFontResourceEx, - freetype_RemoveFontResourceEx, freetype_AddFontMemResourceEx, freetype_CreateScalableFontResource, + freetype_add_font, + freetype_remove_font, freetype_alloc_font, freetype_get_font_data, freetype_get_glyph_index, diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index d7680464b6a..4fd59cfd9bc 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -355,6 +355,13 @@ struct gdi_font #define MS_TTCF_TAG MS_MAKE_TAG('t', 't', 'c', 'f') #define MS_VDMX_TAG MS_MAKE_TAG('V', 'D', 'M', 'X') +#define ADDFONT_EXTERNAL_FONT 0x01 +#define ADDFONT_ALLOW_BITMAP 0x02 +#define ADDFONT_ADD_TO_CACHE 0x04 +#define ADDFONT_ADD_RESOURCE 0x08 /* added through AddFontResource */ +#define ADDFONT_VERTICAL_FONT 0x10 +#define ADDFONT_AA_FLAGS(flags) ((flags) << 16) + struct font_backend_funcs { BOOL (CDECL *pEnumFonts)( LOGFONTW *lf, FONTENUMPROCW proc, LPARAM lparam ); @@ -363,11 +370,11 @@ struct font_backend_funcs DWORD (CDECL *pGetFontUnicodeRanges)( struct gdi_font *font, GLYPHSET *glyphset ); struct gdi_font * (CDECL *pSelectFont)( DC *dc, HFONT hfont, UINT *aa_flags, UINT default_aa_flags ); - INT (CDECL *pAddFontResourceEx)( LPCWSTR file, DWORD flags, PVOID pdv ); - INT (CDECL *pRemoveFontResourceEx)( LPCWSTR file, DWORD flags, PVOID pdv ); HANDLE (CDECL *pAddFontMemResourceEx)( void *font, DWORD size, PVOID pdv, DWORD *count ); BOOL (CDECL *pCreateScalableFontResource)( DWORD hidden, LPCWSTR resource, LPCWSTR font_file, LPCWSTR font_path ); + INT (CDECL *add_font)( const WCHAR *file, DWORD flags ); + BOOL (CDECL *remove_font)( const WCHAR *file, DWORD flags ); BOOL (CDECL *alloc_font)( struct gdi_font *font ); DWORD (CDECL *get_font_data)( struct gdi_font *gdi_font, DWORD table, DWORD offset,