[Fontconfig] fontconfig: Branch 'master' - 2 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 27 09:49:34 UTC 2018


 src/fccfg.c               |   12 +-
 test/Makefile.am          |    1 
 test/run-test-conf.sh     |    1 
 test/test-60-generic.json |   34 ++++++++
 test/test-conf.c          |  190 +++++++++++++++++++++++++++++++++++++++++-----
 5 files changed, 215 insertions(+), 23 deletions(-)

New commits:
commit 71c9c7892ab7ddf8964737e80d0465e3e96ac36b
Author: Akira TAGOH <akira at tagoh.org>
Date:   Tue Nov 27 08:50:18 2018 +0000

    Add a test case for FcFontList

diff --git a/test/Makefile.am b/test/Makefile.am
index 14b2c13..2877a8f 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -17,6 +17,7 @@ TESTDATA =			\
 	4x6.pcf			\
 	8x16.pcf		\
 	fonts.conf.in		\
+	test-60-generic.json	\
 	test-90-synthetic.json	\
 	$(NULL)
 
diff --git a/test/run-test-conf.sh b/test/run-test-conf.sh
index 4bcc29c..80a5d6b 100644
--- a/test/run-test-conf.sh
+++ b/test/run-test-conf.sh
@@ -33,4 +33,5 @@ BUILDTESTDIR=${builddir-"$MyPWD"}
 
 RUNNER=../test/test-conf$EXEEXT
 
+$RUNNER $TESTDIR/../conf.d/60-generic.conf $TESTDIR/test-60-generic.json
 $RUNNER $TESTDIR/../conf.d/90-synthetic.conf $TESTDIR/test-90-synthetic.json
diff --git a/test/test-60-generic.json b/test/test-60-generic.json
new file mode 100644
index 0000000..3c2a114
--- /dev/null
+++ b/test/test-60-generic.json
@@ -0,0 +1,34 @@
+{
+    "fonts": [
+        {
+            "family": "Foo",
+            "color": true
+        },
+        {
+            "family": "Bar",
+            "color": false
+        },
+        {
+            "family": "Baz",
+            "color": "DontCare"
+        }
+    ],
+    "tests": [
+        {
+            "method": "list",
+            "query": {
+                "color": true
+            },
+            "result_fs": [
+                {
+                    "family": "Foo",
+                    "color": true
+                },
+                {
+                    "family": "Baz",
+                    "color": "DontCare"
+                }
+            ]
+        }
+    ]
+}
diff --git a/test/test-conf.c b/test/test-conf.c
index 6619ea7..c0a08de 100644
--- a/test/test-conf.c
+++ b/test/test-conf.c
@@ -68,8 +68,34 @@ build_pattern (json_object *obj)
 	}
 	else if (json_object_get_type (iter.val) == json_type_string)
 	{
-	    v.type = FcTypeString;
-	    v.u.s = json_object_get_string (iter.val);
+	    const FcConstant *c = FcNameGetConstant (json_object_get_string (iter.val));
+	    FcBool b;
+
+	    if (c)
+	    {
+		const FcObjectType *o;
+
+		if (strcmp (c->object, iter.key) != 0)
+		{
+		    fprintf (stderr, "E: invalid object type for const\n");
+		    fprintf (stderr, "   actual result: %s\n", iter.key);
+		    fprintf (stderr, "   expected result: %s\n", c->object);
+		    continue;
+		}
+		o = FcNameGetObjectType (c->object);
+		v.type = o->type;
+		v.u.i = c->value;
+	    }
+	    else if (strcmp (json_object_get_string (iter.val), "DontCare") == 0)
+	    {
+		v.type = FcTypeBool;
+		v.u.b = FcDontCare;
+	    }
+	    else
+	    {
+		v.type = FcTypeString;
+		v.u.s = json_object_get_string (iter.val);
+	    }
 	}
 	else if (json_object_get_type (iter.val) == json_type_null)
 	{
@@ -85,12 +111,32 @@ build_pattern (json_object *obj)
     return pat;
 }
 
