[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