Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package fontconfig for openSUSE:Factory 
checked in at 2026-06-09 14:12:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fontconfig (Old)
 and      /work/SRC/openSUSE:Factory/.fontconfig.new.2375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "fontconfig"

Tue Jun  9 14:12:34 2026 rev:103 rq:1357758 version:2.18.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/fontconfig/fontconfig.changes    2026-06-04 
18:54:55.982403284 +0200
+++ /work/SRC/openSUSE:Factory/.fontconfig.new.2375/fontconfig.changes  
2026-06-09 14:12:54.046187273 +0200
@@ -1,0 +2,12 @@
+Sun Jun  7 10:33:41 UTC 2026 - Gerald Chen <[email protected]>
+
+- Update to 2.18.1
+  * Workaround :-prefixed filename used in Qt
+  * meson: force enabling HAVE_C99_VSNPRINTF
+  * Do not set 'sans-serif' for default genericfamily
+  * Fix another font matching issue
+  * Fix not matching with a font family name
+  * Disable invalid attribute warning by default
+  * boo#1267844
+
+-------------------------------------------------------------------

Old:
----
  fontconfig-2.18.0.tar.bz2

New:
----
  fontconfig-2.18.1.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ fontconfig.spec ++++++
--- /var/tmp/diff_new_pack.0JLcKc/_old  2026-06-09 14:12:56.522289843 +0200
+++ /var/tmp/diff_new_pack.0JLcKc/_new  2026-06-09 14:12:56.534290340 +0200
@@ -18,7 +18,7 @@
 
 Name:           fontconfig
 %define lname   libfontconfig1
-Version:        2.18.0
+Version:        2.18.1
 Release:        0
 Summary:        Library for Font Configuration
 License:        MIT

++++++ fontconfig-2.18.0.tar.bz2 -> fontconfig-2.18.1.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/.gitlab-ci/.abidiff 
new/fontconfig-2.18.1/.gitlab-ci/.abidiff
--- old/fontconfig-2.18.0/.gitlab-ci/.abidiff   1970-01-01 01:00:00.000000000 
+0100
+++ new/fontconfig-2.18.1/.gitlab-ci/.abidiff   2026-06-02 13:51:50.000000000 
+0200
@@ -0,0 +1,5 @@
+[suppress_type]
+type_kind = struct
+name = _FcConfig
+has_size_change = yes
+has_data_member_inserted_at = end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/.gitlab-ci/abicheck.sh 
new/fontconfig-2.18.1/.gitlab-ci/abicheck.sh
--- old/fontconfig-2.18.0/.gitlab-ci/abicheck.sh        2026-05-21 
15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/.gitlab-ci/abicheck.sh        2026-06-02 
13:51:50.000000000 +0200
@@ -77,4 +77,4 @@
 copyresult "$basebuilddir/build" "old"
 cp -L "$basebuilddir/build/libfontconfig-old.so" "$newbuilddir"
 
-abidiff --no-added-syms "$newbuilddir/libfontconfig-old.so" 
"$newbuilddir/libfontconfig-new.so" | python3 ./.gitlab-ci/abidiff2xml.py -o 
"$newbuilddir/abidiff.xml" -
+abidiff --no-added-syms --suppressions $cihomedir/.abidiff 
"$newbuilddir/libfontconfig-old.so" "$newbuilddir/libfontconfig-new.so" | 
python3 ./.gitlab-ci/abidiff2xml.py -o "$newbuilddir/abidiff.xml" -
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/NEWS new/fontconfig-2.18.1/NEWS
--- old/fontconfig-2.18.0/NEWS  2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/NEWS  2026-06-02 13:51:50.000000000 +0200
@@ -1,12 +1,33 @@
                               Fontconfig
              Font configuration and customization library
-                             Version 2.18
-                              2026-05-21
+                            Version 2.18.1
+                              2026-06-02
 
 
 Check INSTALL for compilation and installation instructions.
 Report bugs to https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/new.
 
+2.18.1
+
+Akira TAGOH (11):
+      ci: Fix wrong short options for glab
+      Fix not matching with a font family name
+      test-conf: Add a feature to load a certain config for testing
+      test: Add comprehensive documentation for test-conf JSON format
+      Fix another font matching issue
+      Do not set 'sans-serif' for default genericfamily
+      test: use const instead of number for genericfamily
+      meson: force enabling HAVE_C99_VSNPRINTF
+      Disable invalid attribute warning by default
+      ci: Add .abidiff for suppression
+      Workaround :-prefixed filename used in Qt
+
+Jan Alexander Steffens (heftig) (1):
+      meson: Only install 05-macos.conf on darwin
+
+Marcus Spencer (1):
+      Fix a null pointer dereference when computing a pattern from an FT_Face 
that has no family
+
 2.18
 
 Akira TAGOH (79):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/conf.d/49-sansserif.conf 
new/fontconfig-2.18.1/conf.d/49-sansserif.conf
--- old/fontconfig-2.18.0/conf.d/49-sansserif.conf      2026-05-21 
15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/conf.d/49-sansserif.conf      2026-06-02 
13:51:50.000000000 +0200
@@ -45,27 +45,6 @@
     </edit>
   </match>
 
-  <!--
-      If the font still has no generic name, add sans-serif
-  -->
-  <match target="pattern">
-       <test qual="all" name="family" compare="not_eq">
-         <string>sans-serif</string>
-       </test>
-       <test qual="all" name="family" compare="not_eq">
-         <string>serif</string>
-       </test>
-       <test qual="all" name="family" compare="not_eq">
-         <string>monospace</string>
-       </test>
-    <test qual="all" name="genericfamily" compare="contains">
-      <const xsi:nil="true" />
-    </test>
-    <edit name="genericfamily" mode="append">
-      <const>sans-serif</const>
-    </edit>
-  </match>
-
   <match target="pattern">
        <test qual="all" name="family" compare="not_eq">
          <string>sans-serif</string>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/conf.d/meson.build 
