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..ac66e2482d9 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;