]> git.wh0rd.org - fontconfig.git/blobdiff - src/fccfg.c
Add ref counting to font config patterns so that FcFontSort return values
[fontconfig.git] / src / fccfg.c
index a35215ae8c042fa2e4fe85fd7cdb30dccc768489..66bf501aacc5116db712c3b6582659ddda5f2dbb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.5 2002/03/01 01:00:54 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.11 2002/06/08 17:32:04 keithp Exp $
  *
  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -471,8 +471,9 @@ FcConfigPromote (FcValue v, FcValue u)
     }
     else if (v.type == FcTypeVoid && u.type == FcTypeMatrix)
     {
-       v.u.m = (FcMatrix *) &FcIdentityMatrix;
-       v.type = FcTypeMatrix;
+       v.u.m = FcMatrixCopy (&FcIdentityMatrix);
+       if (v.u.m)
+           v.type = FcTypeMatrix;
     }
     return v;
 }
@@ -559,8 +560,8 @@ FcConfigCompareValue (FcValue       m,
        case FcTypeCharSet:
            switch (op) {
            case FcOpContains:
-               /* m contains v if v - m is empty */
-               ret = FcCharSetSubtractCount (v.u.c, m.u.c) == 0;
+               /* m contains v if v is a subset of m */
+               ret = FcCharSetIsSubset (v.u.c, m.u.c);
                break;
            case FcOpEqual:
                ret = FcCharSetEqual (m.u.c, v.u.c);
@@ -582,6 +583,17 @@ FcConfigCompareValue (FcValue      m,
                break;
            }
            break;
+       case FcTypeFTFace:
+           switch (op) {
+           case FcOpEqual:
+               ret = m.u.f == v.u.f;
+               break;
+           case FcOpNotEqual:
+               ret = m.u.f != v.u.f;
+               break;
+           default:
+               break;
+           }
        }
     }
     else
@@ -804,9 +816,9 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
            case FcTypeCharSet:
                switch (e->op) {
                case FcOpContains:
-                   /* vl contains vr if vr - vl is empty */
+                   /* vl contains vr if vr is a subset of vl */
                    v.type = FcTypeBool;
-                   v.u.b = FcCharSetSubtractCount (vr.u.c, vl.u.c) == 0;
+                   v.u.b = FcCharSetIsSubset (vr.u.c, vl.u.c);
                    break;
                case FcOpEqual:
                    v.type = FcTypeBool;
@@ -854,11 +866,12 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
 static FcValueList *
 FcConfigMatchValueList (FcPattern      *p,
                        FcTest          *t,
-                       FcValueList     *v)
+                       FcValueList     *values)
 {
     FcValueList            *ret = 0;
     FcExpr         *e = t->expr;
     FcValue        value;
+    FcValueList            *v;
     
     while (e)
     {
@@ -873,7 +886,7 @@ FcConfigMatchValueList (FcPattern   *p,
            e = 0;
        }
 
-       for (; v; v = v->next)
+       for (v = values; v; v = v->next)
        {
            if (FcConfigCompareValue (v->value, t->op, value))
            {
@@ -889,8 +902,8 @@ FcConfigMatchValueList (FcPattern   *p,
                }
            }
        }
+       FcValueDestroy (value);
     }
-    FcValueDestroy (value);
     return ret;
 }
 
@@ -1015,7 +1028,7 @@ FcConfigPatternAdd (FcPattern     *p,
 {
     if (list)
     {
-       FcPatternElt    *e = FcPatternFind (p, object, FcTrue);
+       FcPatternElt    *e = FcPatternInsertElt (p, object);
     
        if (!e)
            return;
@@ -1030,7 +1043,7 @@ static void
 FcConfigPatternDel (FcPattern  *p,
                    const char  *object)
 {
-    FcPatternElt    *e = FcPatternFind (p, object, FcFalse);
+    FcPatternElt    *e = FcPatternFindElt (p, object);
     if (!e)
        return;
     while (e->values)
@@ -1041,7 +1054,7 @@ static void
 FcConfigPatternCanon (FcPattern            *p,
                      const char    *object)
 {
-    FcPatternElt    *e = FcPatternFind (p, object, FcFalse);
+    FcPatternElt    *e = FcPatternFindElt (p, object);
     if (!e)
        return;
     if (!e->values)
@@ -1094,7 +1107,7 @@ FcConfigSubstitute (FcConfig      *config,
                printf ("FcConfigSubstitute test ");
                FcTestPrint (t);
            }
-           st[i].elt = FcPatternFind (p, t->field, FcFalse);
+           st[i].elt = FcPatternFindElt (p, t->field);
            /*
             * If there's no such field in the font,
             * then FcQualAll matches while FcQualAny does not
@@ -1116,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)
        {