[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