[teklib-general] changeset in /hg/teklib/current: added fontconfig interface
Franciska Schulze
fschulze at neoscientists.org
Mon Nov 26 16:25:06 CET 2007
changeset 5547c3fb1092 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=5547c3fb1092
description:
added fontconfig interface
diffs (291 lines):
diff -r 86181036dcfb -r 5547c3fb1092 src/display_x11/display_x11_font.c
--- a/src/display_x11/display_x11_font.c Wed Sep 26 23:29:43 2007 +0200
+++ b/src/display_x11/display_x11_font.c Wed Sep 26 23:31:00 2007 +0200
@@ -8,7 +8,7 @@
** - implement xft version of drawtext2 (OK)
** - convert pens to xftcolors (OK)
** - xft font matching (WIP)
-** - dlopen fontconfig and bind symbols
+** - dlopen fontconfig and bind symbols (OK)
** - remove TDBFATAL from closefont
** - convert utf8 string to iso-irgendwas when using xlib
*/
@@ -32,12 +32,11 @@ static TAPTR hostopenfont_xlib(TMOD_X11
static TAPTR hostopenfont_xlib(TMOD_X11 *mod, TTAGITEM *tags);
static TAPTR hostqueryfonts_xft(TMOD_X11 *mod, TTAGITEM *tags);
static TAPTR hostqueryfonts_xlib(TMOD_X11 *mod, TTAGITEM *tags);
-
-/*****************************************************************************/
-/* try to open libxft and bind all symbols listed in libxftsyms
-** if initlibxft() succeeds g->use_xft is set to TTRUE
-*/
-static const TSTRPTR libxftsyms[LIBXFT_NUMSYMS] =
+static TAPTR initlib(TMOD_X11 *mod, TSTRPTR libname, const TSTRPTR *libsyms,
+ TAPTR iface, TINT numsyms);
+/*****************************************************************************/
+static const
+TSTRPTR libxftsyms[LIBXFT_NUMSYMS] =
{
"XftFontOpen",
"XftFontClose",
@@ -52,47 +51,94 @@ static const TSTRPTR libxftsyms[LIBXFT_N
"XftDrawDestroy",
};
+static const
+TSTRPTR libfcsyms[LIBFC_NUMSYMS] =
+{
+ "FcDefaultSubstitute",
+ "FcFontSetDestroy",
+ "FcFontSort",
+ "FcObjectSetAdd",
+ "FcObjectSetCreate",
+ "FcPatternAddBool",
+ "FcPatternAddDouble",
+ "FcPatternAddInteger",
+ "FcPatternBuild",
+ "FcPatternDestroy",
+ "FcPatternEqualSubset",
+ "FcPatternPrint",
+};
+
+/*****************************************************************************/
+/* try to open libfontconfig and libxft and bind all symbols
+** if initlibxft() succeeds g->use_xft is set to TTRUE
+*/
TBOOL
initlibxft(TMOD_X11 *mod)
{
- /* try to open libXft, if it fails, there
- will be no font antialiasing at all :( */
- mod->x11_libxfthandle = dlopen("libXft.so", RTLD_NOW);
- if (mod->x11_libxfthandle)
+ /* init fontconfig (needed for font matching) */
+ mod->x11_libfchandle = initlib(mod, "libfontconfig.so", libfcsyms,
+ (TVOID *)&mod->x11_fciface, LIBFC_NUMSYMS);
+
+ if (mod->x11_libfchandle)
+ {
+ /* try to init libXft, if it fails, there will be no font
+ antialiasing at all :( */
+ mod->x11_libxfthandle = initlib(mod, "libXft.so", libxftsyms,
+ (TVOID *)&mod->x11_xftiface, LIBXFT_NUMSYMS);
+
+ if (mod->x11_libxfthandle)
+ mod->x11_use_xft = TTRUE;
+ }
+
+ if (!mod->x11_use_xft)
+ TDBPRINTF(10, ("defaulting to xlib based font rendering\n"));
+
+ return mod->x11_use_xft;
+}
+
+/*****************************************************************************/
+/* dlopen the library named libname, bind numsyms symbols named by libsyms[]
+** to iface and return the libhandle obtained by dlopen or TNULL
+*/
+static TAPTR
+initlib(TMOD_X11 *mod, TSTRPTR libname, const TSTRPTR *libsyms, TAPTR iface, TINT numsyms)
+{
+ TAPTR libhandle = TNULL;
+
+ /* try to open lib */
+ libhandle = dlopen(libname, RTLD_NOW);
+ if (libhandle)
{
TINT i;
- TVOID *p = (TVOID *)&mod->x11_xftiface;
/* clear any old error conditions */
dlerror();
- for (i = 0; i < LIBXFT_NUMSYMS; i++)
- {
- //((void **) &g->xftiface)[i] = dlsym(g->libxfthandle, libxftsyms[i]);
- ((TVOID **)p)[i] = dlsym(mod->x11_libxfthandle, libxftsyms[i]);
+ for (i = 0; i < numsyms; i++)
+ {
+ ((TVOID **)iface)[i] = dlsym(libhandle, libsyms[i]);
if (dlerror()) break;
}
- if (i == LIBXFT_NUMSYMS && DISABLE_XFT != TTRUE)
- {
- mod->x11_use_xft = TTRUE;
- TDBPRINTF(10, ("libXft successfully initialised\n"));
+ if (i == numsyms)
+ {
+ TDBPRINTF(10, ("%s successfully initialised\n", libname));
}
else
{
/* missing symbols */
- TDBPRINTF(10, ("libXft initialisation failed\n"));
- TDBPRINTF(10, ("defaulting to xlib based font rendering\n"));
+ TDBPRINTF(10, ("%s initialisation failed\n", libname));
+ dlclose(libhandle);
+ libhandle = TNULL;
}
}
else
{
/* lib not found */
- TDBPRINTF(10, ("failed to open libXft\n"));
- TDBPRINTF(10, ("defaulting to xlib based font rendering\n"));
- }
-
- return mod->x11_use_xft;
+ TDBPRINTF(10, ("failed to open %s\n", libname));
+ }
+
+ return libhandle;
}
/*****************************************************************************/
@@ -712,14 +758,14 @@ hostqueryfonts_xft(TMOD_X11 *mod, TTAGIT
else
TDBPRINTF(20, ("out of memory :(\n"));
- pattern = FcPatternBuild (0,
+ pattern = (*mod->x11_fciface.FcPatternBuild)(0,
FC_FAMILY, FcTypeString, fname,
XFT_ENCODING, FcTypeString, FNT_DEFREGENC,
FC_ANTIALIAS, FcTypeBool, FcTrue,
NULL);
/* create object set to filter results */
- objset = FcObjectSetCreate();
+ objset = (*mod->x11_fciface.FcObjectSetCreate)();
if (pattern && objset)
{
@@ -727,57 +773,59 @@ hostqueryfonts_xft(TMOD_X11 *mod, TTAGIT
FcFontSet *fontset = TNULL;
if (strncmp(fname, "*", 1) != 0)
- FcObjectSetAdd(objset, FC_FAMILY);
+ (*mod->x11_fciface.FcObjectSetAdd)(objset, FC_FAMILY);
/* add attributes to pattern and object set */
if (fpxsize != FNTQUERY_UNDEFINED && fscale != TTRUE)
{
- FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (TFLOAT)fpxsize);
- FcObjectSetAdd(objset, FC_PIXEL_SIZE);
+ (*mod->x11_fciface.FcPatternAddDouble)
+ (pattern, FC_PIXEL_SIZE, (TFLOAT)fpxsize);
+ (*mod->x11_fciface.FcObjectSetAdd)(objset, FC_PIXEL_SIZE);
}
if (fitalic != FNTQUERY_UNDEFINED)
{
- FcPatternAddInteger(pattern, FC_SLANT,
+ (*mod->x11_fciface.FcPatternAddInteger) (pattern, FC_SLANT,
(fitalic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN));
- FcObjectSetAdd(objset, FC_SLANT);
+ (*mod->x11_fciface.FcObjectSetAdd)(objset, FC_SLANT);
}
if (fbold != FNTQUERY_UNDEFINED)
{
- FcPatternAddInteger(pattern, FC_WEIGHT,
+ (*mod->x11_fciface.FcPatternAddInteger)(pattern, FC_WEIGHT,
(fbold ? FC_WEIGHT_BOLD : FC_WEIGHT_MEDIUM));
- FcObjectSetAdd(objset, FC_WEIGHT);
+ (*mod->x11_fciface.FcObjectSetAdd)(objset, FC_WEIGHT);
}
if (fscale != FNTQUERY_UNDEFINED)
{
- FcPatternAddBool(pattern, FC_SCALABLE, fscale);
- FcObjectSetAdd(objset, FC_SCALABLE);
- }
-
- FcPatternPrint(pattern);
- FcDefaultSubstitute(pattern);
- FcPatternPrint(pattern);
-
- fontset = FcFontSort(TNULL, pattern, FcFalse, TNULL, &result);
+ (*mod->x11_fciface.FcPatternAddBool)(pattern, FC_SCALABLE, fscale);
+ (*mod->x11_fciface.FcObjectSetAdd)(objset, FC_SCALABLE);
+ }
+
+ (*mod->x11_fciface.FcPatternPrint)(pattern);
+ (*mod->x11_fciface.FcDefaultSubstitute)(pattern);
+ (*mod->x11_fciface.FcPatternPrint)(pattern);
+
+ fontset = (*mod->x11_fciface.FcFontSort)(TNULL, pattern, FcFalse, TNULL, &result);
if (fontset)
{
TINT i;
for (i = 0; i < fontset->nfont; i++)
{
- if (FcPatternEqualSubset(pattern, fontset->fonts[i], objset))
+ if ((*mod->x11_fciface.FcPatternEqualSubset)
+ (pattern, fontset->fonts[i], objset))
{
/* ... */
- FcPatternPrint(fontset->fonts[i]);
+ (*mod->x11_fciface.FcPatternPrint)(fontset->fonts[i]);
}
}
- FcFontSetDestroy(fontset);
- }
-
- FcPatternDestroy(pattern);
+ (*mod->x11_fciface.FcFontSetDestroy)(fontset);
+ }
+
+ (*mod->x11_fciface.FcPatternDestroy)(pattern);
}
else
TDBPRINTF(10, ("unable to create pattern\n"));
diff -r 86181036dcfb -r 5547c3fb1092 src/display_x11/display_x11_font.h
--- a/src/display_x11/display_x11_font.h Wed Sep 26 23:29:43 2007 +0200
+++ b/src/display_x11/display_x11_font.h Wed Sep 26 23:31:00 2007 +0200
@@ -85,6 +85,26 @@ struct XftInterface
void (*XftDrawDestroy)(XftDraw *draw);
};
+#define LIBFC_NUMSYMS 12
+
+struct FcInterface
+{
+ void (*FcDefaultSubstitute)(FcPattern *pattern);
+ void (*FcFontSetDestroy)(FcFontSet *s);
+ FcFontSet *(*FcFontSort)(FcConfig *config, FcPattern *p, FcBool trim, FcCharSet **csp,
+ FcResult *result);
+ FcBool (*FcObjectSetAdd)(FcObjectSet *os, const char *object);
+ FcObjectSet *(*FcObjectSetCreate)(void);
+ FcBool (*FcPatternAddBool)(FcPattern *p, const char *object, FcBool b);
+ FcBool (*FcPatternAddDouble)(FcPattern *p, const char *object, double d);
+ FcBool (*FcPatternAddInteger)(FcPattern *p, const char *object, int i);
+ FcPattern *(*FcPatternBuild)(FcPattern *orig, ...);
+ void (*FcPatternDestroy)(FcPattern *p);
+ FcBool (*FcPatternEqualSubset)(const FcPattern *pa, const FcPattern *pb,
+ const FcObjectSet *os);
+ void (*FcPatternPrint)(const FcPattern *p);
+};
+
/*****************************************************************************/
#endif /* _TEK_DISPLAY_X11_FONT_H */
diff -r 86181036dcfb -r 5547c3fb1092 src/display_x11/display_x11_mod.h
--- a/src/display_x11/display_x11_mod.h Wed Sep 26 23:29:43 2007 +0200
+++ b/src/display_x11/display_x11_mod.h Wed Sep 26 23:31:00 2007 +0200
@@ -91,9 +91,12 @@ typedef struct X11Display
int x11_fd_sigpipe_write;
int x11_fd_max;
+ TBOOL x11_use_xft;
TAPTR x11_libxfthandle;
struct XftInterface x11_xftiface;
- TBOOL x11_use_xft;
+ TAPTR x11_libfchandle;
+ struct FcInterface x11_fciface;
+
struct FontMan x11_fm;
/* list of all visuals: */
More information about the teklib-general
mailing list