new/fontconfig-2.18.1/conf.d/meson.build
--- old/fontconfig-2.18.0/conf.d/meson.build    2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/conf.d/meson.build    2026-06-02 13:51:50.000000000 
+0200
@@ -1,5 +1,4 @@
 conf_files = [
-  '05-macos.conf',
   '05-reset-dirs-sample.conf',
   '09-autohint-if-no-hinting.conf',
   '10-autohint.conf',
@@ -50,7 +49,6 @@
 preferred_bitmap = get_option('bitmap-conf')
 
 conf_links = [
-  '05-macos.conf',
   '10-scale-bitmap-fonts.conf',
   '10-yes-antialias.conf',
   '11-lcdfilter-default.conf',
@@ -73,6 +71,11 @@
   '90-synthetic.conf',
 ]
 
+if host_machine.system() == 'darwin'
+  conf_files += '05-macos.conf'
+  conf_links += '05-macos.conf'
+endif
+
 if preferred_hinting != 'noinstall'
   conf_links += '10-hinting-@[email protected]'.format(preferred_hinting)
 endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/configure.ac 
new/fontconfig-2.18.1/configure.ac
--- old/fontconfig-2.18.0/configure.ac  2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/configure.ac  2026-06-02 13:51:50.000000000 +0200
@@ -33,7 +33,7 @@
 dnl version.  This same version number must appear in fontconfig/fontconfig.h
 dnl Yes, it is a pain to synchronize version numbers.  Unfortunately, it's
 dnl not possible to extract the version number here from fontconfig.h
-AC_INIT([fontconfig],[2.18.0],[https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/new])
+AC_INIT([fontconfig],[2.18.1],[https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/new])
 AM_INIT_AUTOMAKE([1.11 parallel-tests dist-xz foreign])
 m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/doc/fcconfig.fncs 
new/fontconfig-2.18.1/doc/fcconfig.fncs
--- old/fontconfig-2.18.0/doc/fcconfig.fncs     2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/doc/fcconfig.fncs     2026-06-02 13:51:50.000000000 
+0200
@@ -283,6 +283,29 @@
 If <parameter>config</parameter> is NULL, the current configuration is used.
 @@
 
+@RET@           void
+@FUNC@          FcConfigSetWarningFlags
+@TYPE1@         FcConfig *                      @ARG1@          config
+@TYPE2@         int%                            @ARG2@          warn
+@TYPE3@         FcBool%                         @ARG3@          flag
+@PURPOSE@       Enable or disable specific warning types
+@DESC@
+Turn on or off warning types specified by <parameter>warn</parameter>.
+Each bit corresponds to a different warning type defined by FC_WARN_* macros.
+If <parameter>config</parameter> is NULL, the current configuration is 
modified.
+@@
+
+@RET@           int
+@FUNC@          FcConfigGetWarningFlags
+@TYPE1@         FcConfig *                      @ARG1@          config
+@PURPOSE@       Retrieve the enabled warning flags
+@DESC@
+Returns a bitmask of the currently enabled warning flags. Each bit in the 
returned
+integer correeesponds to a different warning type defined by FC_WARN_* macros.
+If <parameter>config</parameter> is NULL, the warning flags for the current
+configuration are returned.
+@@
+
 @RET@           FcBool
 @FUNC@          FcConfigSubstituteWithPat
 @TYPE1@         FcConfig *                      @ARG1@          config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/doc/fontconfig-user.sgml 
new/fontconfig-2.18.1/doc/fontconfig-user.sgml
--- old/fontconfig-2.18.0/doc/fontconfig-user.sgml      2026-05-21 
15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/doc/fontconfig-user.sgml      2026-06-02 
13:51:50.000000000 +0200
@@ -898,6 +898,10 @@
 <emphasis>SOURCE_DATE_EPOCH</emphasis>
 is used to ensure <literal>fc-cache(1)</literal> generates files in a 
deterministic manner in order to support reproducible builds. When set to a 
numeric representation of UNIX timestamp, fontconfig will prefer this value 
over using the modification timestamps of the input files in order to identify 
which cache files require regeneration. If <literal>SOURCE_DATE_EPOCH</literal> 
is not set (or is newer than the mtime of the directory), the existing 
behaviour is unchanged.
   </para>
+  <para>
+<emphasis>FONTCONFIG_WARN_INVALID_ATTRS</emphasis>
+is used to get back the invalid attribute warning for config files.
+  </para>
 </refsect1>
 <refsect1><title>See Also</title>
   <para>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/fc-list/fc-list.c 
new/fontconfig-2.18.1/fc-list/fc-list.c
--- old/fontconfig-2.18.0/fc-list/fc-list.c     2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/fc-list/fc-list.c     2026-06-02 13:51:50.000000000 
+0200
@@ -159,6 +159,7 @@
     i = 1;
 #endif
 
+    FcConfigSetWarningFlags (NULL, -1, FcTrue);
     if (argv[i]) {
        pat = FcNameParse ((FcChar8 *)argv[i]);
        if (!pat) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/fc-match/fc-match.c 
new/fontconfig-2.18.1/fc-match/fc-match.c
--- old/fontconfig-2.18.0/fc-match/fc-match.c   2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/fc-match/fc-match.c   2026-06-02 13:51:50.000000000 
+0200
@@ -183,6 +183,7 @@
     if (!pat)
        return 1;
 
+    FcConfigSetWarningFlags (NULL, -1, FcTrue);
     FcConfigSubstitute (0, pat, FcMatchPattern);
     FcConfigSetDefaultSubstitute (0, pat);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/fc-pattern/fc-pattern.c 
new/fontconfig-2.18.1/fc-pattern/fc-pattern.c
--- old/fontconfig-2.18.0/fc-pattern/fc-pattern.c       2026-05-21 
15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/fc-pattern/fc-pattern.c       2026-06-02 
13:51:50.000000000 +0200
@@ -165,6 +165,7 @@
     if (!pat)
        return 1;
 
+    FcConfigSetWarningFlags (NULL, -1, FcTrue);
     if (do_config)
        FcConfigSubstitute (0, pat, FcMatchPattern);
     if (do_default)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/fc-scan/fc-scan.c 
new/fontconfig-2.18.1/fc-scan/fc-scan.c
--- old/fontconfig-2.18.0/fc-scan/fc-scan.c     2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/fc-scan/fc-scan.c     2026-06-02 13:51:50.000000000 
+0200
@@ -157,6 +157,7 @@
        FcConfigSetSysRoot (NULL, sysroot);
        FcStrFree (sysroot);
     }
+    FcConfigSetWarningFlags (NULL, -1, FcTrue);
     fs = FcFontSetCreate();
 
     for (; i < argc; i++) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/fontconfig/fontconfig.h.in 
new/fontconfig-2.18.1/fontconfig/fontconfig.h.in
--- old/fontconfig-2.18.0/fontconfig/fontconfig.h.in    2026-05-21 
15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/fontconfig/fontconfig.h.in    2026-06-02 
13:51:50.000000000 +0200
@@ -55,7 +55,7 @@
 
 #define FC_MAJOR                2
 #define FC_MINOR                18
-#define FC_REVISION             0
+#define FC_REVISION             1
 
 #define FC_VERSION              ((FC_MAJOR * 10000) + (FC_MINOR * 100) + 
(FC_REVISION))
 
