From 6e12807b5520dde50ec22d00aa25e7ef607f6d71 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Sun, 9 Nov 2003 00:30:13 +0000 Subject: [PATCH] Load any TrueType fonts that fontconfig knows about. --- configure | 67 +++++++++++++++++++++++++++++++++++ configure.ac | 2 ++ dlls/gdi/freetype.c | 85 +++++++++++++++++++++++++++++++++++++++++++-- include/config.h.in | 6 ++++ 4 files changed, 158 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 15826af1f7c..a3409bab632 100755 --- a/configure +++ b/configure @@ -13086,6 +13086,71 @@ cat >>confdefs.h <<_ACEOF _ACEOF fi +echo "$as_me:$LINENO: checking for -lfontconfig soname" >&5 +echo $ECHO_N "checking for -lfontconfig soname... $ECHO_C" >&6 +if test "${ac_cv_lib_soname_fontconfig+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_get_soname_save_LIBS=$LIBS +LIBS="-lfontconfig $LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char FcInit (); +int +main () +{ +FcInit (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_soname_fontconfig=`$ac_cv_path_LDD conftest$ac_exeext | grep libfontconfig\\.so | sed 's/^.*\(libfontconfig\.so[^ ]*\).*$/\1/'` + if test "x$ac_cv_lib_soname_fontconfig" = "x" + then + ac_cv_lib_soname_fontconfig="libfontconfig.so" + fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_soname_fontconfig="libfontconfig.so" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_get_soname_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_soname_fontconfig" >&5 +echo "${ECHO_T}$ac_cv_lib_soname_fontconfig" >&6 +if test "x$ac_cv_lib_soname_fontconfig" != xNONE +then +cat >>confdefs.h <<_ACEOF +#define SONAME_LIBFONTCONFIG "$ac_cv_lib_soname_fontconfig" +_ACEOF +fi; + echo "$as_me:$LINENO: checking for -lssl soname" >&5 echo $ECHO_N "checking for -lssl soname... $ECHO_C" >&6 if test "${ac_cv_lib_soname_ssl+set}" = set; then @@ -13937,6 +14002,7 @@ done + for ac_header in \ @@ -13946,6 +14012,7 @@ for ac_header in \ direct.h \ elf.h \ float.h \ + fontconfig/fontconfig.h \ getopt.h \ ieeefp.h \ io.h \ diff --git a/configure.ac b/configure.ac index fc719be7ee0..1a7dd69643b 100644 --- a/configure.ac +++ b/configure.ac @@ -935,6 +935,7 @@ then WINE_GET_SONAME(GL,glXQueryExtension,[$X_LIBS $X_EXTRA_LIBS]) WINE_GET_SONAME(cups,cupsGetDefault) WINE_GET_SONAME(jack,jack_client_new) + WINE_GET_SONAME(fontconfig, FcInit); WINE_GET_SONAME(ssl,SSL_library_init) WINE_GET_SONAME(crypto,BIO_new_socket) WINE_GET_SONAME(ncurses,waddch) @@ -1008,6 +1009,7 @@ AC_CHECK_HEADERS(\ direct.h \ elf.h \ float.h \ + fontconfig/fontconfig.h \ getopt.h \ ieeefp.h \ io.h \ diff --git a/dlls/gdi/freetype.c b/dlls/gdi/freetype.c index 3fc4ba59825..a72e67e2f2a 100644 --- a/dlls/gdi/freetype.c +++ b/dlls/gdi/freetype.c @@ -105,10 +105,29 @@ MAKE_FUNCPTR(FT_Outline_Translate); MAKE_FUNCPTR(FT_Select_Charmap); MAKE_FUNCPTR(FT_Set_Pixel_Sizes); MAKE_FUNCPTR(FT_Vector_Transform); -#undef MAKE_FUNCPTR static void (*pFT_Library_Version)(FT_Library,FT_Int*,FT_Int*,FT_Int*); static FT_Error (*pFT_Load_Sfnt_Table)(FT_Face,FT_ULong,FT_Long,FT_Byte*,FT_ULong*); +#ifdef HAVE_FONTCONFIG_FONTCONFIG_H +#include +MAKE_FUNCPTR(FcConfigGetCurrent); +MAKE_FUNCPTR(FcFontList); +MAKE_FUNCPTR(FcFontSetDestroy); +MAKE_FUNCPTR(FcInit); +MAKE_FUNCPTR(FcObjectSetAdd); +MAKE_FUNCPTR(FcObjectSetCreate); +MAKE_FUNCPTR(FcObjectSetDestroy); +MAKE_FUNCPTR(FcPatternCreate); +MAKE_FUNCPTR(FcPatternDestroy); +MAKE_FUNCPTR(FcPatternGet); +#ifndef SONAME_LIBFONTCONFIG +#define SONAME_LIBFONTCONFIG "libfontconfig.so" +#endif +#endif + +#undef MAKE_FUNCPTR + + #define GET_BE_WORD(ptr) MAKEWORD( ((BYTE *)(ptr))[1], ((BYTE *)(ptr))[0] ) typedef struct tagFace { @@ -248,7 +267,7 @@ static inline FT_Fixed FT_FixedFromFIXED(FIXED f) return (FT_Fixed)((long)f.value << 16 | (unsigned long)f.fract); } -static BOOL AddFontFileToList(char *file, char *fake_family) +static BOOL AddFontFileToList(const char *file, char *fake_family) { FT_Face ft_face; TT_OS2 *pOS2; @@ -622,6 +641,67 @@ static BOOL ReadFontDir(char *dirname) return TRUE; } +static void load_fontconfig_fonts(void) +{ +#ifdef HAVE_FONTCONFIG_FONTCONFIG_H + void *fc_handle = NULL; + FcConfig *config; + FcPattern *pat; + FcObjectSet *os; + FcFontSet *fontset; + FcValue v; + int i, len; + const char *ext; + + fc_handle = wine_dlopen(SONAME_LIBFONTCONFIG, RTLD_NOW, NULL, 0); + if(!fc_handle) { + TRACE("Wine cannot find the fontconfig library (%s).\n", + SONAME_LIBFONTCONFIG); + return; + } +#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(fc_handle, #f, NULL, 0)) == NULL){WARN("Can't find symbol %s\n", #f); goto sym_not_found;} +LOAD_FUNCPTR(FcConfigGetCurrent); +LOAD_FUNCPTR(FcFontList); +LOAD_FUNCPTR(FcFontSetDestroy); +LOAD_FUNCPTR(FcInit); +LOAD_FUNCPTR(FcObjectSetAdd); +LOAD_FUNCPTR(FcObjectSetCreate); +LOAD_FUNCPTR(FcObjectSetDestroy); +LOAD_FUNCPTR(FcPatternCreate); +LOAD_FUNCPTR(FcPatternDestroy); +LOAD_FUNCPTR(FcPatternGet); +#undef LOAD_FUNCPTR + + if(!pFcInit()) return; + + config = pFcConfigGetCurrent(); + pat = pFcPatternCreate(); + os = pFcObjectSetCreate(); + pFcObjectSetAdd(os, FC_FILE); + fontset = pFcFontList(config, pat, os); + if(!fontset) return; + for(i = 0; i < fontset->nfont; i++) { + if(pFcPatternGet(fontset->fonts[i], FC_FILE, 0, &v) != FcResultMatch) + continue; + if(v.type != FcTypeString) continue; + TRACE("fontconfig: %s\n", v.u.s); + + /* We're just interested in OT/TT fonts for now, so this hack just + picks up the standard extensions to save time loading every other + font */ + len = strlen(v.u.s); + if(len < 4) continue; + ext = v.u.s + len - 3; + if(!strcasecmp(ext, "ttf") || !strcasecmp(ext, "ttc") || !strcasecmp(ext, "otf")) + AddFontFileToList(v.u.s, NULL); + } + pFcFontSetDestroy(fontset); + pFcObjectSetDestroy(os); + pFcPatternDestroy(pat); + sym_not_found: +#endif + return; +} /************************************************************* * WineEngAddFontResourceEx * @@ -766,6 +846,7 @@ BOOL WineEngInit(void) RegCloseKey(hkey); } + load_fontconfig_fonts(); /* then look in any directories that we've specified in the config file */ if(RegOpenKeyA(HKEY_LOCAL_MACHINE, diff --git a/include/config.h.in b/include/config.h.in index 72b7a9d5a4a..4be7ba5e1fd 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -80,6 +80,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_FONTCONFIG_FONTCONFIG_H + /* Define to 1 if you have the `fpclass' function. */ #undef HAVE_FPCLASS @@ -791,6 +794,9 @@ /* Define to the soname of the libcurses library. */ #undef SONAME_LIBCURSES +/* Define to the soname of the libfontconfig library. */ +#undef SONAME_LIBFONTCONFIG + /* Define to the soname of the libfreetype library. */ #undef SONAME_LIBFREETYPE