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 + } + } + ] +}
