Add ref counting to font config patterns so that FcFontSort return values

are persistant
This commit is contained in:
Keith Packard 2002-06-19 20:08:22 +00:00
parent 06a48f2073
commit 6f6563edb5
12 changed files with 74 additions and 17 deletions

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/fontconfig/fontconfig.h,v 1.15 2002/06/02 20:52:06 keithp Exp $
* $XFree86: xc/lib/fontconfig/fontconfig/fontconfig.h,v 1.16 2002/06/03 08:31:15 keithp Exp $
*
* Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc.
*
@ -585,6 +585,9 @@ FcPatternCreate (void);
FcPattern *
FcPatternDuplicate (FcPattern *p);
void
FcPatternReference (FcPattern *p);
void
FcValueDestroy (FcValue v);

View File

@ -109,10 +109,13 @@
if 'qual' is 'any', then the match succeeds if any value in the field matches.
if 'qual' is 'all', then the match succeeds only if all values match.
if 'qual' is 'first', then the match succeeds only if the first value matches.
if 'qual' is 'not_first', then the match succeeds only if any value other than
the first matches.
-->
<!ELEMENT test (%expr;)*>
<!ATTLIST test
qual (any|all) "any"
qual (any|all|first|not_first) "any"
name CDATA #REQUIRED
compare (eq|not_eq|less|less_eq|more|more_eq) "eq">

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fccache.c,v 1.4 2002/03/01 01:00:54 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fccache.c,v 1.7 2002/05/21 17:06:22 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -594,9 +594,16 @@ FcFileCacheReadDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *cache_file)
{
printf (" dir cache file \"%s\"\n", file);
}
FcPatternAddString (font, FC_FILE, path);
if (!FcFontSetAdd (set, font))
if (!FcPatternAddString (font, FC_FILE, path))
{
FcPatternDestroy (font);
goto bail2;
}
if (!FcFontSetAdd (set, font))
{
FcPatternDestroy (font);
goto bail2;
}
}
}
if (path != path_buf)

View File

