]> git.wh0rd.org - fontconfig.git/commitdiff
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 d7e102390d97872ac80924ad31a436e0fc90b318..c2704206b5096e33baa7ca40e0c95338ba6e7e26 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.
  *
@@ -585,6 +585,9 @@ FcPatternCreate (void);
 FcPattern *
 FcPatternDuplicate (FcPattern *p);
 
+void
+FcPatternReference (FcPattern *p);
+
 void
 FcValueDestroy (FcValue v);
 
index 14306d179b314f290bd72f8704f341b620558ef3..6d387f9e3c0ce9c27ab2eec457d4214eabb1267e 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 ec831043c45d07e1cd5f2699cde6b9d6417c0606..960beb4218923bc87c36e2b644f112e1013e76b2 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 e073b85098746a9ad880fe7cb8ca6baa33a61bfa..66bf501aacc5116db712c3b6582659ddda5f2dbb 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 9ea9c29b4730f1331c7f6a36290ba64499522039..b682f9fc86a0a8a23c8892a7e6b50c2657b6449c 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 ac72b7a73f7647f7b7404fce834996c123f27b3e..cc8a9b1dfa1d1dc8fa3873164ebd8b5843aee1d3 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 d0dcf6a662a3c74fa3058fa4e76325894d3eb2fa..69187300aa39afc894bc2ac4265c7f71d9d930d6 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 5468b2a619598d46164f4a3aaf2626d387d5a9cc..b87e92f55c6d4fafbb70c6e1bdababd1450bb9e1 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 0b7f7d4c4db7b878a4001d1bf4c87d7d4281258d..5866db999c17336b8e0189908894c8eb77a372d5 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 9f677a8108da1d5d29c4b1f8252902ade3001db5..ad78c3db4cb07d5df22e473edac9ae37db0ea91b 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 e212fa05d8c7c5d795f464e42f4db8d7279a564a..3e19732a4e47b879543a6e3a27869f923d0afd23 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 110060633139e489eb4ac525851c5b65a011ffd6..0c1304ec2c951df336f5228cdbd01bdf697ebd49 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);