@@ -224,6 +224,9 @@
 #define FC_FAMILY_MATH          12
 #define FC_FAMILY_FANGSONG      13
 
+/* Warnings */
+#define FC_WARN_INVALID_ATTR    (1 << 0)
+
 typedef enum _FcType {
     FcTypeUnknown = -1,
     FcTypeVoid,
@@ -513,6 +516,12 @@
 FcPublic void
 FcConfigPreferAppFont (FcConfig *config, FcBool flag);
 
+FcPublic void
+FcConfigSetWarningFlags (FcConfig *config, int warn, FcBool flag);
+
+FcPublic int
+FcConfigGetWarningFlags (FcConfig *config);
+
 FcPublic FcBool
 FcConfigSubstituteWithPat (FcConfig   *config,
                            FcPattern  *p,
@@ -1204,7 +1213,6 @@
                       FcPattern     *pat,
                       const FcChar8 *font_path);
 
-
 _FCFUNCPROTOEND
 
 #undef FC_ATTRIBUTE_SENTINEL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/meson.build 
new/fontconfig-2.18.1/meson.build
--- old/fontconfig-2.18.0/meson.build   2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/meson.build   2026-06-02 13:51:50.000000000 +0200
@@ -1,5 +1,5 @@
 project('fontconfig', 'c',
-  version: '2.18.0',
+  version: '2.18.1',
   meson_version : '>= 1.11.0',
   default_options: [
     'c_std=c11,c99',
@@ -339,9 +339,7 @@
   conf.set('HAVE_SOLARIS_ATOMIC_OPS', 1)
 endif
 
-if cc.links(files('meson-cc-tests/c99-vsnprint-test.c'), name: 'C99 compliant 
vsnprintf()')
-  conf.set('HAVE_C99_VSNPRINTF', 1)
-endif
+conf.set('HAVE_C99_VSNPRINTF', 1)
 
 prefix = get_option('prefix')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/src/fccfg.c 
new/fontconfig-2.18.1/src/fccfg.c
--- old/fontconfig-2.18.0/src/fccfg.c   2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/src/fccfg.c   2026-06-02 13:51:50.000000000 +0200
@@ -217,6 +217,7 @@
     config->desktop_name = NULL;
 
     config->prefer_app_fonts = FcFalse;
+    config->warns = 0;
 
     FcRefInit (&config->ref, 1);
     FcObjectInit();
@@ -2827,6 +2828,61 @@
     FcConfigDestroy (config);
 }
 
+void
+FcConfigSetWarningFlags (FcConfig *config, int warn, FcBool flag)
+{
+    FcBool init = FcFalse;
+    int    nretry = 3;
+
+retry:
+    if (!config) {
+       /* We can't use FcConfigGetCurrent() here to initialize
+        * bitfields before loading config files
+        */
+       config = fc_atomic_ptr_get (&_fcConfig);
+       if (!config) {
+           config = FcConfigCreate();
+           if (!config)
+               return;
+           init = FcTrue;
+       }
+    }
+    if (flag)
+       config->warns |= warn;
+    else
+       config->warns ^= warn;
+
+    if (init) {
+       config = FcInitLoadOwnConfigAndFonts (config);
+       if (!config) {
+           /* Something failed. this is usually unlikely. so retrying */
+           init = FcFalse;
+           if (--nretry == 0) {
+               fprintf (stderr, "Fontconfig warning: Unable to initialize 
config and retry limit exceeded. all warning flags are turned off.\n");
+               return;
+           }
+           goto retry;
+       }
+       FcConfigSetCurrent (config);
+       FcConfigDestroy (config);
+    }
+}
+
+int
+FcConfigGetWarningFlags (FcConfig *config)
+{
+    int ret;
+
+    config = FcConfigReference (config);
+    if (!config)
+       return 0;
+    ret = config->warns;
+
+    FcConfigDestroy (config);
+
+    return ret;
+}
+
 /*
  * Manage filename-based font source selectors
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/src/fcfreetype.c 
new/fontconfig-2.18.1/src/fcfreetype.c
--- old/fontconfig-2.18.0/src/fcfreetype.c      2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/src/fcfreetype.c      2026-06-02 13:51:50.000000000 
+0200
@@ -1714,7 +1714,13 @@
            goto bail1;
     }
 
-    canon_file = FcStrCanonFilename(file);
+    /* Qt6 seems using :-prefixing to take care of some special case.
+     * Do not call FcStrCanonFilename not to break that
+     */
+    if (file[0] != ':')
+       canon_file = FcStrCanonFilename (file);
+    else
+       canon_file = file;
     if (canon_file && *canon_file && !FcPatternObjectAddString (pat, 
FC_FILE_OBJECT, canon_file))
        goto bail1;
 
@@ -2080,28 +2086,31 @@
        int generic_family = FC_FAMILY_UNKNOWN;
 
        elt = FcPatternObjectFindElt (pat, FC_FAMILY_OBJECT);
-       for (l = FcPatternEltValues (elt); l; l = FcValueListNext (l)) {
-           FcValue v = FcValueCanonicalize (&l->value);
-
-           if (v.type == FcTypeString) {
-               if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"mono")) {
-                   generic_family = FC_FAMILY_MONO;
-                   break;
-               } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"sans")) {
-                   generic_family = FC_FAMILY_SANS;
-                   break;
-               } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"serif")) {
-                   generic_family = FC_FAMILY_SERIF;
-                   break;
-               } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"emoji")) {
-                   generic_family = FC_FAMILY_EMOJI;
-                   break;
-               } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"math")) {
-                   generic_family = FC_FAMILY_MATH;
-                   break;
+       if (elt) {
+           for (l = FcPatternEltValues (elt); l; l = FcValueListNext (l)) {
+               FcValue v = FcValueCanonicalize (&l->value);
+
+               if (v.type == FcTypeString) {
+                   if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"mono")) {
+                       generic_family = FC_FAMILY_MONO;
+                       break;
+                   } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"sans")) {
+                       generic_family = FC_FAMILY_SANS;
+                       break;
+                   } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"serif")) {
+                       generic_family = FC_FAMILY_SERIF;
+                       break;
+                   } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"emoji")) {
+                       generic_family = FC_FAMILY_EMOJI;
+                       break;
+                   } else if (FcStrStrIgnoreCase (v.u.s, (FcChar8 *)"math")) {
+                       generic_family = FC_FAMILY_MATH;
+                       break;
+                   }
                }
            }
        }
