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