Load any TrueType fonts that fontconfig knows about.

This commit is contained in:
Huw Davies 2003-11-09 00:30:13 +00:00 committed by Alexandre Julliard
parent fc58ef8119
commit 6e12807b55
4 changed files with 158 additions and 2 deletions

67
configure vendored
View File

@ -13086,6 +13086,71 @@ cat >>confdefs.h <<_ACEOF
_ACEOF _ACEOF
fi 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 "$as_me:$LINENO: checking for -lssl soname" >&5
echo $ECHO_N "checking for -lssl soname... $ECHO_C" >&6 echo $ECHO_N "checking for -lssl soname... $ECHO_C" >&6
if test "${ac_cv_lib_soname_ssl+set}" = set; then if test "${ac_cv_lib_soname_ssl+set}" = set; then
@ -13937,6 +14002,7 @@ done
for ac_header in \ for ac_header in \
@ -13946,6 +14012,7 @@ for ac_header in \
direct.h \ direct.h \
elf.h \ elf.h \
float.h \ float.h \
fontconfig/fontconfig.h \
getopt.h \ getopt.h \
ieeefp.h \ ieeefp.h \
io.h \ io.h \

View File

@ -935,6 +935,7 @@ then
WINE_GET_SONAME(GL,glXQueryExtension,[$X_LIBS $X_EXTRA_LIBS]) WINE_GET_SONAME(GL,glXQueryExtension,[$X_LIBS $X_EXTRA_LIBS])
WINE_GET_SONAME(cups,cupsGetDefault) WINE_GET_SONAME(cups,cupsGetDefault)
WINE_GET_SONAME(jack,jack_client_new) WINE_GET_SONAME(jack,jack_client_new)
WINE_GET_SONAME(fontconfig, FcInit);
WINE_GET_SONAME(ssl,SSL_library_init) WINE_GET_SONAME(ssl,SSL_library_init)
WINE_GET_SONAME(crypto,BIO_new_socket) WINE_GET_SONAME(crypto,BIO_new_socket)
WINE_GET_SONAME(ncurses,waddch) WINE_GET_SONAME(ncurses,waddch)
@ -1008,6 +1009,7 @@ AC_CHECK_HEADERS(\
direct.h \ direct.h \
elf.h \ elf.h \
float.h \ float.h \
fontconfig/fontconfig.h \
getopt.h \ getopt.h \
ieeefp.h \ ieeefp.h \
io.h \ io.h \

View File

@ -105,10 +105,29 @@ MAKE_FUNCPTR(FT_Outline_Translate);
MAKE_FUNCPTR(FT_Select_Charmap); MAKE_FUNCPTR(FT_Select_Charmap);
MAKE_FUNCPTR(FT_Set_Pixel_Sizes); MAKE_FUNCPTR(FT_Set_Pixel_Sizes);
MAKE_FUNCPTR(FT_Vector_Transform); MAKE_FUNCPTR(FT_Vector_Transform);
#undef MAKE_FUNCPTR
static void (*pFT_Library_Version)(FT_Library,FT_Int*,FT_Int*,FT_Int*); 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*); static FT_Error (*pFT_Load_Sfnt_Table)(FT_Face,FT_ULong,FT_Long,FT_Byte*,FT_ULong*);
#ifdef HAVE_FONTCONFIG_FONTCONFIG_H
#include <fontconfig/fontconfig.h>
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] ) #define GET_BE_WORD(ptr) MAKEWORD( ((BYTE *)(ptr))[1], ((BYTE *)(ptr))[0] )
typedef struct tagFace { 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); 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; FT_Face ft_face;
TT_OS2 *pOS2; TT_OS2 *pOS2;
@ -622,6 +641,67 @@ static BOOL ReadFontDir(char *dirname)
return TRUE; 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 * WineEngAddFontResourceEx
* *
@ -766,6 +846,7 @@ BOOL WineEngInit(void)
RegCloseKey(hkey); RegCloseKey(hkey);
} }
load_fontconfig_fonts();
/* then look in any directories that we've specified in the config file */ /* then look in any directories that we've specified in the config file */
if(RegOpenKeyA(HKEY_LOCAL_MACHINE, if(RegOpenKeyA(HKEY_LOCAL_MACHINE,

View File

@ -80,6 +80,9 @@
/* Define to 1 if you have the <float.h> header file. */ /* Define to 1 if you have the <float.h> header file. */
#undef HAVE_FLOAT_H #undef HAVE_FLOAT_H
/* Define to 1 if you have the <fontconfig/fontconfig.h> header file. */
#undef HAVE_FONTCONFIG_FONTCONFIG_H
/* Define to 1 if you have the `fpclass' function. */ /* Define to 1 if you have the `fpclass' function. */
#undef HAVE_FPCLASS #undef HAVE_FPCLASS
@ -791,6 +794,9 @@
/* Define to the soname of the libcurses library. */ /* Define to the soname of the libcurses library. */
#undef SONAME_LIBCURSES #undef SONAME_LIBCURSES
/* Define to the soname of the libfontconfig library. */
#undef SONAME_LIBFONTCONFIG
/* Define to the soname of the libfreetype library. */ /* Define to the soname of the libfreetype library. */
#undef SONAME_LIBFREETYPE #undef SONAME_LIBFREETYPE