@ -1129,6 +1129,10 @@ FcConfigSubstitute (FcConfig *config,
st[i].value = FcConfigMatchValueList (p, t, st[i].elt->values);
if (!st[i].value)
break;
if (t->qual == FcQualFirst && st[i].value != st[i].elt->values)
break;
if (t->qual == FcQualNotFirst && st[i].value == st[i].elt->values)
break;
}
if (t)
{

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fcdbg.c,v 1.2 2002/02/18 22:29:28 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fcdbg.c,v 1.3 2002/06/02 21:07:56 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -215,6 +215,12 @@ FcTestPrint (FcTest *test)
case FcQualAll:
printf ("all ");
break;
case FcQualFirst:
printf ("first ");
break;
case FcQualNotFirst:
printf ("not_first ");
break;
}
printf ("%s ", test->field);
FcOpPrint (test->op);

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fcdir.c,v 1.2 2002/02/15 06:01:28 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fcdir.c,v 1.5 2002/05/21 17:06:22 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -71,7 +71,8 @@ FcFileScan (FcFontSet *set,
{
font = FcNameParse (name);
if (font)
FcPatternAddString (font, FC_FILE, file);
if (!FcPatternAddString (font, FC_FILE, file))
ret = FcFalse;
}
}
else

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fcint.h,v 1.12 2002/05/31 23:21:25 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fcint.h,v 1.13 2002/06/03 08:31:15 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -94,13 +94,14 @@ typedef struct _FcValueList {
typedef struct _FcPatternElt {
const char *object;
FcValueList *values;
FcValueList *values;
} FcPatternElt;
struct _FcPattern {
int num;
int size;
FcPatternElt *elts;
int ref;
FcPatternElt *elts;
};
typedef enum _FcOp {
@ -134,7 +135,7 @@ typedef struct _FcExpr {
} FcExpr;
typedef enum _FcQual {
FcQualAny, FcQualAll
FcQualAny, FcQualAll, FcQualFirst, FcQualNotFirst
} FcQual;
typedef struct _FcTest {

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fclist.c,v 1.4 2002/06/02 21:07:56 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fclist.c,v 1.5 2002/06/03 08:31:15 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*

View File

@ -329,16 +329,30 @@ FcFontRenderPrepare (FcConfig *config,
pe = FcPatternFindElt (pat, fe->object);
if (pe)
{
int j;
double score[NUM_MATCHER];
for (j = 0; j < NUM_MATCHER; j++)
score[j] = 0;
if (!FcCompareValueList (pe->object, pe->values,
fe->values, &v, 0, &result))
{
FcPatternDestroy (new);
return 0;
}
for (j = 0; j < NUM_MATCHER; j++)
if (score[j] >= 100.0)
{
FcValueList *pv;
for (pv = pe->values; pv; pv = pv->next)
FcPatternAdd (new, fe->object, pv->value, FcTrue);
break;
}
}
else
v = fe->values->value;
FcPatternAdd (new, fe->object, v, FcTrue);
FcPatternAdd (new, fe->object, v, FcFalse);
}
for (i = 0; i < pat->num; i++)
{
@ -502,8 +516,12 @@ FcSortWalk (FcSortNode **n, int nnode, FcFontSet *fs, FcCharSet **cs, FcBool tri
else
ncs = FcCharSetCopy (ncs);
*cs = ncs;
FcPatternReference (node->pattern);
if (!FcFontSetAdd (fs, node->pattern))
{
FcPatternDestroy (node->pattern);
return FcFalse;
}
}
}
}
@ -513,7 +531,6 @@ FcSortWalk (FcSortNode **n, int nnode, FcFontSet *fs, FcCharSet **cs, FcBool tri
void
FcFontSetSortDestroy (FcFontSet *fs)
{
fs->nfont = 0;
FcFontSetDestroy (fs);
}

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fcname.c,v 1.6 2002/06/02 21:07:57 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fcname.c,v 1.7 2002/06/03 08:31:15 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -143,6 +143,7 @@ static const FcConstant _FcBaseConstants[] = {
{ (FcChar8 *) "mono", "spacing", FC_MONO, },
{ (FcChar8 *) "charcell", "spacing", FC_CHARCELL, },
{ (FcChar8 *) "none", "rgba", FC_RGBA_NONE },
{ (FcChar8 *) "rgb", "rgba", FC_RGBA_RGB, },
{ (FcChar8 *) "bgr", "rgba", FC_RGBA_BGR, },
{ (FcChar8 *) "vrgb", "rgba", FC_RGBA_VRGB },

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fcpat.c,v 1.6 2002/05/31 23:21:25 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fcpat.c,v 1.7 2002/06/03 08:31:15 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -38,6 +38,7 @@ FcPatternCreate (void)
p->num = 0;
p->size = 0;
p->elts = 0;
p->ref = 1;
return p;
}
@ -231,6 +232,9 @@ FcPatternDestroy (FcPattern *p)
{
int i;
if (--p->ref > 0)
return;
for (i = 0; i < p->num; i++)
FcValueListDestroy (p->elts[i].values);
@ -706,6 +710,12 @@ bail0:
return 0;
}
void
FcPatternReference (FcPattern *p)
{
p->ref++;
}
FcPattern *
FcPatternVaBuild (FcPattern *orig, va_list va)
{

View File

@ -1316,6 +1316,10 @@ FcParseTest (FcConfigParse *parse)
qual = FcQualAny;
else if (!strcmp ((char *) qual_string, "all"))
qual = FcQualAll;
else if (!strcmp ((char *) qual_string, "first"))
qual = FcQualFirst;
else if (!strcmp ((char *) qual_string, "not_first"))
qual = FcQualNotFirst;
else
{
FcConfigMessage (parse, FcSevereWarning, "invalid test qual \"%s\"", qual_string);