From: catsout outline941@live.com
--- dlls/win32u/freetype.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/dlls/win32u/freetype.c b/dlls/win32u/freetype.c index fd402758daa..6ac6670fd89 100644 --- a/dlls/win32u/freetype.c +++ b/dlls/win32u/freetype.c @@ -1524,11 +1524,12 @@ static FcPattern *create_family_pattern( const char *name, FcPattern **cached ) return ret; }
-static void fontconfig_add_font( FcPattern *pattern, UINT flags ) +static void fontconfig_add_font( FcPattern *pattern, UINT flags, const char *cache_dir ) { - const char *unix_name, *format; + char *unix_name; + const char *format, *basename; WCHAR *dos_name; - FcBool scalable; + FcBool scalable, reloc; DWORD aa_flags; int face_index;
@@ -1564,9 +1565,23 @@ static void fontconfig_add_font( FcPattern *pattern, UINT flags ) if (pFcPatternGetInteger( pattern, FC_INDEX, 0, &face_index ) != FcResultMatch) face_index = 0;
+ reloc = FcFalse; + if (strncmp( unix_name, cache_dir, strlen(cache_dir) ) != 0 && access( unix_name, F_OK ) != 0) { + basename = strrchr( unix_name, '/' ); + basename = ( basename ? basename+1 : unix_name ); + unix_name = malloc( strlen(cache_dir) + strlen(basename) + 2 ); + if (unix_name) { + sprintf( unix_name, "%s/%s", cache_dir, basename ); + reloc = FcTrue; + } + } + dos_name = get_dos_file_name( unix_name ); add_unix_face( unix_name, dos_name, NULL, 0, face_index, flags, NULL ); free( dos_name ); + + if (reloc == FcTrue) + free( unix_name ); }
static void init_fontconfig(void) @@ -1648,7 +1663,7 @@ static void fontconfig_add_fonts_from_dir_list( FcConfig *config, FcStrList *dir
if (!(font_set = pFcCacheCopySet( cache ))) goto done; for (i = 0; i < font_set->nfont; i++) - fontconfig_add_font( font_set->fonts[i], flags ); + fontconfig_add_font( font_set->fonts[i], flags , (const char *)dir ); pFcFontSetDestroy( font_set ); font_set = NULL;