+
        FcPatternObjectAddInteger(pat, FC_GENERIC_FAMILY_OBJECT, 
generic_family);
     }
 
@@ -2111,7 +2120,7 @@
     FcCharSetDestroy (cs);
     if (foundry_)
        free (foundry_);
-    if (canon_file)
+    if (canon_file && canon_file != file)
        free (canon_file);
 
     if (mmvar) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/src/fcint.h 
new/fontconfig-2.18.1/src/fcint.h
--- old/fontconfig-2.18.0/src/fcint.h   2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/src/fcint.h   2026-06-02 13:51:50.000000000 +0200
@@ -628,6 +628,8 @@
     FcStrSet *default_langs; /* String sets of the default languages */
     FcChar8  *prgname;       /* Program name of current process */
     FcChar8  *desktop_name;  /* Current desktop name */
+
+    int warns; /* Bitfield of warning flags (FC_WARN_*) controlling which 
warnings to emit */
 };
 
 typedef struct _FcFileTime {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/src/fcmatch.c 
new/fontconfig-2.18.1/src/fcmatch.c
--- old/fontconfig-2.18.0/src/fcmatch.c 2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/src/fcmatch.c 2026-06-02 13:51:50.000000000 +0200
@@ -165,6 +165,41 @@
 }
 
 static double
