fontconfig: Branch 'main' - 2 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 13 12:51:27 UTC 2025


 src/fcfreetype.c           |   11 +--
 test/check-consist-nlang.c |  134 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 139 insertions(+), 6 deletions(-)

New commits:
commit bccd17526e9487da6d41d94fd7ddbe5e274c9351
Merge: 9c64ea3 3be1551
Author: Akira TAGOH <akira at tagoh.org>
Date:   Fri Jun 13 12:50:41 2025 +0000

    Merge branch 'issues/480' into 'main'
    
    Fix padding with "und" in pattern elements
    
    Closes #480
    
    See merge request fontconfig/fontconfig!430

commit 3be15518fba589344dbee6def5e1643649f08e96
Author: Akira TAGOH <akira at tagoh.org>
Date:   Fri Jun 13 21:22:53 2025 +0900

    Fix padding with "und" in pattern elements
    
    The original code was added to fix inconsistency of
    the number of *lang objects for corresponding objects though,
    there are some cases that not padding properly.
    This change fixes it.
    
    Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/480
    
    Changelog: fixed

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 05ee100..010ec2a 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -1526,15 +1526,14 @@ FcFreeTypeQueryFaceInternal (const FT_Face   face,
 		    }
 		    free (utf8);
 		    if (lang) {
-			/* pad lang list with 'und' to line up with elt */
-			while (*nlangp < *np) {
-			    if (!FcPatternObjectAddString (pat, objlang, (FcChar8 *)"und"))
-				goto bail1;
-			    ++*nlangp;
-			}
 			if (!FcPatternObjectAddString (pat, objlang, lang))
 			    goto bail1;
 			++*nlangp;
+		    } else {
+			/* Add und as a fallback */
+			if (!FcPatternObjectAddString (pat, objlang, (FcChar8 *)"und"))
+			    goto bail1;
+			++*nlangp;
 		    }
 		    ++*np;
 		}
diff --git a/test/check-consist-nlang.c b/test/check-consist-nlang.c
new file mode 100644
index 0000000..76c5e96
--- /dev/null
+++ b/test/check-consist-nlang.c
@@ -0,0 +1,134 @@
+/* Copyright (C) 2025 fontconfig Authors */
+/* SPDX-License-Identifier: HPND */
+
+#include <fontconfig/fontconfig.h>
+#include <fontconfig/fcfreetype.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+check_consistency (char *file)
+{
+    int ret, id = 0, nfaces = 0, i, err = 0;
+    FcFontSet *fs;
+
+    do {
+        fs = FcFontSetCreate();
+        ret = FcFreeTypeQueryAll (file, id, NULL, &nfaces, fs);
+        if (!ret) {
+            break;
+        }
+        for (i = 0; i < fs->nfont; i++) {
+            FcPattern *pat = fs->fonts[i];
+            FcPatternIter iter;
+            int nobj, nlang;
+
+            //fprintf (stderr, "Checking %s:%u[%d]\n", file, id, i);
+            FcPatternIterStart (pat, &iter);
+            /* check for family */
+            if (!FcPatternFindIter (pat, &iter, FC_FAMILY)) {
+                fprintf (stderr, "No family in %s:%u\n", file, id);
+                err++;
+                break;
+            }
+            nobj = FcPatternIterValueCount (pat, &iter);
+            if (!FcPatternFindIter (pat, &iter, FC_FAMILYLANG)) {
+                fprintf (stderr, "No familylang in %s:%u\n", file, id);
+                err++;
+                break;
+            }
+            nlang = FcPatternIterValueCount (pat, &iter);
+            if (nobj != nlang) {
+                fprintf (stderr, "%s:%u: nfamily: %d nfamilylang: %d\n", file, id, nobj, nlang);
+                err++;
+            }
+            /* check for style */
+            if (!FcPatternFindIter (pat, &iter, FC_STYLE)) {
+                fprintf (stderr, "No style in %s:%u\n", file, id);
+                err++;
+                break;
+            }
+            nobj = FcPatternIterValueCount (pat, &iter);
+            if (!FcPatternFindIter (pat, &iter, FC_STYLELANG)) {
+                fprintf (stderr, "No stylelang in %s:%u\n", file, id);
+                err++;
+                break;
+            }
+            nlang = FcPatternIterValueCount (pat, &iter);
+            if (nobj != nlang) {
+                fprintf (stderr, "%s:%u: nstyle: %d nstylelang: %d\n", file, id, nobj, nlang);
+                err++;
+            }
+            /* check for fullname */
+            if (!FcPatternFindIter (pat, &iter, FC_FULLNAME)) {
+                fprintf (stderr, "No fullname in %s:%u\n", file, id);
+                err++;
+                break;
+            }
+            nobj = FcPatternIterValueCount (pat, &iter);
+            if (!FcPatternFindIter (pat, &iter, FC_FULLNAMELANG)) {
+                fprintf (stderr, "No fullnamelang in %s:%u\n", file, id);
+                err++;
+                break;
+            }
+            nlang = FcPatternIterValueCount (pat, &iter);
+            if (nobj != nlang) {
+                fprintf (stderr, "%s:%u: nfullname: %d nfullnamelang: %d\n", file, id, nobj, nlang);
+                err++;
+            }
+        }
+        id++;
+        FcFontSetDestroy (fs);
+    } while (id < nfaces);
+
+    return err;
+}
+
+int
+scan (char *name)
+{
+    int ret = 0;
+
+    if (FcFileIsDir (name)) {
+        DIR *d;
+        struct dirent *e;
+        char fullname[PATH_MAX];
+        size_t len = strlen (name);
+
+        strcpy (fullname, name);
+        fullname[len] = '/';
+        len++;
+        d = opendir (name);
+        if (!d) {
+            fprintf (stderr, "Unable to open a directory: %s\n", name);
+        } else {
+            while ((e = readdir (d))) {
+                if (e->d_name[0] == '.' &&
+                    (e->d_name[1] == 0 ||
+                     (e->d_name[1] == '.' && e->d_name[2] == 0)))
+                    continue;
+                strcpy (&fullname[len], e->d_name);
+                ret += scan (fullname);
+            }
+        }
+    } else {
+        ret += check_consistency (name);
+    }
+
+    return ret;
+}
+
+int
+main (int argc, char **argv)
+{
+    int i, ret = 0;
+
+    for (i = 1; i < argc; i++) {
+        ret += scan (argv[i]);
+    }
+
+    return ret;
+}


More information about the Fontconfig mailing list