Module: wine Branch: master Commit: ab0ad4f5d81511b66728bd32e7d429550cb28e5a URL: http://source.winehq.org/git/wine.git/?a=commit;h=ab0ad4f5d81511b66728bd32e7...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jan 14 17:28:25 2013 +0100
gdi32: Add helper functions to compute font paths for AddFontResource.
---
dlls/gdi32/freetype.c | 57 +++++++++++++++++++++++++------------------------ 1 files changed, 29 insertions(+), 28 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 22080b1..5a79b35 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -2614,27 +2614,33 @@ static void load_mac_fonts(void)
#endif
-static BOOL load_font_from_data_dir(LPCWSTR file) +static char *get_data_dir_path( LPCWSTR file ) { - BOOL ret = FALSE; + char *unix_name = NULL; const char *data_dir = wine_get_data_dir();
if (!data_dir) data_dir = wine_get_build_dir();
if (data_dir) { - INT len; - char *unix_name; - - len = WideCharToMultiByte(CP_UNIXCP, 0, file, -1, NULL, 0, NULL, NULL); + INT len = WideCharToMultiByte(CP_UNIXCP, 0, file, -1, NULL, 0, NULL, NULL);
unix_name = HeapAlloc(GetProcessHeap(), 0, strlen(data_dir) + len + sizeof("/fonts/")); - strcpy(unix_name, data_dir); strcat(unix_name, "/fonts/");
WideCharToMultiByte(CP_UNIXCP, 0, file, -1, unix_name + strlen(unix_name), len, NULL, NULL); + } + return unix_name; +}
+static BOOL load_font_from_data_dir(LPCWSTR file) +{ + BOOL ret = FALSE; + char *unix_name = get_data_dir_path( file ); + + if (unix_name) + { EnterCriticalSection( &freetype_cs ); ret = AddFontToList(unix_name, NULL, 0, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE); LeaveCriticalSection( &freetype_cs ); @@ -2643,24 +2649,16 @@ static BOOL load_font_from_data_dir(LPCWSTR file) return ret; }
-static BOOL load_font_from_winfonts_dir(LPCWSTR file) +static char *get_winfonts_dir_path(LPCWSTR file) { static const WCHAR slashW[] = {'\','\0'}; - BOOL ret = FALSE; WCHAR windowsdir[MAX_PATH]; - char *unixname;
GetWindowsDirectoryW(windowsdir, sizeof(windowsdir) / sizeof(WCHAR)); strcatW(windowsdir, fontsW); strcatW(windowsdir, slashW); strcatW(windowsdir, file); - if ((unixname = wine_get_unix_file_name(windowsdir))) { - EnterCriticalSection( &freetype_cs ); - ret = AddFontToList(unixname, NULL, 0, ADDFONT_ALLOW_BITMAP); - LeaveCriticalSection( &freetype_cs ); - HeapFree(GetProcessHeap(), 0, unixname); - } - return ret; + return wine_get_unix_file_name( windowsdir ); }
static void load_system_fonts(void) @@ -2846,31 +2844,34 @@ INT WineEngAddFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv) { char *unixname;
- if(flags) - FIXME("Ignoring flags %x\n", flags); + EnterCriticalSection( &freetype_cs );
if((unixname = wine_get_unix_file_name(file))) { DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE;
if(!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE; - EnterCriticalSection( &freetype_cs ); ret = AddFontToList(unixname, NULL, 0, addfont_flags); - LeaveCriticalSection( &freetype_cs ); HeapFree(GetProcessHeap(), 0, unixname); } if (!ret && !strchrW(file, '\')) { /* Try in %WINDIR%/fonts, needed for Fotobuch Designer */ - ret = load_font_from_winfonts_dir(file); - if (!ret) { - /* Try in datadir/fonts (or builddir/fonts), - * needed for Magic the Gathering Online - */ - ret = load_font_from_data_dir(file); + if ((unixname = get_winfonts_dir_path( file ))) + { + ret = AddFontToList(unixname, NULL, 0, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE); + HeapFree(GetProcessHeap(), 0, unixname); + } + /* Try in datadir/fonts (or builddir/fonts), needed for Magic the Gathering Online */ + if (!ret && (unixname = get_data_dir_path( file ))) + { + ret = AddFontToList(unixname, NULL, 0, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE); + HeapFree(GetProcessHeap(), 0, unixname); } } + + LeaveCriticalSection( &freetype_cs ); } - return ret; + return ret; }
/*************************************************************