+FcCompareEqual (const FcValue *value1, const FcValue *value2, FcValue 
*bestValue)
+{
+    double v1, v2, v;
+
+    switch ((int)value1->type) {
+    case FcTypeInteger:
+       v1 = (double)value1->u.i;
+       break;
+    case FcTypeDouble:
+       v1 = value1->u.d;
+       break;
+    case FcTypeBool:
+       return FcCompareBool (value1, value2, bestValue);
+    default:
+       return -1.0;
+    }
+    switch ((int)value2->type) {
+    case FcTypeInteger:
+       v2 = (double)value2->u.i;
+       break;
+    case FcTypeDouble:
+       v2 = value2->u.d;
+       break;
+    case FcTypeBool:
+       return FcCompareBool (value1, value2, bestValue);
+    default:
+       return -1.0;
+    }
+    v = !(v1 == v2);
+    *bestValue = FcValueCanonicalize (value2);
+
+    return v;
+}
+
+static double
 FcCompareCharSet (const FcValue *v1, const FcValue *v2, FcValue *bestValue)
 {
     *bestValue = FcValueCanonicalize (v2); /* TODO Improve. */
@@ -296,6 +331,7 @@
 #define PRI_FcCompareFamily(n)     PRI1 (n)
 #define PRI_FcCompareString(n)     PRI1 (n)
 #define PRI_FcCompareNumber(n)     PRI1 (n)
+#define PRI_FcCompareEqual(n)      PRI1 (n)
 #define PRI_FcCompareBool(n)       PRI1 (n)
 #define PRI_FcCompareFilename(n)   PRI1 (n)
 #define PRI_FcCompareCharSet(n)    PRI1 (n)
@@ -330,8 +366,8 @@
     PRI1 (COLOR),
     PRI1 (FOUNDRY),
     PRI1 (CHARSET),
-    PRI1 (GENERIC_FAMILY),
     PRI_FAMILY_STRONG,
+    PRI1 (GENERIC_FAMILY),
     PRI_POSTSCRIPT_NAME_STRONG,
     PRI1 (LANG),
     PRI_FAMILY_WEAK,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/src/fcobjs.h 
new/fontconfig-2.18.1/src/fcobjs.h
--- old/fontconfig-2.18.0/src/fcobjs.h  2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/src/fcobjs.h  2026-06-02 13:51:50.000000000 +0200
@@ -77,5 +77,5 @@
 FC_OBJECT (DESKTOP_NAME,       FcTypeString,   NULL)
 FC_OBJECT (NAMED_INSTANCE,     FcTypeBool,     FcCompareBool)
 FC_OBJECT (FONT_WRAPPER,       FcTypeString,   FcCompareString)
-FC_OBJECT (GENERIC_FAMILY,     FcTypeInteger,  FcCompareNumber)
+FC_OBJECT (GENERIC_FAMILY,     FcTypeInteger,  FcCompareEqual)
 /* ^-------------- Add new objects here. */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/src/fcxml.c 
new/fontconfig-2.18.1/src/fcxml.c
--- old/fontconfig-2.18.0/src/fcxml.c   2026-05-21 15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/src/fcxml.c   2026-06-02 13:51:50.000000000 +0200
@@ -1194,7 +1194,9 @@
 static FcBool
 FcPStackPop (FcConfigParse *parse)
 {
-    FcPStack *old;
+    FcPStack     *old;
+    static FcBool retrieved = FcFalse;
+    const char   *env = NULL;
 
     if (!parse->pstack) {
        FcConfigMessage (parse, FcSevereError, "mismatching element");
@@ -1204,13 +1206,25 @@
     /* Don't check the attributes for FcElementNone */
     if (parse->pstack->element != FcElementNone &&
         parse->pstack->attr) {
-       /* Warn about unused attrs. */
-       FcChar8 **attrs = parse->pstack->attr;
-       while (*attrs) {
-           if (attrs[0][0]) {
-               FcConfigMessage (parse, FcSevereWarning, "invalid attribute 
'%s'", attrs[0]);
+       if (!retrieved) {
+           FcBool flag = FcFalse;
+
+           env = getenv ("FONTCONFIG_WARN_INVALID_ATTRS");
+           if (env && FcNameBool ((const FcChar8 *)env, &flag)) {
+               retrieved = FcTrue;
+               FcConfigSetWarningFlags (parse->config, FC_WARN_INVALID_ATTR, 
flag);
+           }
+       }
+       /* Warn only when a flag is turned on */
+       if (FcConfigGetWarningFlags (parse->config) & FC_WARN_INVALID_ATTR) {
+           /* Warn about unused attrs. */
+           FcChar8 **attrs = parse->pstack->attr;
+           while (*attrs) {
+               if (attrs[0][0]) {
+                   FcConfigMessage (parse, FcSevereWarning, "invalid attribute 
'%s'", attrs[0]);
+               }
+               attrs += 2;
            }
-           attrs += 2;
        }
     }
 
@@ -1735,7 +1749,7 @@
        }
        FcVStackPopAndDestroy (parse);
     }
- bail:
+bail:
     if (n > 0)
        FcVStackPushLangSet (parse, langset);
     else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/Makefile.am 
new/fontconfig-2.18.1/test/Makefile.am
--- old/fontconfig-2.18.0/test/Makefile.am      2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/test/Makefile.am      2026-06-02 13:51:50.000000000 
+0200
@@ -104,7 +104,7 @@
 
 if ENABLE_JSONC
 check_PROGRAMS += test-conf
-test_conf_CFLAGS = $(JSONC_CFLAGS)
+test_conf_CFLAGS = $(JSONC_CFLAGS) -DSRCDIR="\"$(abs_srcdir)\""
 test_conf_LDADD = $(top_builddir)/src/libfontconfig.la $(JSONC_LIBS)
 endif
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/TEST-JSON-FORMAT.md 
new/fontconfig-2.18.1/test/TEST-JSON-FORMAT.md
--- old/fontconfig-2.18.0/test/TEST-JSON-FORMAT.md      1970-01-01 
01:00:00.000000000 +0100
+++ new/fontconfig-2.18.1/test/TEST-JSON-FORMAT.md      2026-06-02 
13:51:50.000000000 +0200
@@ -0,0 +1,482 @@
+# Fontconfig Test JSON Format Documentation
+
+This document describes the JSON format used by the `test-conf` test harness 
for testing fontconfig behavior.
+
+## Overview
+
+The test JSON format allows you to define:
+- A mock font database with specific font properties
+- Environment variables and configuration files to load
+- Test queries and expected results
+
+## Top-Level Structure
+
+```json
+{
+  "env": { ... },
+  "fonts": [ ... ],
+  "appfonts": [ ... ],
+  "filter": { ... },
+  "load_xml": [ ... ],
+  "tests": [ ... ]
+}
+```
+
+### Fields
+
+#### `env` (optional)
+Type: Object
+
+Environment variables to set before running tests. Special key `"locale"` 
calls `setlocale()` instead of `setenv()`.
+
+**Example:**
+```json
+{
+  "env": {
+    "locale": "de_DE.UTF-8",
+    "FC_DEBUG": "1"
+  }
+}
+```
+
+#### `fonts` (required)
+Type: Array of Pattern objects
+
+Defines the system font database. Each entry represents a font with its 
properties.
+
+**Example:**
+```json
+{
+  "fonts": [
+    {
+      "family": "Noto Sans",
+      "style": "Regular",
+      "file": "/path/to/NotoSans.ttf",
+      "fontversion": 1
+    }
+  ]
+}
+```
+
+#### `appfonts` (optional)
+Type: Array of Pattern objects
+
+Defines application-level fonts, which can take precedence over system fonts 
depending on configuration.
+
+**Example:**
+```json
+{
+  "appfonts": [
+    {
+      "family": "Custom Font",
+      "file": "/app/path/to/CustomFont.ttf",
+      "fontversion": 2
+    }
+  ]
+}
+```
+
+#### `filter` (optional)
+Type: Pattern object
+
+A pattern used to filter which fonts from the `fonts` array are actually 
included in the font set. Only fonts matching all properties in the filter 
pattern are included.
+
+**Example:**
+```json
+{
+  "filter": {
+    "fontwrapper": "SFNT"
+  }
+}
+```
+
+#### `load_xml` (optional)
+Type: Array of strings
+
+List of fontconfig XML configuration files to load and apply. Use `%test%` as 
a placeholder for the test directory (defined by SRCDIR).
+
+**Example:**
+```json
+{
+  "load_xml": [
+    "conf.d/48-guessfamily.conf",
+    "conf.d/49-sansserif.conf",
+    "%test%/test-custom.conf"
+  ]
+}
+```
+
+#### `tests` (required)
+Type: Array of Test objects
+
+Test cases to execute against the configured fontconfig instance.
+
+## Pattern Object Format
+
+Patterns are used in `fonts`, `appfonts`, `filter`, test `query`, and test 
`result` objects. A pattern is a JSON object where keys are fontconfig property 
names and values specify the property values.
+
+### Value Types
+
+#### String Values
+
+Simple string properties:
+```json
+{
+  "family": "Noto Sans",
+  "style": "Regular",
+  "file": "/path/to/font.ttf"
+}
+```
+
+For properties that expect constants (like `weight`, `slant`, `width`), you 
can use constant names:
+```json
+{
+  "weight": "bold",
+  "slant": "italic",
+  "width": "condensed"
+}
+```
+
+Special string value:
+- `"DontCare"`: Represents the FcDontCare boolean value
+
+#### Numeric Values
+
+Integer or double values:
+```json
+{
+  "fontversion": 1,
+  "size": 12.5,
+  "weight": 200,
+  "index": 0
+}
+```
+
+#### Boolean Values
+
+```json
+{
+  "scalable": true,
+  "variable": false,
+  "namedinstance": false,
+  "embolden": true
+}
+```
+
+#### Null Values
+
+```json
+{
+  "embolden": null
+}
+```
+
+#### Array Values
+
+Arrays are interpreted based on the property type and array content:
+
+**String Arrays** (for properties like `family`, `style`):
+```json
+{
+  "family": ["Noto Sans", "sans-serif"],
+  "style": ["Regular", "Normal"]
+}
+```
+
+**Charset Arrays** (for `charset` property):
+Each element is a single UTF-8 character (codepoint):
+```json
+{
+  "charset": ["a", "b", "c", "あ", "😀"]
+}
+```
+
+**LangSet Arrays** (for `lang` property):
+Each element is a language code:
+```json
+{
+  "lang": ["en", "de", "ja"]
+}
+```
+
+**Integer Arrays** (for properties like `weight` when multiple values needed):
+```json
+{
+  "weight": [80, 100, 200]
+}
+```
+Can also use constant names:
+```json
+{
+  "weight": ["light", "medium", "bold"]
+}
+```
+
+**Double Arrays** (for properties expecting multiple double values):
+```json
+{
+  "dpi": [96.0, 120.0]
+}
+```
+
+**Range Arrays** (2-element numeric array):
+```json
+{
+  "size": [8.0, 48.0]
+}
+```
+
+**Matrix Arrays** (4-element numeric array `[xx, xy, yx, yy]`):
+```json
+{
+  "matrix": [1.0, 0.0, 0.0, 1.0]
+}
+```
+
+## Test Object Format
+
+```json
+{
+  "method": "match",
+  "config": { ... },
+  "query": { ... },
+  "result": { ... },
+  "result_fs": [ ... ],
+  "$comment": "Optional comment"
+}
+```
+
+### Fields
+
+#### `method` (required)
+Type: String
+
+The test method to use. Valid values:
+- `"match"`: Test `FcFontMatch()` - find the best matching font
+- `"list"`: Test `FcFontList()` - list all fonts matching a pattern
+- `"sort"`: Test `FcFontSort()` with trimming - sorted list of matching fonts 
(trimmed)
+- `"sort_all"`: Test `FcFontSort()` without trimming - sorted list of all 
matching fonts
+- `"pattern"`: Test `FcConfigSubstitute()` - pattern substitution without font 
matching
+
+#### `config` (optional)
+Type: Object
+
+Per-test configuration options applied before running the test.
+
+**Supported options:**
+- `"prefer_app_font"`: Boolean - whether to prefer application fonts over 
system fonts
+
+**Example:**
+```json
+{
+  "config": {
+    "prefer_app_font": true
+  }
+}
+```
+
+#### `query` (required)
+Type: Pattern object
+
+The input pattern for the query.
+
+**Example:**
+```json
+{
+  "query": {
+    "family": "Noto Sans",
+    "weight": "bold",
+    "size": 12.0
+  }
+}
+```
+
+#### `result` (required for `match` and `pattern` methods)
+Type: Pattern object
+
+The expected result pattern. The test verifies that all properties specified 
in this pattern match the corresponding properties in the actual result.
+
+**Example:**
+```json
+{
+  "result": {
+    "family": "Noto Sans",
+    "file": "/path/to/NotoSans-Bold.ttf",
+    "weight": 200
+  }
+}
+```
+
+#### `result_fs` (required for `list`, `sort`, and `sort_all` methods)
+Type: Array of Pattern objects
+
+The expected result font set. The test verifies:
+1. The number of results matches
+2. Each result pattern matches the expected pattern at the same index
+
+**Example:**
+```json
+{
+  "result_fs": [
+    {
+      "family": "Noto Sans",
+      "file": "/path/to/NotoSans-Regular.ttf"
+    },
+    {
+      "family": "Noto Sans",
+      "file": "/path/to/NotoSans-Bold.ttf"
+    }
+  ]
+}
+```
+
+#### `$comment` (optional)
+Type: String
+
+A comment field that is ignored by the test runner. Use for documentation 
purposes.
+
+**Example:**
+```json
+{
+  "$comment": "This test verifies that bold synthesis works correctly"
+}
+```
+
+## Common Pattern Properties
+
+Here are commonly used fontconfig properties you can use in patterns:
+
+### Font Identification
+- `family`: String or Array - Font family name(s)
+- `style`: String or Array - Font style name(s)
+- `fullname`: String - Full font name
+- `file`: String - Font file path
+- `index`: Integer - Font index in collection
+
+### Font Attributes
+- `weight`: Integer or Constant - Font weight (0-215, or "thin", "light", 
"medium", "bold", "black", etc.)
+- `slant`: Integer or Constant - Font slant ("roman", "italic", "oblique")
+- `width`: Integer or Constant - Font width ("condensed", "normal", 
"expanded", etc.)
+- `size`: Double or Range - Font size in points
+- `pixelsize`: Double or Range - Font size in pixels
+- `fontversion`: Integer - Font version number
+
+### Font Capabilities
+- `scalable`: Boolean - Whether font is scalable
+- `outline`: Boolean - Whether font has outlines
+- `color`: Boolean - Whether font has color glyphs
+- `variable`: Boolean - Whether font is a variable font
+- `namedinstance`: Boolean - Whether font is a named instance
+
+### Character Support
+- `charset`: Array of characters - Supported characters
+- `lang`: String or Array - Supported language(s)
+
+### Typography
+- `spacing`: Integer or Constant - Character spacing ("proportional", "mono", 
"charcell")
+- `fontformat`: String - Font format ("TrueType", "Type 1", "CFF", etc.)
+- `fontwrapper`: String - Font wrapper format ("SFNT", "CFF", "WOFF", etc.)
+
+### Rendering
+- `antialias`: Boolean - Whether to antialias
+- `hinting`: Boolean - Whether to hint
+- `hintstyle`: Integer or Constant - Hint style ("none", "slight", "medium", 
"full")
+- `rgba`: Integer or Constant - Subpixel order ("none", "rgb", "bgr", "vrgb", 
"vbgr")
+- `embolden`: Boolean or Null - Whether to embolden (synthetic bold)
+- `matrix`: Array[4] - Transformation matrix
+
+### Advanced
+- `dpi`: Double - DPI setting
+- `genericfamily`: Integer or Constant - Generic family ("serif", 
"sans-serif", "monospace", etc.)
+- `fontvariations`: String - Font variation settings (e.g., 
"wght=400,wdth=100")
+
+## Complete Example
+
+```json
+{
+  "env": {
+    "locale": "en_US.UTF-8"
+  },
+  "fonts": [
+    {
+      "family": "Noto Sans",
+      "style": "Regular",
+      "file": "/path/to/NotoSans-Regular.ttf",
+      "weight": 80,
+      "slant": "roman",
+      "fontversion": 1,
+      "scalable": true,
+      "outline": true
+    },
+    {
+      "family": "Noto Sans",
+      "style": "Bold",
+      "file": "/path/to/NotoSans-Bold.ttf",
+      "weight": 200,
+      "slant": "roman",
+      "fontversion": 1,
+      "scalable": true,
+      "outline": true
+    }
+  ],
+  "load_xml": [
+    "conf.d/10-autohint.conf",
+    "conf.d/10-hinting-slight.conf"
+  ],
+  "tests": [
+    {
+      "$comment": "Test that bold weight request matches bold font",
+      "method": "match",
+      "query": {
+        "family": "Noto Sans",
+        "weight": "bold"
+      },
+      "result": {
+        "family": "Noto Sans",
+        "file": "/path/to/NotoSans-Bold.ttf",
+        "weight": 200
+      }
+    },
+    {
+      "$comment": "Test that listing returns all Noto Sans variants",
+      "method": "list",
+      "query": {
+        "family": "Noto Sans"
+      },
+      "result_fs": [
+        {
+          "family": "Noto Sans",
+          "file": "/path/to/NotoSans-Regular.ttf"
+        },
+        {
+          "family": "Noto Sans",
+          "file": "/path/to/NotoSans-Bold.ttf"
+        }
+      ]
+    }
+  ]
+}
+```
+
+## Usage
+
+To run a test:
+
+```bash
+test-conf <config-file> <test-json-file>
+```
+
+Where:
+- `<config-file>`: Base fontconfig configuration file (XML format)
+- `<test-json-file>`: Test scenario file (JSON format described in this 
document)
+
+The test harness will:
+1. Create a fontconfig configuration instance
+2. Load the base config file
+3. Set environment variables from `env`
+4. Build the mock font database from `fonts` and `appfonts`
+5. Apply the `filter` if specified
+6. Load additional config files from `load_xml`
+7. Execute each test in `tests` and verify results
+
+Exit code is 0 if all tests pass, non-zero otherwise.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/meson.build 
new/fontconfig-2.18.1/test/meson.build
--- old/fontconfig-2.18.0/test/meson.build      2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/test/meson.build      2026-06-02 13:51:50.000000000 
+0200
@@ -112,7 +112,8 @@
 
 if jsonc_dep.found()
   test_conf = executable('test-conf', 'test-conf.c',
-                         dependencies: [fontconfig_dep, jsonc_dep])
+                         dependencies: [fontconfig_dep, jsonc_dep],
+                         c_args: 
['-DSRCDIR="@0@"'.format(meson.current_source_dir())])
 endif
 
 test_const_name = executable('test_const_name', test_const_name_c,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/test-48-guessfamily.json 
new/fontconfig-2.18.1/test/test-48-guessfamily.json
--- old/fontconfig-2.18.0/test/test-48-guessfamily.json 2026-05-21 
15:29:58.000000000 +0200
+++ new/fontconfig-2.18.1/test/test-48-guessfamily.json 2026-06-02 
13:51:50.000000000 +0200
@@ -5,28 +5,28 @@
       "style": "Regular",
       "file": "/path/to/LiberationMono-Regular.ttf",
       "fontversion": 1,
-      "genericfamily": 3
+      "genericfamily": "monospace"
     },
     {
       "family": "Liberation Sans",
       "style": "Regular",
       "file": "/path/to/LiberationSans-Regular.ttf",
       "fontversion": 1,
-      "genericfamily": 2
+      "genericfamily": "sans-serif"
     },
     {
       "family": "Liberation Serif",
       "style": "Regular",
       "file": "/path/to/LiberationSerif-Regular.ttf",
       "fontversion": 1,
-      "genericfamily": 1
+      "genericfamily": "serif"
     },
     {
       "family": "Noto Sans Mono",
       "style": "Regular",
       "file": "/path/to/NotoSansMono-Regular.ttf",
       "fontversion": 1,
-      "genericfamily": 3
+      "genericfamily": "monospace"
     },
   ],
   "tests": [
@@ -40,7 +40,7 @@
         "style": "Regular",
         "file": "/path/to/LiberationMono-Regular.ttf",
         "fontversion": 1,
-        "genericfamily": 3
+        "genericfamily": "monospace"
       }
     },
     {
@@ -53,7 +53,7 @@
         "style": "Regular",
         "file": "/path/to/LiberationSans-Regular.ttf",
         "fontversion": 1,
-        "genericfamily": 2
+        "genericfamily": "sans-serif"
       }
     },
     {
@@ -66,7 +66,7 @@
         "style": "Regular",
         "file": "/path/to/LiberationSerif-Regular.ttf",
         "fontversion": 1,
-        "genericfamily": 1
+        "genericfamily": "serif"
       }
     },
     {
@@ -79,7 +79,7 @@
         "style": "Regular",
         "file": "/path/to/LiberationSans-Regular.ttf",
         "fontversion": 1,
-        "genericfamily": 2
+        "genericfamily": "sans-serif"
       }
     },
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/test-conf.c 
new/fontconfig-2.18.1/test/test-conf.c
--- old/fontconfig-2.18.0/test/test-conf.c      2026-05-21 15:29:58.000000000 
+0200
+++ new/fontconfig-2.18.1/test/test-conf.c      2026-06-02 13:51:50.000000000 
+0200
@@ -53,9 +53,9 @@
 setenv (const char *name, const char *value, int overwrite)
 {
     if (!overwrite) {
-        char *s = getenv (name);
-        if (s)
-            return 0;
+       char *s = getenv (name);
+       if (s)
+           return 0;
     }
     return _putenv_s (name, value);
 }
