summaryrefslogtreecommitdiff
path: root/src/fccfg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fccfg.c')
-rw-r--r--src/fccfg.c142
1 files changed, 56 insertions, 86 deletions
diff --git a/src/fccfg.c b/src/fccfg.c
index 478f5a6..328b1ac 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -1,5 +1,5 @@
/*
- * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.15 2002/06/21 06:14:45 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.18 2002/07/31 01:36:37 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@@ -438,16 +438,20 @@ FcConfigAddEdit (FcConfig *config,
subst->next = 0;
subst->test = test;
subst->edit = edit;
- if (FcDebug () & FC_DBG_EDIT)
- {
- printf ("Add Subst ");
- FcSubstPrint (subst);
- }
num = 0;
for (t = test; t; t = t->next)
+ {
+ if (t->kind == FcMatchDefault)
+ t->kind = kind;
num++;
+ }
if (config->maxObjects < num)
config->maxObjects = num;
+ if (FcDebug () & FC_DBG_EDIT)
+ {
+ printf ("Add Subst ");
+ FcSubstPrint (subst);
+ }
return FcTrue;
}
@@ -483,7 +487,6 @@ FcConfigCompareValue (FcValue m,
v = FcConfigPromote (v, m);
if (m.type == v.type)
{
- ret = FcFalse;
switch (m.type) {
case FcTypeInteger:
break; /* FcConfigPromote prevents this from happening */
@@ -588,6 +591,19 @@ FcConfigCompareValue (FcValue m,
default:
break;
}
+ break;
+ case FcTypePattern:
+ switch (op) {
+ case FcOpEqual:
+ ret = FcPatternEqual (m.u.p, v.u.p);
+ break;
+ case FcOpNotEqual:
+ ret = !FcPatternEqual (m.u.p, v.u.p);
+ break;
+ default:
+ break;
+ }
+ break;
}
}
else
@@ -658,15 +674,22 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
v.type = FcTypeVoid;
FcValueDestroy (vl);
break;
- case FcOpOr:
- case FcOpAnd:
- case FcOpEqual:
case FcOpContains:
case FcOpNotEqual:
case FcOpLess:
case FcOpLessEqual:
case FcOpMore:
case FcOpMoreEqual:
+ vl = FcConfigEvaluate (p, e->u.tree.left);
+ vr = FcConfigEvaluate (p, e->u.tree.right);
+ v.type = FcTypeBool;
+ v.u.b = FcConfigCompareValue (vl, e->op, vr);
+ FcValueDestroy (vl);
+ FcValueDestroy (vr);
+ break;
+ case FcOpOr:
+ case FcOpAnd:
+ case FcOpEqual:
case FcOpPlus:
case FcOpMinus:
case FcOpTimes:
@@ -696,31 +719,6 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
v.type = FcTypeDouble;
v.u.d = vl.u.d / vr.u.d;
break;
- case FcOpEqual:
- case FcOpContains:
- v.type = FcTypeBool;
- v.u.b = vl.u.d == vr.u.d;
- break;
- case FcOpNotEqual:
- v.type = FcTypeBool;
- v.u.b = vl.u.d != vr.u.d;
- break;
- case FcOpLess:
- v.type = FcTypeBool;
- v.u.b = vl.u.d < vr.u.d;
- break;
- case FcOpLessEqual:
- v.type = FcTypeBool;
- v.u.b = vl.u.d <= vr.u.d;
- break;
- case FcOpMore:
- v.type = FcTypeBool;
- v.u.b = vl.u.d > vr.u.d;
- break;
- case FcOpMoreEqual:
- v.type = FcTypeBool;
- v.u.b = vl.u.d >= vr.u.d;
- break;
default:
v.type = FcTypeVoid;
break;
@@ -742,15 +740,6 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
v.type = FcTypeBool;
v.u.b = vl.u.b && vr.u.b;
break;
- case FcOpEqual:
- case FcOpContains:
- v.type = FcTypeBool;
- v.u.b = vl.u.b == vr.u.b;
- break;
- case FcOpNotEqual:
- v.type = FcTypeBool;
- v.u.b = vl.u.b != vr.u.b;
- break;
default:
v.type = FcTypeVoid;
break;
@@ -758,15 +747,6 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
break;
case FcTypeString:
switch (e->op) {
- case FcOpEqual:
- case FcOpContains:
- v.type = FcTypeBool;
- v.u.b = FcStrCmpIgnoreCase (vl.u.s, vr.u.s) == 0;
- break;
- case FcOpNotEqual:
- v.type = FcTypeBool;
- v.u.b = FcStrCmpIgnoreCase (vl.u.s, vr.u.s) != 0;
- break;
case FcOpPlus:
v.type = FcTypeString;
v.u.s = FcStrPlus (vl.u.s, vr.u.s);
@@ -780,15 +760,6 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
break;
case FcTypeMatrix:
switch (e->op) {
- case FcOpEqual:
- case FcOpContains:
- v.type = FcTypeBool;
- v.u.b = FcMatrixEqual (vl.u.m, vr.u.m);
- break;
- case FcOpNotEqual:
- v.type = FcTypeBool;
- v.u.b = FcMatrixEqual (vl.u.m, vr.u.m);
- break;
case FcOpTimes:
v.type = FcTypeMatrix;
m = malloc (sizeof (FcMatrix));
@@ -808,26 +779,6 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
break;
}
break;
- case FcTypeCharSet:
- switch (e->op) {
- case FcOpContains:
- /* vl contains vr if vr is a subset of vl */
- v.type = FcTypeBool;
- v.u.b = FcCharSetIsSubset (vr.u.c, vl.u.c);
- break;
- case FcOpEqual:
- v.type = FcTypeBool;
- v.u.b = FcCharSetEqual (vl.u.c, vr.u.c);
- break;
- case FcOpNotEqual:
- v.type = FcTypeBool;
- v.u.b = !FcCharSetEqual (vl.u.c, vr.u.c);
- break;
- default:
- v.type = FcTypeVoid;
- break;
- }
- break;
default:
v.type = FcTypeVoid;
break;
@@ -1068,6 +1019,8 @@ FcConfigSubstitute (FcConfig *config,
FcTest *t;
FcEdit *e;
FcValueList *l;
+ FcPattern *p_pat = 0;
+ FcPattern *m;
if (!config)
{
@@ -1089,7 +1042,10 @@ FcConfigSubstitute (FcConfig *config,
if (kind == FcMatchPattern)
s = config->substPattern;
else
+ {
s = config->substFont;
+ (void) FcPatternGetPattern (p, FC_PATTERN, 0, &p_pat);
+ }
for (; s; s = s->next)
{
/*
@@ -1103,7 +1059,15 @@ FcConfigSubstitute (FcConfig *config,
printf ("FcConfigSubstitute test ");
FcTestPrint (t);
}
- st[i].elt = FcPatternFindElt (p, t->field);
+ st[i].elt = 0;
+ if (kind == FcMatchFont && t->kind == FcMatchPattern)
+ m = p_pat;
+ else
+ m = p;
+ if (m)
+ st[i].elt = FcPatternFindElt (m, t->field);
+ else
+ st[i].elt = 0;
/*
* If there's no such field in the font,
* then FcQualAll matches while FcQualAny does not
@@ -1122,7 +1086,7 @@ FcConfigSubstitute (FcConfig *config,
* Check to see if there is a match, mark the location
* to apply match-relative edits
*/
- st[i].value = FcConfigMatchValueList (p, t, st[i].elt->values);
+ st[i].value = FcConfigMatchValueList (m, t, st[i].elt->values);
if (!st[i].value)
break;
if (t->qual == FcQualFirst && st[i].value != st[i].elt->values)
@@ -1148,11 +1112,17 @@ FcConfigSubstitute (FcConfig *config,
*/
l = FcConfigValues (p, e->expr, e->binding);
/*
- * Locate any test associated with this field
+ * Locate any test associated with this field, skipping
+ * tests associated with the pattern when substituting in
+ * the font
*/
for (t = s->test, i = 0; t; t = t->next, i++)
- if (!FcStrCmpIgnoreCase ((FcChar8 *) t->field, (FcChar8 *) e->field))
+ {
+ if ((t->kind == FcMatchFont || kind == FcMatchPattern) &&
+ !FcStrCmpIgnoreCase ((FcChar8 *) t->field,
+ (FcChar8 *) e->field))
break;
+ }
switch (e->op) {
case FcOpAssign:
/*