+static FcFontSet *
+build_fs (json_object *obj)
+{
+    FcFontSet *fs = FcFontSetCreate ();
+    int i, n;
+
+    n = json_object_array_length (obj);
+    for (i = 0; i < n; i++)
+    {
+	json_object *o = json_object_array_get_idx (obj, i);
+	FcPattern *pat;
+
+	if (json_object_get_type (o) != json_type_object)
+	    continue;
+	pat = build_pattern (o);
+	FcFontSetAdd (fs, pat);
+    }
+
+    return fs;
+}
+
 static FcBool
 build_fonts (FcConfig *config, json_object *root)
 {
     json_object *fonts;
     FcFontSet *fs;
-    int i, n;
 
     if (!json_object_object_get_ex (root, "fonts", &fonts) ||
 	json_object_get_type (fonts) != json_type_array)
@@ -98,18 +144,7 @@ build_fonts (FcConfig *config, json_object *root)
 	fprintf (stderr, "W: No fonts defined\n");
 	return FcFalse;
     }
-    fs = FcFontSetCreate ();
-    n = json_object_array_length (fonts);
-    for (i = 0; i < n; i++)
-    {
-	json_object *obj = json_object_array_get_idx (fonts, i);
-	FcPattern *pat;
-
-	if (json_object_get_type (obj) != json_type_object)
-	    continue;
-	pat = build_pattern (obj);
-	FcFontSetAdd (fs, pat);
-    }
+    fs = build_fs (fonts);
     /* FcConfigSetFonts (config, fs, FcSetSystem); */
     if (config->fonts[FcSetSystem])
 	FcFontSetDestroy (config->fonts[FcSetSystem]);
@@ -138,6 +173,7 @@ run_test (FcConfig *config, json_object *root)
 	json_object *obj = json_object_array_get_idx (tests, i);
 	json_object_iter iter;
 	FcPattern *query, *result;
+	FcFontSet *result_fs;
 	const char *method;
 
 	if (json_object_get_type (obj) != json_type_object)
@@ -160,6 +196,8 @@ run_test (FcConfig *config, json_object *root)
 		    fprintf (stderr, "W: invalid type of query: (%s)\n", json_type_to_name (json_object_get_type (iter.val)));
 		    continue;
 		}
+		if (query)
+		    FcPatternDestroy (query);
 		query = build_pattern (iter.val);
 	    }
 	    else if (strcmp (iter.key, "result") == 0)
@@ -169,18 +207,43 @@ run_test (FcConfig *config, json_object *root)
 		    fprintf (stderr, "W: invalid type of result: (%s)\n", json_type_to_name (json_object_get_type (iter.val)));
 		    continue;
 		}
+		if (result)
+		    FcPatternDestroy (result);
 		result = build_pattern (iter.val);
 	    }
+	    else if (strcmp (iter.key, "result_fs") == 0)
+	    {
+		if (json_object_get_type (iter.val) != json_type_array)
+		{
+		    fprintf (stderr, "W: invalid type of result_fs: (%s)\n", json_type_to_name (json_object_get_type (iter.val)));
+		    continue;
+		}
+		if (result_fs)
+		    FcFontSetDestroy (result_fs);
+		result_fs = build_fs (iter.val);
+	    }
 	    else
 	    {
 		fprintf (stderr, "W: unknown object: %s\n", iter.key);
 	    }
 	}
-	if (strcmp (method, "match") == 0)
+	if (method != NULL && strcmp (method, "match") == 0)
 	{
 	    FcPattern *match;
 	    FcResult res;
 
+	    if (!query)
+	    {
+		fprintf (stderr, "E: no query defined.\n");
+		fail++;
+		goto bail;
+	    }
+	    if (!result)
+	    {
+		fprintf (stderr, "E: no result defined.\n");
+		fail++;
+		goto bail;
+	    }
 	    FcConfigSubstitute (config, query, FcMatchPattern);
 	    FcDefaultSubstitute (query);
 	    match = FcFontMatch (config, query, &res);
@@ -220,7 +283,8 @@ run_test (FcConfig *config, json_object *root)
 			}
 		    }
 		} while (FcPatternIterNext (result, &iter));
-	    bail:;
+	    bail:
+		FcPatternDestroy (match);
 	    }
 	    else
 	    {
@@ -228,10 +292,102 @@ run_test (FcConfig *config, json_object *root)
 		fail++;
 	    }
 	}