@@ -110,6 +110,48 @@
     return FcTrue;
 }
 
+static FcBool
+build_config (FcConfig *config, json_object *obj)
+{
+    int    n, i;
+    FcBool ret = FcTrue;
+
+    n = json_object_array_length (obj);
+    for (i = 0; i < n; i++) {
+       json_object   *o = json_object_array_get_idx (obj, i);
+       char          *allocated = NULL;
+       const char    *s;
+       const FcChar8 *m;
+
+       if (json_object_get_type (o) != json_type_string) {
+           fprintf (stderr, "W: Invalid config item\n");
+           continue;
+       }
+       s = json_object_get_string (o);
+       if ((m = FcStrStr ((const FcChar8 *)s, (const FcChar8 *)"%test%")) != 
0) {
+           size_t root_len = strlen (SRCDIR);
+           size_t len = strlen (s);
+
+           allocated = malloc (root_len + len);
+           if (!allocated)
+               return FcFalse;
+           strcpy (allocated, SRCDIR);
+           allocated[root_len] = '/';
+           strcpy (&allocated[root_len + 1], (const char *)&m[6]);
+           s = allocated;
+       }
+       ret = FcConfigParseAndLoad (config, (const FcChar8 *)s, FcTrue);
+       if (allocated) {
+           free (allocated);
+           allocated = NULL;
+       }
+       if (!ret)
+           goto bail;
+    }
+bail:
+    return ret;
+}
+
 static FcPattern *
 build_pattern (json_object *obj)
 {
@@ -416,7 +458,7 @@
 static FcBool
 build_fonts (FcConfig *config, json_object *root)
 {
-    json_object *fonts, *filter, *appfonts;
+    json_object *fonts, *filter, *appfonts, *cfg_xml;
     FcFontSet   *fs;
     FcPattern   *filterpat;
 
@@ -448,6 +490,14 @@
            FcFontSetDestroy (config->fonts[FcSetApplication]);
        config->fonts[FcSetApplication] = fs;
     }
+    if (json_object_object_get_ex (root, "load_xml", &cfg_xml)) {
+       if (json_object_get_type (cfg_xml) != json_type_array) {
+           fprintf (stderr, "W: Invalid load_xml defined\n");
+           return FcFalse;
+       }
+       if (!build_config (config, cfg_xml))
+           return FcFalse;
+    }
 
     return FcTrue;
 }
