[teklib-general] changeset in /hg/teklib/current: - changed attribute defaults in...

Franciska Schulze fschulze at neoscientists.org
Mon Nov 26 16:24:26 CET 2007


changeset 1a236737563d in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=1a236737563d
description:
	- changed attribute defaults in queryfont functions
	- hostqueryfonts_xft: work in progress

diffs (273 lines):

diff -r 70ce4c38476e -r 1a236737563d src/visual/posix/visual_font.c
--- a/src/visual/posix/visual_font.c	Mon Sep 24 12:38:20 2007 +0200
+++ b/src/visual/posix/visual_font.c	Tue Sep 25 23:15:20 2007 +0200
@@ -432,8 +432,8 @@ fnt_getfnnodes(TMOD_VIS *mod, struct TLi
 **	------------------------+-----------+---------------
 **	 TVisual_FontName		| "fixed"	| "*"
 **   TVisual_FontPxSize		| 14		|  0
-**	 TVisual_FontItalic		| false		| "*"
-**	 TVisual_FontBold		| false		| "*"
+**	 TVisual_FontItalic		| false		|  /
+**	 TVisual_FontBold		| false		|  /
 **	 TVisual_FontScaleable	| false		|  /
 **
 ** ¹ the defaults are used when the tag is missing
@@ -630,14 +630,14 @@ hostopenfont_xlib(TMOD_VIS *mod, TTAGITE
 **	 TVisual_FontScaleable	| prefer truetype font
 **	 TVisual_FontNumResults	| how many fonts to return
 **
-**	tag name				| default¹	| wildcard
-**	------------------------+-----------+---------------
-**	 TVisual_FontName		| "fixed"	| "*"
-**   TVisual_FontPxSize		| 14		|  0
-**	 TVisual_FontItalic		| false		| "*"
-**	 TVisual_FontBold		| false		| "*"
-**	 TVisual_FontScaleable	| false		|  /
-**	 TVisual_FontNumResults	| 1			|  /
+**	tag name				| default¹
+**	------------------------+----------------------------
+**	 TVisual_FontName		| FNTQUERY_UNDEFINED ("*")
+**   TVisual_FontPxSize		| FNTQUERY_UNDEFINED ("*")
+**	 TVisual_FontItalic		| FNTQUERY_UNDEFINED ("*")
+**	 TVisual_FontBold		| FNTQUERY_UNDEFINED ("*")
+**	 TVisual_FontScaleable	| FNTQUERY_UNDEFINED
+**	 TVisual_FontNumResults	|  1
 **
 ** ¹ the defaults are used when the tag is missing
 **
@@ -648,12 +648,8 @@ hostopenfont_xlib(TMOD_VIS *mod, TTAGITE
 ** - use TDestroy to free all memory associated with a FontQueryHandle
 **
 ** EXAMPLES:
-** - to match the default font of your platform leave all tags empty
-** - to match the default font in say 16px, set TVisual_FontPxSize to
-**   16 and leave all other tags empty
-** - to match all available fonts, use wildcards for TVisual_FontName,
-**   TVisual_FontPxSize, TVisual_FontItalic, TVisual_FontBold and set
-**   TVisual_FontNumResults to a big value (propably > 3000)
+** - to match all available fonts, specify only TVisual_FontNumResults
+**	 and set it to a big value (propably > 3000)
 ** - to match more than one specific font, use a coma separated list
 **   for TVisual_FontName, e.g. "helvetica,utopia,fixed", note that
 **   spaces are not filtered
@@ -670,6 +666,171 @@ hostopenfont_xlib(TMOD_VIS *mod, TTAGITE
 
 LOCAL TAPTR
 vis_hostqueryfonts(TMOD_VIS *mod, TTAGITEM *tags)
+{
+	GLOBAL *g = mod->vis_HostGlobal;
+	struct FontQueryHandle *fqh = TNULL;
+
+	if (g->use_xft == TTRUE)
+		fqh = hostqueryfonts_xft(mod, tags);
+	else
+		fqh = hostqueryfonts_xlib(mod, tags);
+
+	return fqh;
+}
+
+LOCAL TAPTR
+hostqueryfonts_xft(TMOD_VIS *mod, TTAGITEM *tags)
+{
+	TINT fpxsize, fnum;
+	TSTRPTR fname = TNULL;
+	TBOOL fitalic, fbold, fscale;
+	FcPattern *pattern = TNULL;
+	FcObjectSet *objset = TNULL;
+	TAPTR exec = TGetExecBase(mod);
+	GLOBAL *g = mod->vis_HostGlobal;
+	struct FontQueryHandle *fqh = TNULL;
+
+	TDBPRINTF(10, ("***********************************************\n"));
+
+	fname = (TSTRPTR) TGetTag(tags, TVisual_FontName, (TTAG) "*");
+	/* parse fontnames */
+
+	/* fetch user specified attributes */
+	fpxsize = (TINT) TGetTag(tags, TVisual_FontPxSize, (TTAG) FNTQUERY_UNDEFINED);
+	fitalic = (TBOOL) TGetTag(tags, TVisual_FontItalic, (TTAG) FNTQUERY_UNDEFINED);
+	fbold = (TBOOL) TGetTag(tags, TVisual_FontBold, (TTAG) FNTQUERY_UNDEFINED);
+	fscale = (TBOOL) TGetTag(tags, TVisual_FontScaleable, (TTAG) FNTQUERY_UNDEFINED);
+	fnum = (TINT) TGetTag(tags, TVisual_FontNumResults, (TTAG) FNTQUERY_NUMRES);
+
+	/* init result list */
+	fqh = TExecAlloc0(exec, mod->vis_MMU, sizeof(struct FontQueryHandle));
+	if (fqh)
+	{
+		fqh->handle.thn_Owner = mod;
+		TInitHook(&fqh->handle.thn_Hook, fqhdestroy, fqh);
+		TInitList(&fqh->reslist);
+		/* init list iterator */
+		fqh->nptr = &fqh->reslist.tlh_Head;
+	}
+	else
+		TDBPRINTF(20, ("out of memory :(\n"));
+
+	TExecLock(exec, g->lock);
+
+	pattern = FcPatternBuild (0,
+		FC_FAMILY, FcTypeString, fname,
+		XFT_ENCODING, FcTypeString, FNT_DEFREGENC,
+		FC_ANTIALIAS, FcTypeBool, FcTrue,
+		TNULL);
+
+	/* create object set to filter results */
+	objset = FcObjectSetCreate();
+
+	if (pattern && objset)
+	{
+		FcResult result;
+		FcFontSet *fontset = TNULL;
+
+		if (strncmp(fname, "*", 1) != 0)
+			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);
+		}
+
+		if (fitalic != FNTQUERY_UNDEFINED)
+		{
+			FcPatternAddInteger(pattern, FC_SLANT,
+				(fitalic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN));
+			FcObjectSetAdd(objset, FC_SLANT);
+		}
+
+		if (fbold != FNTQUERY_UNDEFINED)
+		{
+			FcPatternAddInteger(pattern, FC_WEIGHT,
+				(fbold ? FC_WEIGHT_BOLD : FC_WEIGHT_MEDIUM));
+			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);
+		if (fontset)
+		{
+			TINT i;
+
+			for (i = 0; i < fontset->nfont; i++)
+			{
+				if (FcPatternEqualSubset(pattern, fontset->fonts[i], objset))
+				{
+					/* ... */
+					FcPatternPrint(fontset->fonts[i]);
+				}
+			}
+
+			FcFontSetDestroy(fontset);
+		}
+
+		FcPatternDestroy(pattern);
+	}
+	else
+		TDBPRINTF(10, ("unable to create pattern\n"));
+
+
+	TExecUnlock(exec, g->lock);
+
+	fnt_dumplist(&fqh->reslist);
+	TDBPRINTF(10, ("***********************************************\n"));
+
+	return fqh;
+}
+
+
+LOCAL TSTRPTR
+fnt_getfbold(TBOOL fbold)
+{
+	switch (fbold)
+	{
+	 	case FNTQUERY_UNDEFINED:
+	 		return "*";
+	 	case TFALSE:
+			return FNT_WGHT_MEDIUM;
+		case TTRUE:
+			return	FNT_WGHT_BOLD;
+	}
+
+	return TNULL;
+}
+
+LOCAL TSTRPTR
+fnt_getfitalic(TBOOL fitalic)
+{
+	switch (fitalic)
+	{
+	 	case FNTQUERY_UNDEFINED:
+	 		return "*";
+	 	case TFALSE:
+			return FNT_SLANT_R;
+		case TTRUE:
+			return	FNT_SLANT_I;
+	}
+
+	return TNULL;
+}
+
+LOCAL TAPTR
+hostqueryfonts_xlib(TMOD_VIS *mod, TTAGITEM *tags)
 {
 	TINT fpxsize, fnum;
 	TBOOL fitalic, fbold;
@@ -688,13 +849,13 @@ vis_hostqueryfonts(TMOD_VIS *mod, TTAGIT
 	TInitList(&fnlist);
 
 	/* fetch and parse fname */
-	fname = (TSTRPTR) TGetTag(tags, TVisual_FontName, (TTAG) FNT_DEFNAME);
+	fname = (TSTRPTR) TGetTag(tags, TVisual_FontName, (TTAG) "*");
 	if (fname)	fnt_getfnnodes(mod, &fnlist, fname);
 
 	/* fetch user specified attributes */
-	fpxsize = (TINT) TGetTag(tags, TVisual_FontPxSize, (TTAG) FNT_DEFPXSIZE);
-	fitalic = (TBOOL) TGetTag(tags, TVisual_FontItalic, (TTAG) TFALSE);
-	fbold = (TBOOL) TGetTag(tags, TVisual_FontBold, (TTAG) TFALSE);
+	fpxsize = (TINT) TGetTag(tags, TVisual_FontPxSize, (TTAG) FNTQUERY_UNDEFINED);
+	fitalic = (TBOOL) TGetTag(tags, TVisual_FontItalic, (TTAG) FNTQUERY_UNDEFINED);
+	fbold = (TBOOL) TGetTag(tags, TVisual_FontBold, (TTAG) FNTQUERY_UNDEFINED);
 	fnum = (TINT) TGetTag(tags, TVisual_FontNumResults, (TTAG) FNTQUERY_NUMRES);
 
 	/* init result list */
@@ -726,24 +887,24 @@ vis_hostqueryfonts(TMOD_VIS *mod, TTAGIT
 			TINT i, numfonts = 0;
 
 			/* build fontquery name */
-			if (fpxsize)
+			if (fpxsize > 0)
 			{
 				/* match exact pixel size */
 				sprintf(fquery, "-*-%s-%s-%s-*-*-%d-*-*-*-*-*-%s",
 					fnn->fname,
-					fbold ? FNT_WGHT_BOLD : FNT_WGHT_MEDIUM,
-					fitalic ? FNT_SLANT_I : FNT_SLANT_R,
+					fnt_getfbold(fbold),
+					fnt_getfitalic(fitalic),
 					fpxsize,
 					FNT_DEFREGENC
 				);
 			}
 			else
 			{
-				/* match pixel size with wildcard */
+				/* match pixel size using wildcard */
 				sprintf(fquery, "-*-%s-%s-%s-*-*-*-*-*-*-*-*-%s",
 					fnn->fname,
-					fbold ? FNT_WGHT_BOLD : FNT_WGHT_MEDIUM,
-					fitalic ? FNT_SLANT_I : FNT_SLANT_R,
+					fnt_getfbold(fbold),
+					fnt_getfitalic(fitalic),
 					FNT_DEFREGENC
 				);
 			}


More information about the teklib-general mailing list