+	else if (method != NULL && strcmp (method, "list") == 0)
+	{
+	    FcFontSet *fs;
+
+	    if (!query)
+	    {
+		fprintf (stderr, "E: no query defined.\n");
+		fail++;
+		goto bail2;
+	    }
+	    if (!result_fs)
+	    {
+		fprintf (stderr, "E: no result_fs defined.\n");
+		fail++;
+		goto bail2;
+	    }
+	    fs = FcFontList (config, query, NULL);
+	    if (!fs)
+	    {
+		fprintf (stderr, "E: failed on FcFontList\n");
+		fail++;
+	    }
+	    else
+	    {
+		int i;
+
+		if (fs->nfont != result_fs->nfont)
+		{
+		    printf ("E: The number of results is different:\n");
+		    printf ("   actual result: %d\n", fs->nfont);
+		    printf ("   expected result: %d\n", result_fs->nfont);
+		    fail++;
+		    goto bail2;
+		}
+		for (i = 0; i < fs->nfont; i++)
+		{
+		    FcPatternIter iter;
+		    int x, vc;
+
+		    FcPatternIterStart (result_fs->fonts[i], &iter);
+		    do
+		    {
+			vc = FcPatternIterValueCount (result_fs->fonts[i], &iter);
+			for (x = 0; x < vc; x++)
+			{
+			    FcValue vr, vm;
+
+			    if (FcPatternIterGetValue (result_fs->fonts[i], &iter, x, &vr, NULL) != FcResultMatch)
+			    {
+				fprintf (stderr, "E: unable to obtain a value from the expected result\n");
+				fail++;
+				goto bail2;
+			    }
+			    if (FcPatternGet (fs->fonts[i], FcPatternIterGetObject (result_fs->fonts[i], &iter), x, &vm) != FcResultMatch)
+			    {
+				vm.type = FcTypeVoid;
+			    }
+			    if (!FcValueEqual (vm, vr))
+			    {
+				printf ("E: failed to compare %s:\n", FcPatternIterGetObject (result_fs->fonts[i], &iter));
+				printf ("   actual result:");
+				FcValuePrint (vm);
+				printf ("\n   expected result:");
+				FcValuePrint (vr);
+				printf ("\n");
+				fail++;
+				goto bail2;
+			    }
+			}
+		    } while (FcPatternIterNext (result_fs->fonts[i], &iter));
+		}
+	    bail2:
+		FcFontSetDestroy (fs);
+	    }
+	}
 	else
 	{
 	    fprintf (stderr, "W: unknown testing method: %s\n", method);
 	}
+	if (method)
+	    method = NULL;
+	if (result)
+	{
+	    FcPatternDestroy (result);
+	    result = NULL;
+	}
+	if (result_fs)
+	{
+	    FcFontSetDestroy (result_fs);
+	    result_fs = NULL;
+	}
+	if (query)
+	{
+	    FcPatternDestroy (query);
+	    query = NULL;
+	}
     }
 
     return fail == 0;
commit 9d5149ac41e18ab67404ddba41d7ef7e71839ebc
Author: Akira TAGOH <akira at tagoh.org>
Date:   Tue Nov 27 08:50:18 2018 +0000

    Fix FcFontList doesn't return a font with FC_COLOR=true
    
    "color" property has a value more than 1 because the value of FT_HAS_COLOR
    is directly set to it. this seems breaking the behavior of FcFontList with FC_COLOR=true
    because it is more than FcDontCare.
    
    So changing comparison that way.

diff --git a/src/fccfg.c b/src/fccfg.c
index 890991f..a87dfec 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -821,25 +821,25 @@ FcConfigCompareValue (const FcValue	*left_o,
 		break;
 	    case FcOpContains:
 	    case FcOpListing:
-		ret = left.u.b == right.u.b || left.u.b == FcDontCare;
+		ret = left.u.b == right.u.b || left.u.b >= FcDontCare;
 		break;
 	    case FcOpNotEqual:
 		ret = left.u.b != right.u.b;
 		break;
 	    case FcOpNotContains:
-		ret = !(left.u.b == right.u.b || left.u.b == FcDontCare);
+		ret = !(left.u.b == right.u.b || left.u.b >= FcDontCare);
 		break;
 	    case FcOpLess:
-		ret = left.u.b != right.u.b && right.u.b == FcDontCare;
+		ret = left.u.b != right.u.b && right.u.b >= FcDontCare;
 		break;
 	    case FcOpLessEqual:
-		ret = left.u.b == right.u.b || right.u.b == FcDontCare;
+		ret = left.u.b == right.u.b || right.u.b >= FcDontCare;
 		break;
 	    case FcOpMore:
-		ret = left.u.b != right.u.b && left.u.b == FcDontCare;
+		ret = left.u.b != right.u.b && left.u.b >= FcDontCare;
 		break;
 	    case FcOpMoreEqual:
-		ret = left.u.b == right.u.b || left.u.b == FcDontCare;
+		ret = left.u.b == right.u.b || left.u.b >= FcDontCare;
 		break;
 	    default:
 		break;


More information about the Fontconfig mailing list