From 6f6563edb5eb0fc22b338101b82bd8b7db438e3a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 19 Jun 2002 20:08:22 +0000 Subject: [PATCH] Add ref counting to font config patterns so that FcFontSort return values are persistant --- fontconfig/fontconfig.h | 5 ++++- fonts.dtd | 5 ++++- src/fccache.c | 11 +++++++++-- src/fccfg.c | 4 ++++ src/fcdbg.c | 8 +++++++- src/fcdir.c | 5 +++-- src/fcint.h | 9 +++++---- src/fclist.c | 2 +- src/fcmatch.c | 21 +++++++++++++++++++-- src/fcname.c | 3 ++- src/fcpat.c | 12 +++++++++++- src/fcxml.c | 4 ++++ 12 files changed, 73 insertions(+), 16 deletions(-) diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h index d7e1023..c270420 100644 --- a/fontconfig/fontconfig.h +++ b/fontconfig/fontconfig.h @@ -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); diff --git a/fonts.dtd b/fonts.dtd index 14306d1..6d387f9 100644 --- a/fonts.dtd +++ b/fonts.dtd @@ -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. --> diff --git a/src/fccache.c b/src/fccache.c index ec83104..960beb4 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -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 (!FcPatternAddString (font, FC_FILE, path)) + { + FcPatternDestroy (font); + goto bail2; + } if (!FcFontSetAdd (set, font)) + { + FcPatternDestroy (font); goto bail2; + } } } if (path != path_buf) diff --git a/src/fccfg.c b/src/fccfg.c index e073b85..66bf501 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -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) { diff --git a/src/fcdbg.c b/src/fcdbg.c index 9ea9c29..b682f9f 100644 --- a/src/fcdbg.c +++ b/src/fcdbg.c @@ -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); diff --git a/src/fcdir.c b/src/fcdir.c index ac72b7a..cc8a9b1 100644 --- a/src/fcdir.c +++ b/src/fcdir.c @@ -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 diff --git a/src/fcint.h b/src/fcint.h index d0dcf6a..6918730 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -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 { diff --git a/src/fclist.c b/src/fclist.c index 5468b2a..b87e92f 100644 --- a/src/fclist.c +++ b/src/fclist.c @@ -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. * diff --git a/src/fcmatch.c b/src/fcmatch.c index 0b7f7d4..5866db9 100644 --- a/src/fcmatch.c +++ b/src/fcmatch.c @@ -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); } diff --git a/src/fcname.c b/src/fcname.c index 9f677a8..ad78c3d 100644 --- a/src/fcname.c +++ b/src/fcname.c @@ -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 }, diff --git a/src/fcpat.c b/src/fcpat.c index e212fa0..3e19732 100644 --- a/src/fcpat.c +++ b/src/fcpat.c @@ -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) { diff --git a/src/fcxml.c b/src/fcxml.c index 1100606..0c1304e 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -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); -- 2.39.2