@@ -695,7 +745,7 @@
            }
        }
     } while (FcPatternIterNext (result, &iter2));
- bail:
+bail:
     return fail;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/test-issue-525-2.conf 
new/fontconfig-2.18.1/test/test-issue-525-2.conf
--- old/fontconfig-2.18.0/test/test-issue-525-2.conf    1970-01-01 
01:00:00.000000000 +0100
+++ new/fontconfig-2.18.1/test/test-issue-525-2.conf    2026-06-02 
13:51:50.000000000 +0200
@@ -0,0 +1,8 @@
+<fontconfig>
+  <alias>
+    <family>-apple-system</family>
+    <prefer>
+      <family>Lato</family>
+    </prefer>
+  </alias>
+</fontconfig>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/test-issue-525-2.json 
new/fontconfig-2.18.1/test/test-issue-525-2.json
--- old/fontconfig-2.18.0/test/test-issue-525-2.json    1970-01-01 
01:00:00.000000000 +0100
+++ new/fontconfig-2.18.1/test/test-issue-525-2.json    2026-06-02 
13:51:50.000000000 +0200
@@ -0,0 +1,38 @@
+{
+  "fonts": [
+    {
+      "family": "Noto Sans",
+      "style": "Regular",
+      "file": "/path/to/NotoSans.ttf",
+      "fontversion": 1,
+      "genericfamily": "sans-serif"
+    },
+    {
+      "family": "Lato",
+      "style": "Regular",
+      "file": "/path/to/Lato.ttf",
+      "fontversion": 1,
+      "genericfamily": 0
+    }
+  ],
+  "load_xml": [
+    "conf.d/48-guessfamily.conf",
+    "conf.d/49-sansserif.conf",
+    "%test%/test-issue-525-2.conf",
+    "conf.d/60-latin.conf",
+  ],
+  "tests": [
+    {
+      "method": "match",
+      "query": {
+        "family": "-apple-system",
+      },
+      "result": {
+        "family": "Lato",
+        "style": "Regular",
+        "file": "/path/to/Lato.ttf",
+        "fontversion": 1
+      }
+    }
+  ]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/test-issue-525.conf 
new/fontconfig-2.18.1/test/test-issue-525.conf
--- old/fontconfig-2.18.0/test/test-issue-525.conf      1970-01-01 
01:00:00.000000000 +0100
+++ new/fontconfig-2.18.1/test/test-issue-525.conf      2026-06-02 
13:51:50.000000000 +0200
@@ -0,0 +1,8 @@
+<fontconfig>
+  <alias>
+    <family>system-ui</family>
+    <prefer>
+      <family>Lato</family>
+    </prefer>
+  </alias>
+</fontconfig>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fontconfig-2.18.0/test/test-issue-525.json 
new/fontconfig-2.18.1/test/test-issue-525.json
--- old/fontconfig-2.18.0/test/test-issue-525.json      1970-01-01 
01:00:00.000000000 +0100
+++ new/fontconfig-2.18.1/test/test-issue-525.json      2026-06-02 
13:51:50.000000000 +0200
@@ -0,0 +1,38 @@
+{
+  "fonts": [
+    {
+      "family": "Noto Sans",
+      "style": "Regular",
+      "file": "/path/to/NotoSans.ttf",
+      "fontversion": 1,
+      "genericfamily": "sans-serif"
+    },
+    {
+      "family": "Lato",
+      "style": "Regular",
+      "file": "/path/to/Lato.ttf",
+      "fontversion": 1,
+      "genericfamily": 0
+    }
+  ],
+  "load_xml": [
+    "conf.d/48-guessfamily.conf",
+    "conf.d/49-sansserif.conf",
+    "%test%/test-issue-525.conf",
+    "conf.d/60-latin.conf",
+  ],
+  "tests": [
+    {
+      "method": "match",
+      "query": {
+        "family": "system-ui"
+      },
+      "result": {
+        "family": "Lato",
+        "style": "Regular",
+        "file": "/path/to/Lato.ttf",
+        "fontversion": 1
+      }
+    }
+  ]
+}

Reply via email to