diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2017-09-16 13:45:02 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2017-09-20 13:21:13 -0700 |
commit | 2544bc5343d84a1f7e793cdae3569150b0ec3d05 (patch) | |
tree | 50a56a3f589c0acf58dcee5b426359a887bcce9e /src | |
parent | c2fcde498a8b7dec012a8da8ffa78f72a65ac50d (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.c | 8 | ||||
-rw-r--r-- | src/fcdbg.c | 5 | ||||
-rw-r--r-- | src/fcmatch.c | 8 | ||||
-rw-r--r-- | src/fcname.c | 15 |
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); |