summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2017-09-16 13:45:02 -0400
committerBehdad Esfahbod <behdad@behdad.org>2017-09-20 13:21:13 -0700
commit2544bc5343d84a1f7e793cdae3569150b0ec3d05 (patch)
tree50a56a3f589c0acf58dcee5b426359a887bcce9e /src
parentc2fcde498a8b7dec012a8da8ffa78f72a65ac50d (diff)
Add FcDontCare value to FcBool
This can be used for FC_VARIABLE=FcDontCare for example, to opt into getting variable fonts for clients that support using them.
Diffstat (limited to 'src')
-rw-r--r--src/fccfg.c8
-rw-r--r--src/fcdbg.c5
-rw-r--r--src/fcmatch.c8
-rw-r--r--src/fcname.c15
4 files changed, 30 insertions, 6 deletions
diff --git a/src/fccfg.c b/src/fccfg.c
index 4f38af1d..e5bc04c3 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -796,14 +796,18 @@ FcConfigCompareValue (const FcValue *left_o,
case FcTypeBool:
switch ((int) op) {
case FcOpEqual:
+ ret = left.u.b == right.u.b;
+ break;
case FcOpContains:
case FcOpListing:
- ret = left.u.b == right.u.b;
+ ret = left.u.b == right.u.b || left.u.b == FcDontCare;
break;
case FcOpNotEqual:
- case FcOpNotContains:
ret = left.u.b != right.u.b;
break;
+ case FcOpNotContains:
+ ret = !(left.u.b == right.u.b || left.u.b == FcDontCare);
+ break;
default:
break;
}
diff --git a/src/fcdbg.c b/src/fcdbg.c
index 40e0d664..29ff44a5 100644
--- a/src/fcdbg.c
+++ b/src/fcdbg.c
@@ -46,7 +46,10 @@ _FcValuePrintFile (FILE *f, const FcValue v)
fprintf (f, "\"%s\"", v.u.s);
break;
case FcTypeBool:
- fprintf (f, "%s", v.u.b ? "True" : "False");
+ fprintf (f,
+ v.u.b == FcTrue ? (FcChar8 *) "True" :
+ v.u.b == FcFalse ? (FcChar8 *) "False" :
+ (FcChar8 *) "DontCare", 0);
break;
case FcTypeMatrix:
fprintf (f, "[%g %g; %g %g]", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
diff --git a/src/fcmatch.c b/src/fcmatch.c
index f2175394..d5eaea70 100644
--- a/src/fcmatch.c
+++ b/src/fcmatch.c
@@ -154,8 +154,12 @@ FcCompareBool (const FcValue *v1, const FcValue *v2, FcValue *bestValue)
if (v2->type != FcTypeBool || v1->type != FcTypeBool)
return -1.0;
- *bestValue = FcValueCanonicalize (v2);
- return (double) v2->u.b != v1->u.b;
+ if (v2->u.b != FcDontCare)
+ *bestValue = FcValueCanonicalize (v2);
+ else
+ *bestValue = FcValueCanonicalize (v1);
+
+ return (double) ((v2->u.b ^ v1->u.b) == 1);
}
static double
diff --git a/src/fcname.c b/src/fcname.c
index 77e74bcc..79e413e1 100644
--- a/src/fcname.c
+++ b/src/fcname.c
@@ -258,6 +258,11 @@ FcNameBool (const FcChar8 *v, FcBool *result)
*result = FcFalse;
return FcTrue;
}
+ if (c0 == 'd' || c0 == 'x' || c0 == '2')
+ {
+ *result = FcDontCare;
+ return FcTrue;
+ }
if (c0 == 'o')
{
c1 = v[1];
@@ -272,6 +277,11 @@ FcNameBool (const FcChar8 *v, FcBool *result)
*result = FcFalse;
return FcTrue;
}
+ if (c1 == 'r')
+ {
+ *result = FcDontCare;
+ return FcTrue;
+ }
}
return FcFalse;
}
@@ -514,7 +524,10 @@ FcNameUnparseValue (FcStrBuf *buf,
case FcTypeString:
return FcNameUnparseString (buf, v.u.s, escape);
case FcTypeBool:
- return FcNameUnparseString (buf, v.u.b ? (FcChar8 *) "True" : (FcChar8 *) "False", 0);
+ return FcNameUnparseString (buf,
+ v.u.b == FcTrue ? (FcChar8 *) "True" :
+ v.u.b == FcFalse ? (FcChar8 *) "False" :
+ (FcChar8 *) "DontCare", 0);
case FcTypeMatrix:
sprintf ((char *) temp, "%g %g %g %g",
v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);