Add ref counting to font config patterns so that FcFontSort return values
authorKeith Packard <keithp@keithp.com>
Wed, 19 Jun 2002 20:08:22 +0000 (20:08 +0000)
committerKeith Packard <keithp@keithp.com>
Wed, 19 Jun 2002 20:08:22 +0000 (20:08 +0000)
    are persistant

12 files changed:
fontconfig/fontconfig.h
fonts.dtd
src/fccache.c
src/fccfg.c
src/fcdbg.c
src/fcdir.c
src/fcint.h
src/fclist.c
src/fcmatch.c
src/fcname.c
src/fcpat.c
src/fcxml.c

index d7e1023..c270420 100644 (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.
  *
@@ -586,6 +586,9 @@ FcPattern *
 FcPatternDuplicate (FcPattern *p);
 
 void
+FcPatternReference (FcPattern *p);
+
+void
 FcValueDestroy (FcValue v);
 
 FcBool
index 14306d1..6d387f9 100644 (file)
--- a/fonts.dtd
+++ b/fonts.dtd
 
     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">
 
index ec83104..960beb4 100644 (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 (!FcPatternAddString (font, FC_FILE, path))
+               {
+                   FcPatternDestroy (font);
+                   goto bail2;
+               }
                if (!FcFontSetAdd (set, font))
+               {
+                   FcPatternDestroy (font);
                    goto bail2;
+               }
            }
        }
        if (path != path_buf)
index e073b85..66bf501 100644 (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)
        {
index 9ea9c29..b682f9f 100644 (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);
index ac72b7a..cc8a9b1 100644 (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
index d0dcf6a..6918730 100644 (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 {
index 5468b2a..b87e92f 100644 (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.
  *
index 0b7f7d4..5866db9 100644 (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);
 }
 
index 9f677a8..ad78c3d 100644 (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 },
index e212fa0..3e19732 100644 (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)
 {
index 1100606..0c1304e 100644 (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);