Commit 6f6563ed authored by Keith Packard's avatar Keith Packard

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

    are persistant
parent 06a48f20
/*
* $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);
......
......@@ -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">
......
/*
* $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 (!FcPatternAddString (font, FC_FILE, path))
{
FcPatternDestroy (font);
goto bail2;
}
if (!FcFontSetAdd (set, font))
{
FcPatternDestroy (font);
goto bail2;
}
}
}
if (path != path_buf)
......
......@@ -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)
{
......
/*
* $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);
......
/*
* $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
......
/*
* $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 {
......
/*
* $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.
*
......
......@@ -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);
}
......
/*
* $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 },
......
/*
* $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)
{
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment