diff --git a/.fmf/version b/.fmf/version
deleted file mode 100644
index d00491f..0000000
--- a/.fmf/version
+++ /dev/null
@@ -1 +0,0 @@
-1
diff --git a/.gitignore b/.gitignore
index 8ea9665..bc18404 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,9 +38,3 @@ fontconfig-2.8.0.tar.gz
/fontconfig-2.13.96.tar.xz
/fontconfig-2.14.0.tar.xz
/fontconfig-2.14.1.tar.xz
-/fontconfig-2.14.2.tar.xz
-/fontconfig-2.15.0.tar.xz
-/fontconfig-2.16.0.tar.xz
-/fontconfig-2.16.1.tar.xz
-/fontconfig-2.16.2.tar.xz
-/fontconfig-2.17.0.tar.xz
diff --git a/10-sub-pixel-rgb-for-kde.conf b/10-sub-pixel-rgb-for-kde.conf
new file mode 100644
index 0000000..63fd752
--- /dev/null
+++ b/10-sub-pixel-rgb-for-kde.conf
@@ -0,0 +1,18 @@
+
+
+
+ Enable sub-pixel rendering with the RGB stripes layout for KDE only
+
+
+
+
+ KDE
+
+ rgb
+
+
diff --git a/fontconfig-desktop-property.patch b/fontconfig-desktop-property.patch
new file mode 100644
index 0000000..c7a81a3
--- /dev/null
+++ b/fontconfig-desktop-property.patch
@@ -0,0 +1,337 @@
+From 6715a14f138df01c11110488b7edbf514e4076b4 Mon Sep 17 00:00:00 2001
+From: Akira TAGOH
+Date: Fri, 25 Nov 2022 21:15:32 +0900
+Subject: [PATCH] Add FC_DESKTOP_NAME property
+
+To allow users to have desktop-specific matching rule.
+---
+ fontconfig/fontconfig.h | 27 ++++++++++---------
+ src/fcdefault.c | 58 ++++++++++++++++++++++++++++++++++++++---
+ src/fcint.h | 7 +++--
+ src/fcobjs.h | 1 +
+ src/fcxml.c | 14 +++++-----
+ 5 files changed, 82 insertions(+), 25 deletions(-)
+
+diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h
+index 09292a3..ac5a0b0 100644
+--- a/fontconfig/fontconfig.h
++++ b/fontconfig/fontconfig.h
+@@ -128,6 +128,7 @@ typedef int FcBool;
+ #define FC_POSTSCRIPT_NAME "postscriptname" /* String */
+ #define FC_FONT_HAS_HINT "fonthashint" /* Bool - true if font has hinting */
+ #define FC_ORDER "order" /* Integer */
++#define FC_DESKTOP_NAME "desktop" /* String */
+
+ #define FC_CACHE_SUFFIX ".cache-" FC_CACHE_VERSION
+ #define FC_DIR_CACHE_FILE "fonts.cache-" FC_CACHE_VERSION
+@@ -285,7 +286,7 @@ typedef struct _FcObjectSet {
+ int sobject;
+ const char **objects;
+ } FcObjectSet;
+-
++
+ typedef enum _FcMatchKind {
+ FcMatchPattern, FcMatchFont, FcMatchScan,
+ FcMatchKindEnd,
+@@ -400,7 +401,7 @@ FcConfigGetFilename (FcConfig *config,
+
+ FcPublic FcChar8 *
+ FcConfigFilename (const FcChar8 *url);
+-
++
+ FcPublic FcConfig *
+ FcConfigCreate (void);
+
+@@ -418,7 +419,7 @@ FcConfigGetCurrent (void);
+
+ FcPublic FcBool
+ FcConfigUptoDate (FcConfig *config);
+-
++
+ FcPublic FcBool
+ FcConfigBuildFonts (FcConfig *config);
+
+@@ -548,12 +549,12 @@ FcCharSetIsSubset (const FcCharSet *a, const FcCharSet *b);
+ #define FC_CHARSET_DONE ((FcChar32) -1)
+
+ FcPublic FcChar32
+-FcCharSetFirstPage (const FcCharSet *a,
++FcCharSetFirstPage (const FcCharSet *a,
+ FcChar32 map[FC_CHARSET_MAP_SIZE],
+ FcChar32 *next);
+
+ FcPublic FcChar32
+-FcCharSetNextPage (const FcCharSet *a,
++FcCharSetNextPage (const FcCharSet *a,
+ FcChar32 map[FC_CHARSET_MAP_SIZE],
+ FcChar32 *next);
+
+@@ -609,7 +610,7 @@ FcDirCacheLoad (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file);
+
+ FcPublic FcCache *
+ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config);
+-
++
+ FcPublic FcCache *
+ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config);
+
+@@ -772,7 +773,7 @@ FcFontSetMatch (FcConfig *config,
+
+ FcPublic FcPattern *
+ FcFontMatch (FcConfig *config,
+- FcPattern *p,
++ FcPattern *p,
+ FcResult *result);
+
+ FcPublic FcPattern *
+@@ -890,10 +891,10 @@ FcPatternHash (const FcPattern *p);
+
+ FcPublic FcBool
+ FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append);
+-
++
+ FcPublic FcBool
+ FcPatternAddWeak (FcPattern *p, const char *object, FcValue value, FcBool append);
+-
++
+ FcPublic FcResult
+ FcPatternGet (const FcPattern *p, const char *object, int id, FcValue *v);
+
+@@ -956,7 +957,7 @@ FcPatternGetRange (const FcPattern *p, const char *object, int id, FcRange **r);
+
+ FcPublic FcPattern *
+ FcPatternVaBuild (FcPattern *p, va_list va);
+-
++
+ FcPublic FcPattern *
+ FcPatternBuild (FcPattern *p, ...) FC_ATTRIBUTE_SENTINEL(0);
+
+@@ -1025,10 +1026,10 @@ FcStrCopy (const FcChar8 *s);
+
+ FcPublic FcChar8 *
+ FcStrCopyFilename (const FcChar8 *s);
+-
++
+ FcPublic FcChar8 *
+ FcStrPlus (const FcChar8 *s1, const FcChar8 *s2);
+-
++
+ FcPublic void
+ FcStrFree (FcChar8 *s);
+
+@@ -1145,7 +1146,7 @@ _FCFUNCPROTOEND
+ * Deprecated functions are placed here to help users fix their code without
+ * digging through documentation
+ */
+-
++
+ #define FcConfigGetRescanInverval FcConfigGetRescanInverval_REPLACE_BY_FcConfigGetRescanInterval
+ #define FcConfigSetRescanInverval FcConfigSetRescanInverval_REPLACE_BY_FcConfigSetRescanInterval
+
+diff --git a/src/fcdefault.c b/src/fcdefault.c
+index a9a3b72..6995216 100644
+--- a/src/fcdefault.c
++++ b/src/fcdefault.c
+@@ -211,28 +211,73 @@ retry:
+ return prgname;
+ }
+
++static FcChar8 *default_desktop_name;
++
++FcChar8 *
++FcGetDesktopName (void)
++{
++ FcChar8 *desktop_name;
++retry:
++ desktop_name = fc_atomic_ptr_get (&default_desktop_name);
++ if (!desktop_name)
++ {
++ char *s = getenv ("XDG_CURRENT_DESKTOP");
++
++ if (!s)
++ desktop_name = FcStrdup ("");
++ else
++ desktop_name = FcStrdup (s);
++ if (!desktop_name)
++ {
++ fprintf (stderr, "Fontconfig error: out of memory in %s\n",
++ __FUNCTION__);
++ return NULL;
++ }
++
++ if (!fc_atomic_ptr_cmpexch(&default_desktop_name, NULL, desktop_name))
++ {
++ free (desktop_name);
++ goto retry;
++ }
++ }
++ if (desktop_name && !desktop_name[0])
++ return NULL;
++
++ return desktop_name;
++}
++
+ void
+ FcDefaultFini (void)
+ {
+ FcChar8 *lang;
+ FcStrSet *langs;
+ FcChar8 *prgname;
++ FcChar8 *desktop;
+
+ lang = fc_atomic_ptr_get (&default_lang);
+- if (lang && fc_atomic_ptr_cmpexch (&default_lang, lang, NULL)) {
++ if (lang && fc_atomic_ptr_cmpexch (&default_lang, lang, NULL))
++ {
+ free (lang);
+ }
+
+ langs = fc_atomic_ptr_get (&default_langs);
+- if (langs && fc_atomic_ptr_cmpexch (&default_langs, langs, NULL)) {
++ if (langs && fc_atomic_ptr_cmpexch (&default_langs, langs, NULL))
++ {
+ FcRefInit (&langs->ref, 1);
+ FcStrSetDestroy (langs);
+ }
+
+ prgname = fc_atomic_ptr_get (&default_prgname);
+- if (prgname && fc_atomic_ptr_cmpexch (&default_prgname, prgname, NULL)) {
++ if (prgname && fc_atomic_ptr_cmpexch (&default_prgname, prgname, NULL))
++ {
+ free (prgname);
+ }
++
++ desktop = fc_atomic_ptr_get (&default_desktop_name);
++ if (desktop && fc_atomic_ptr_cmpexch(&default_desktop_name, desktop, NULL))
++ {
++ free (desktop);
++ }
+ }
+
+ void
+@@ -336,6 +381,13 @@ FcDefaultSubstitute (FcPattern *pattern)
+ FcPatternObjectAddString (pattern, FC_PRGNAME_OBJECT, prgname);
+ }
+
++ if (FcPatternObjectGet (pattern, FC_DESKTOP_NAME_OBJECT, 0, &v) == FcResultNoMatch)
++ {
++ FcChar8 *desktop = FcGetDesktopName ();
++ if (desktop)
++ FcPatternObjectAddString (pattern, FC_DESKTOP_NAME_OBJECT, desktop);
++ }
++
+ if (!FcPatternFindObjectIter (pattern, &iter, FC_ORDER_OBJECT))
+ FcPatternObjectAddInteger (pattern, FC_ORDER_OBJECT, 0);
+ }
+diff --git a/src/fcint.h b/src/fcint.h
+index c615b66..78cee54 100644
+--- a/src/fcint.h
++++ b/src/fcint.h
+@@ -199,7 +199,7 @@ typedef struct _FcValueList {
+ } FcValueList;
+
+ #define FcValueListNext(vl) FcPointerMember(vl,next,FcValueList)
+-
++
+ typedef int FcObject;
+
+ /* The 1024 is to leave some room for future added internal objects, such
+@@ -238,7 +238,7 @@ struct _FcPattern {
+ FcFontSetFonts(fs)[i], \
+ FcPattern) : \
+ fs->fonts[i])
+-
++
+ typedef enum _FcOp {
+ FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpRange, FcOpBool, FcOpCharSet, FcOpLangSet,
+ FcOpNil,
+@@ -909,6 +909,9 @@ FcGetDefaultLang (void);
+ FcPrivate FcChar8 *
+ FcGetPrgname (void);
+
++FcPrivate FcChar8 *
++FcGetDesktopName (void);
++
+ FcPrivate void
+ FcDefaultFini (void);
+
+diff --git a/src/fcobjs.h b/src/fcobjs.h
+index acc0471..1cd8ed3 100644
+--- a/src/fcobjs.h
++++ b/src/fcobjs.h
+@@ -74,4 +74,5 @@ FC_OBJECT (FONT_VARIATIONS, FcTypeString, NULL)
+ FC_OBJECT (VARIABLE, FcTypeBool, FcCompareBool)
+ FC_OBJECT (FONT_HAS_HINT, FcTypeBool, FcCompareBool)
+ FC_OBJECT (ORDER, FcTypeInteger, FcCompareNumber)
++FC_OBJECT (DESKTOP_NAME, FcTypeString, NULL)
+ /* ^-------------- Add new objects here. */
+diff --git a/src/fcxml.c b/src/fcxml.c
+index 82a46f2..74c892d 100644
+--- a/src/fcxml.c
++++ b/src/fcxml.c
+@@ -367,7 +367,7 @@ typedef enum _FcElement {
+ FcElementDescription,
+ FcElementRemapDir,
+ FcElementResetDirs,
+-
++
+ FcElementRescan,
+
+ FcElementPrefer,
+@@ -731,7 +731,7 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type)
+ if (o)
+ FcTypecheckValue (parse, o->type, type);
+ }
+- else
++ else
+ FcConfigMessage (parse, FcSevereWarning,
+ "invalid constant used : %s",
+ expr->u.constant);
+@@ -794,7 +794,7 @@ FcTestCreate (FcConfigParse *parse,
+ if (test)
+ {
+ const FcObjectType *o;
+-
++
+ test->kind = kind;
+ test->qual = qual;
+ test->object = FcObjectFromName ((const char *) field);
+@@ -1533,7 +1533,7 @@ FcStrtod (char *s, char **end)
+ {
+ char buf[128];
+ int slen = strlen (s);
+-
++
+ if (slen + dlen > (int) sizeof (buf))
+ {
+ if (end)
+@@ -3101,7 +3101,7 @@ FcParsePattern (FcConfigParse *parse)
+ FcConfigMessage (parse, FcSevereError, "out of memory");
+ return;
+ }
+-
++
+ while ((vstack = FcVStackPeek (parse)))
+ {
+ switch ((int) vstack->tag) {
+@@ -3176,7 +3176,7 @@ FcEndElement(void *userData, const XML_Char *name FC_UNUSED)
+ case FcElementRescan:
+ FcParseRescan (parse);
+ break;
+-
++
+ case FcElementPrefer:
+ FcParseFamilies (parse, FcVStackPrefer);
+ break;
+@@ -3512,7 +3512,7 @@ FcConfigParseAndLoadFromMemoryInternal (FcConfig *config,
+ XML_SetDoctypeDeclHandler (p, FcStartDoctypeDecl, FcEndDoctypeDecl);
+ XML_SetElementHandler (p, FcStartElement, FcEndElement);
+ XML_SetCharacterDataHandler (p, FcCharacterData);
+-
++
+ #endif /* ENABLE_LIBXML2 */
+
+ #ifndef ENABLE_LIBXML2
+--
+2.38.1
+
diff --git a/fontconfig-disable-network-required-test.patch b/fontconfig-disable-network-required-test.patch
index e048b49..8481f39 100644
--- a/fontconfig-disable-network-required-test.patch
+++ b/fontconfig-disable-network-required-test.patch
@@ -1,87 +1,7 @@
-diff -pruN fontconfig-2.17.0.orig/test/meson.build fontconfig-2.17.0/test/meson.build
---- fontconfig-2.17.0.orig/test/meson.build 2025-06-27 12:12:04.000000000 +0900
-+++ fontconfig-2.17.0/test/meson.build 2025-06-27 14:41:08.843726446 +0900
-@@ -1,16 +1,16 @@
--fetch_test_fonts = custom_target(
-- 'fetch_test_fonts',
-- output: 'testfonts',
-- command: [
-- python3,
-- join_paths(meson.project_source_root(), 'build-aux', 'fetch-testfonts.py'),
-- '--target-dir',
-- '@BUILD_ROOT@/testfonts',
-- '--try-symlink',
-- ],
-- build_by_default: false,
-- build_always_stale: true,
--)
-+#fetch_test_fonts = custom_target(
-+# 'fetch_test_fonts',
-+# output: 'testfonts',
-+# command: [
-+# python3,
-+# join_paths(meson.project_source_root(), 'build-aux', 'fetch-testfonts.py'),
-+# '--target-dir',
-+# '@BUILD_ROOT@/testfonts',
-+# '--try-symlink',
-+# ],
-+# build_by_default: false,
-+# build_always_stale: true,
-+#)
-
- tests = [
- ['test-bz89617.c', {'c_args': ['-DSRCDIR="@0@"'.format(meson.current_source_dir())]}],
-@@ -33,7 +33,7 @@ if host_machine.system() != 'windows'
- ]
- tests_not_parallel += [
- # FIXME: this needs NotoSans-hinted.zip font downloaded and unpacked into test build directory! see run-test.sh
-- ['test-crbug1004254.c', {'dependencies': dependency('threads')}], # for pthread
-+ # ['test-crbug1004254.c', {'dependencies': dependency('threads')}], # for pthread
- ['test-mt-fccfg.c', {'include_directories': include_directories('../src'), 'dependencies': dependency('threads')}],
- ]
-
-@@ -74,10 +74,10 @@ foreach test_data : tests + tests_not_pa
- endforeach
-
-
--if get_option('fontations').enabled()
-- rust = import('rust')
-- rust.test('fc_fontations_rust_tests', fc_fontations, link_with: [libfontconfig_internal], depends: fetch_test_fonts, env: ['builddir=@0@'.format(meson.project_build_root())],)
--endif
-+#if get_option('fontations').enabled()
-+# rust = import('rust')
-+# rust.test('fc_fontations_rust_tests', fc_fontations, link_with: [libfontconfig_internal], depends: fetch_test_fonts, env: ['builddir=@0@'.format(meson.project_build_root())],)
-+#endif
-
- fs = import('fs')
-
-@@ -92,14 +92,14 @@ if host_machine.system() != 'windows'
-
- test('run_test_sh', find_program('run-test.sh'), timeout: 600, env: ['srcdir=@0@'.format(meson.current_source_dir()), 'builddir=@0@'.format(meson.current_build_dir()), 'EXEEXT=@0@'.format(conf.get('EXEEXT')), 'VERBOSE=1'])
-
-- if pytest.found()
-- test('pytest', pytest, args: ['--tap'],
-- workdir: meson.current_source_dir(),
-- env: ['builddir=@0@'.format(meson.project_build_root())],
-- protocol: 'tap',
-- timeout: 600,
-- depends: fetch_test_fonts)
-- endif
-+# if pytest.found()
-+# test('pytest', pytest, args: ['--tap'],
-+# workdir: meson.current_source_dir(),
-+# env: ['builddir=@0@'.format(meson.project_build_root())],
-+# protocol: 'tap',
-+# timeout: 600,
-+# depends: fetch_test_fonts)
-+# endif
- endif
-
- if jsonc_dep.found()
-diff -pruN fontconfig-2.17.0.orig/test/run-test.sh fontconfig-2.17.0/test/run-test.sh
---- fontconfig-2.17.0.orig/test/run-test.sh 2025-06-27 12:12:04.000000000 +0900
-+++ fontconfig-2.17.0/test/run-test.sh 2025-06-27 14:39:19.098581228 +0900
-@@ -521,18 +521,18 @@ rm -rf "$MYCACHEBASEDIR" "$MYCONFIG" "$B
+diff -pruN fontconfig-2.13.93.orig/test/run-test.sh fontconfig-2.13.93/test/run-test.sh
+--- fontconfig-2.13.93.orig/test/run-test.sh 2020-11-28 10:56:42.000000000 +0900
++++ fontconfig-2.13.93/test/run-test.sh 2020-11-28 12:39:57.345644527 +0900
+@@ -421,18 +421,18 @@ rm -rf "$MYCACHEBASEDIR" "$MYCONFIG" my-
fi # if [ "x$EXEEXT" = "x" ]
@@ -91,7 +11,7 @@ diff -pruN fontconfig-2.17.0.orig/test/run-test.sh fontconfig-2.17.0/test/run-te
- curl -s -o "$FONTDIR"/noto.zip https://noto-website-2.storage.googleapis.com/pkgs/NotoSans-hinted.zip
- (cd "$FONTDIR"; unzip noto.zip)
- if [ -n "${SOURCE_DATE_EPOCH:-}" ] && [ ${#SOURCE_DATE_EPOCH} -gt 0 ]; then
-- touch -m -t "$(fdate ${SOURCE_DATE_EPOCH})" "$FONTDIR"
+- touch -m -t "$(date -d @"${SOURCE_DATE_EPOCH}" +%y%m%d%H%M.%S)" "$FONTDIR"
- fi
- "$BUILDTESTDIR"/test-crbug1004254
-else
@@ -101,7 +21,7 @@ diff -pruN fontconfig-2.17.0.orig/test/run-test.sh fontconfig-2.17.0/test/run-te
+# curl -s -o "$FONTDIR"/noto.zip https://noto-website-2.storage.googleapis.com/pkgs/NotoSans-hinted.zip
+# (cd "$FONTDIR"; unzip noto.zip)
+# if [ -n "${SOURCE_DATE_EPOCH:-}" ] && [ ${#SOURCE_DATE_EPOCH} -gt 0 ]; then
-+# touch -m -t "$(fdate ${SOURCE_DATE_EPOCH})" "$FONTDIR"
++# touch -m -t "$(date -d @"${SOURCE_DATE_EPOCH}" +%y%m%d%H%M.%S)" "$FONTDIR"
+# fi
+# "$BUILDTESTDIR"/test-crbug1004254
+#else
diff --git a/fontconfig-drop-lang-from-pkgkit-format.patch b/fontconfig-drop-lang-from-pkgkit-format.patch
index abece6d..8b77308 100644
--- a/fontconfig-drop-lang-from-pkgkit-format.patch
+++ b/fontconfig-drop-lang-from-pkgkit-format.patch
@@ -1,12 +1,12 @@
-diff -pruN fontconfig-2.16.1.orig/src/fcformat.c fontconfig-2.16.1/src/fcformat.c
---- fontconfig-2.16.1.orig/src/fcformat.c 2025-03-13 20:16:47.000000000 +0900
-+++ fontconfig-2.16.1/src/fcformat.c 2025-03-13 20:42:03.633324643 +0900
-@@ -77,7 +77,7 @@
- #define FCCAT_FORMAT "\"%{file|basename|cescape}\" %{index} \"%{-file{%{=unparse|cescape}}}\""
- #define FCMATCH_FORMAT "%{file:-|basename}: \"%{family[0]:-}\" \"%{style[0]:-}\""
- #define FCLIST_FORMAT "%{?file{%{file}: }}%{-file{%{=unparse}}}"
--#define PKGKIT_FORMAT "%{[]family{font(%{family|downcase|delete( )})\n}}%{[]lang{font(:lang=%{lang|downcase|translate(_,-)})\n}}"
-+#define PKGKIT_FORMAT "%{[]family{font(%{family|downcase|delete( )})\n}}"
+diff -pruN fontconfig-2.13.92.orig/src/fcformat.c fontconfig-2.13.92/src/fcformat.c
+--- fontconfig-2.13.92.orig/src/fcformat.c 2018-07-19 12:14:39.000000000 +0900
++++ fontconfig-2.13.92/src/fcformat.c 2020-01-20 13:05:33.626227767 +0900
+@@ -78,7 +78,7 @@
+ #define FCCAT_FORMAT "\"%{file|basename|cescape}\" %{index} \"%{-file{%{=unparse|cescape}}}\""
+ #define FCMATCH_FORMAT "%{file:-|basename}: \"%{family[0]:-}\" \"%{style[0]:-}\""
+ #define FCLIST_FORMAT "%{?file{%{file}: }}%{-file{%{=unparse}}}"
+-#define PKGKIT_FORMAT "%{[]family{font(%{family|downcase|delete( )})\n}}%{[]lang{font(:lang=%{lang|downcase|translate(_,-)})\n}}"
++#define PKGKIT_FORMAT "%{[]family{font(%{family|downcase|delete( )})\n}}"
+
static void
- message (const char *fmt, ...)
diff --git a/fontconfig-fix-crash.patch b/fontconfig-fix-crash.patch
deleted file mode 100644
index c52b33d..0000000
--- a/fontconfig-fix-crash.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From b9bec06d73340f1b5727302d13ac3df307b7febc Mon Sep 17 00:00:00 2001
-From: Akira TAGOH
-Date: Mon, 30 Jun 2025 09:05:18 +0900
-Subject: [PATCH] Fix a heap buffer overflow
-
-https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/481
-
-Changelog: fixed
----
- src/fcfreetype.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/fcfreetype.c b/src/fcfreetype.c
-index 7a4d9811..0a87d27a 100644
---- a/src/fcfreetype.c
-+++ b/src/fcfreetype.c
-@@ -2661,7 +2661,7 @@ FcFontCapabilities (FT_Face face)
- goto bail;
-
- maxsize = (((FT_ULong)gpos_count + (FT_ULong)gsub_count) * OTLAYOUT_LEN +
-- (issilgraphitefont ? strlen(fcSilfCapability) : 0));
-+ (issilgraphitefont ? strlen(fcSilfCapability) + 1: 0));
- complex_ = malloc (sizeof (FcChar8) * maxsize);
- if (!complex_)
- goto bail;
---
-2.50.0
-
diff --git a/fontconfig-fix-remap.patch b/fontconfig-fix-remap.patch
new file mode 100644
index 0000000..5809a0b
--- /dev/null
+++ b/fontconfig-fix-remap.patch
@@ -0,0 +1,81 @@
+From fc0e9a78d2fe3b26f0b93c2a99b160e75e2a9f89 Mon Sep 17 00:00:00 2001
+From: Akira TAGOH
+Date: Wed, 28 Sep 2022 21:39:09 +0900
+Subject: [PATCH 1/3] Real fix of 91114d18c
+
+The change in 91114d18c broke remapping font paths.
+
+Patch from Mattias Clasen
+
+Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/331
+---
+ src/fcstr.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/src/fcstr.c b/src/fcstr.c
+index 3fe518f..5ce65da 100644
+--- a/src/fcstr.c
++++ b/src/fcstr.c
+@@ -1467,7 +1467,6 @@ FcStrSetAddFilenamePairWithSalt (FcStrSet *set, const FcChar8 *a, const FcChar8
+ {
+ FcChar8 *new_a = NULL;
+ FcChar8 *new_b = NULL;
+- FcChar8 *rs = NULL;
+ FcBool ret;
+
+ if (a)
+@@ -1487,10 +1486,7 @@ FcStrSetAddFilenamePairWithSalt (FcStrSet *set, const FcChar8 *a, const FcChar8
+ }
+ }
+ /* Override maps with new one if exists */
+- if (FcStrSetMemberAB (set, new_a, new_b, &rs))
+- {
+- FcStrSetDel (set, rs);
+- }
++ FcStrSetDel (set, new_a);
+ ret = FcStrSetAddTriple (set, new_a, new_b, salt);
+ if (new_a)
+ FcStrFree (new_a);
+--
+2.37.3
+
+From a10d07682a09ce5effbd121920b119618f4b7775 Mon Sep 17 00:00:00 2001
+From: Akira TAGOH
+Date: Wed, 28 Sep 2022 23:30:06 +0900
+Subject: [PATCH 2/3] Fix test cases for wrong use of remap-dir
+
+---
+ test/run-test.sh | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/test/run-test.sh b/test/run-test.sh
+index 1cedb8d..2b8a412 100644
+--- a/test/run-test.sh
++++ b/test/run-test.sh
+@@ -177,7 +177,10 @@ $FCCACHE "$FONTDIR"
+ sleep 1
+ ls -l "$CACHEDIR" > out1
+ TESTTMPDIR=$(mktemp -d "$TMPDIR"/fontconfig.XXXXXXXX)
+-sed "s!@FONTDIR@!$TESTTMPDIR/fonts!
++# Once font dir is remapped, we could use $FONTDIR as different one in theory.
++# but we don't use it here and to avoid duplicate entries, set the non-existing
++# directory here.
++sed "s!@FONTDIR@!$FONTDIR/a!
+ s!@REMAPDIR@!$TESTTMPDIR/fonts!
+ s!@CACHEDIR@!$TESTTMPDIR/cache.dir!" < "$TESTDIR"/fonts.conf.in > bind-fonts.conf
+ echo "$BWRAP --bind / / --bind \"$CACHEDIR\" \"$TESTTMPDIR\"/cache.dir --bind \"$FONTDIR\" \"$TESTTMPDIR\"/fonts --bind .. \"$TESTTMPDIR\"/build --dev-bind /dev /dev --setenv FONTCONFIG_FILE \"$TESTTMPDIR\"/build/test/bind-fonts.conf \"$TESTTMPDIR\"/build/fc-match/fc-match\"$EXEEXT\" -f \"%{file}\n\" \":foundry=Misc\" > xxx"
+@@ -273,7 +276,10 @@ sleep 1
+ (cd "$CACHEDIR"; ls -1 --color=no ./*cache*) > out1
+ TESTTMPDIR=$(mktemp -d "$TMPDIR"/fontconfig.XXXXXXXX)
+ mkdir -p "$TESTTMPDIR"/cache.dir
+-sed "s!@FONTDIR@!$TESTTMPDIR/fonts!
++# Once font dir is remapped, we could use $FONTDIR as different one in theory.
++# but we don't use it here and to avoid duplicate entries, set the non-existing
++# directory here.
++sed "s!@FONTDIR@!$FONTDIR/a!
+ s!@REMAPDIR@!$TESTTMPDIR/fonts!
+ s!@CACHEDIR@!$TESTTMPDIR/cache.dir!" < "$TESTDIR"/fonts.conf.in > bind-fonts.conf
+ $BWRAP --bind / / --bind "$FONTDIR" "$TESTTMPDIR"/fonts --bind .. "$TESTTMPDIR"/build --dev-bind /dev /dev --setenv FONTCONFIG_FILE "$TESTTMPDIR"/build/test/bind-fonts.conf "$TESTTMPDIR"/build/fc-cache/fc-cache"$EXEEXT" "$TESTTMPDIR"/fonts
+--
+2.37.3
+
diff --git a/fontconfig-lower-nonlatin-conf.patch b/fontconfig-lower-nonlatin-conf.patch
deleted file mode 100644
index 3ff373a..0000000
--- a/fontconfig-lower-nonlatin-conf.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-diff -pruN fontconfig-2.16.0.orig/conf.d/Makefile.am fontconfig-2.16.0/conf.d/Makefile.am
---- fontconfig-2.16.0.orig/conf.d/Makefile.am 2025-01-18 00:15:05.000000000 +0900
-+++ fontconfig-2.16.0/conf.d/Makefile.am 2025-01-18 00:38:32.245398277 +0900
-@@ -47,7 +47,7 @@ CONF_LINKS = \
- 60-generic.conf \
- 60-latin.conf \
- 65-fonts-persian.conf \
-- 65-nonlatin.conf \
-+ 69-nonlatin.conf \
- 69-unifont.conf \
- 80-delicious.conf \
- 90-synthetic.conf
-@@ -95,7 +95,7 @@ template_DATA = \
- 60-latin.conf \
- 65-fonts-persian.conf \
- 65-khmer.conf \
-- 65-nonlatin.conf \
-+ 69-nonlatin.conf \
- 69-unifont.conf \
- 70-no-bitmaps.conf \
- 70-no-bitmaps-and-emoji.conf \
-diff -pruN fontconfig-2.16.0.orig/conf.d/meson.build fontconfig-2.16.0/conf.d/meson.build
---- fontconfig-2.16.0.orig/conf.d/meson.build 2025-01-18 00:15:05.000000000 +0900
-+++ fontconfig-2.16.0/conf.d/meson.build 2025-01-18 00:38:43.243595743 +0900
-@@ -33,7 +33,7 @@ conf_files = [
- '60-latin.conf',
- '65-fonts-persian.conf',
- '65-khmer.conf',
-- '65-nonlatin.conf',
-+ '69-nonlatin.conf',
- '69-unifont.conf',
- '70-no-bitmaps.conf',
- '70-no-bitmaps-and-emoji.conf',
-@@ -64,7 +64,7 @@ conf_links = [
- '60-generic.conf',
- '60-latin.conf',
- '65-fonts-persian.conf',
-- '65-nonlatin.conf',
-+ '69-nonlatin.conf',
- '69-unifont.conf',
- '80-delicious.conf',
- '90-synthetic.conf',
diff --git a/fontconfig.spec b/fontconfig.spec
index 1bc63c7..008bd62 100644
--- a/fontconfig.spec
+++ b/fontconfig.spec
@@ -4,33 +4,32 @@
Summary: Font configuration and customization library
Name: fontconfig
-Version: 2.17.0
-Release: 3%{?dist}
+Version: 2.14.1
+Release: 2%{?dist}
# src/ftglue.[ch] is in Public Domain
# src/fccache.c contains Public Domain code
-## https://gitlab.com/fedora/legal/fedora-license-data/-/issues/177
# fc-case/CaseFolding.txt is in the UCD
# otherwise MIT
-License: HPND AND LicenseRef-Fedora-Public-Domain AND Unicode-DFS-2016
+License: MIT and Public Domain and UCD
Source: http://fontconfig.org/release/%{name}-%{version}.tar.xz
URL: http://fontconfig.org
Source1: 25-no-bitmap-fedora.conf
Source2: fc-cache
+Source3: 10-sub-pixel-rgb-for-kde.conf
# https://bugzilla.redhat.com/show_bug.cgi?id=140335
Patch0: %{name}-sleep-less.patch
Patch4: %{name}-drop-lang-from-pkgkit-format.patch
Patch5: %{name}-disable-network-required-test.patch
-Patch6: %{name}-lower-nonlatin-conf.patch
-Patch7: %{name}-fix-crash.patch
+Patch6: %{name}-desktop-property.patch
BuildRequires: libxml2-devel
BuildRequires: freetype-devel >= %{freetype_version}
BuildRequires: fontpackages-devel
-BuildRequires: gettext
+BuildRequires: autoconf automake libtool gettext
BuildRequires: gperf
BuildRequires: docbook-utils docbook-utils-pdf
-BuildRequires: meson ninja-build gcc
+BuildRequires: make
Requires: fonts-filesystem freetype
# Register DTD system-wide to make validation work by default
@@ -72,50 +71,41 @@ which is useful for developing applications that uses fontconfig.
%prep
%autosetup -p1
-# To reduce a maintenance cost of fontconfig-lower-nonlatin-conf.patch
-mv conf.d/65-nonlatin.conf conf.d/69-nonlatin.conf
%build
-%meson -Ddoc=disabled -Dcache-build=disabled -Dxml-backend=libxml2 \
- -Dadditional-fonts-dirs=/usr/share/X11/fonts/Type1,/usr/share/X11/fonts/TTF,/usr/local/share/fonts \
- -Dcache-dir=/usr/lib/fontconfig/cache \
- --default-library=shared
-%meson_build
+# We don't want to rebuild the docs, but we want to install the included ones.
+export HASDOCBOOK=no
+
+for i in doc/*.fncs; do
+ touch -r $i ${i//.fncs/.sgml}
+done
+autoreconf
+%configure --with-add-fonts=/usr/share/X11/fonts/Type1,/usr/share/X11/fonts/TTF,/usr/local/share/fonts \
+ --enable-libxml2 \
+ --disable-static --with-cache-dir=/usr/lib/fontconfig/cache
+
+make %{?_smp_mflags}
%install
-%meson_install
+make install DESTDIR=$RPM_BUILD_ROOT INSTALL="install -p"
+
+find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
install -p -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/fonts/conf.d
ln -s %{_fontconfig_templatedir}/25-unhint-nonlatin.conf $RPM_BUILD_ROOT%{_fontconfig_confdir}/
-# Use implied value to allow the use of conditional conf
+# Use conditional conf instead
rm $RPM_BUILD_ROOT%{_sysconfdir}/fonts/conf.d/10-sub-pixel-*.conf
+install -p -m 0644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/fonts/conf.d
-# Do not enable bitmap-related conf
-rm $RPM_BUILD_ROOT%{_sysconfdir}/fonts/conf.d/70-*bitmaps*.conf
-
-# Install docs manually
-install -d $RPM_BUILD_ROOT%{_mandir}/man1
-install -d $RPM_BUILD_ROOT%{_mandir}/man3
-install -d $RPM_BUILD_ROOT%{_mandir}/man5
-for f in doc/*.1; do
- install -p -m 0644 $f $RPM_BUILD_ROOT%{_mandir}/man1
-done
-for f in doc/*.3; do
- install -p -m 0644 $f $RPM_BUILD_ROOT%{_mandir}/man3
-done
-for f in doc/*.5; do
- install -p -m 0644 $f $RPM_BUILD_ROOT%{_mandir}/man5
-done
-for f in doc/*.txt doc/*.pdf doc/*.html; do
- install -p -m 0644 $f .
-done
+# move installed doc files back to build directory to package them
+# in the right place
+mv $RPM_BUILD_ROOT%{_docdir}/fontconfig/* .
+rmdir $RPM_BUILD_ROOT%{_docdir}/fontconfig/
# adjust the timestamp to avoid conflicts for multilib
touch -r doc/fontconfig-user.sgml fontconfig-user.txt
touch -r doc/fontconfig-user.sgml fontconfig-user.html
-touch -r doc/fontconfig-devel.sgml fontconfig-devel.txt
-touch -r doc/fontconfig-devel.sgml fontconfig-devel.html
# rename fc-cache binary
mv $RPM_BUILD_ROOT%{_bindir}/fc-cache $RPM_BUILD_ROOT%{_bindir}/fc-cache-%{__isa_bits}
@@ -130,7 +120,7 @@ install -p -m 0755 %{SOURCE2} $RPM_BUILD_ROOT%{_bindir}/fc-cache
cat %{name}-conf.lang >> %{name}.lang
%check
-%meson_test
+VERBOSE=1 make check
%post
umask 0022
@@ -167,7 +157,7 @@ if [ $1 == 0 ] && [ -e %{_sysconfdir}/xml/catalog ]; then
fi
%files -f %{name}.lang
-%doc README.md AUTHORS
+%doc README AUTHORS
%doc fontconfig-user.txt fontconfig-user.html
%doc %{_fontconfig_confdir}/README
%license COPYING
@@ -187,7 +177,6 @@ fi
# If you want to do so, you should use local.conf instead.
%config %{_fontconfig_masterdir}/fonts.conf
%config(noreplace) %{_fontconfig_confdir}/*.conf
-%dir /usr/lib/fontconfig
%dir /usr/lib/fontconfig/cache
%{_mandir}/man1/*
%{_mandir}/man5/*
@@ -201,93 +190,9 @@ fi
%{_datadir}/gettext/its/fontconfig.loc
%files devel-doc
-%doc fontconfig-devel.txt fontconfig-devel.html
+%doc fontconfig-devel.txt fontconfig-devel
%changelog
-* Wed Jul 23 2025 Fedora Release Engineering - 2.17.0-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
-
-* Mon Jun 30 2025 Akira TAGOH - 2.17.0-2
-- Backport a patch to fix a crash with Graphite fonts
-- Drop 70-*bitmaps*.conf from /etc/fonts/conf.d so far.
- Resolves: rhbz#2375426
-
-* Fri Jun 27 2025 Akira TAGOH - 2.17.0-1
-- New upstream release.
- Resolves: rhbz#2375126
-
-* Fri Apr 11 2025 Akira TAGOH - 2.16.2-1
-- New upstream release.
-
-* Thu Mar 13 2025 Akira TAGOH - 2.16.1-1
-- New upstream release.
-
-* Mon Jan 27 2025 Akira TAGOH - 2.16.0-2
-- Fix endian detection.
- Resolves: rhbz#2341757
-
-* Sat Jan 18 2025 Akira TAGOH - 2.16.0-1
-- New upstream release.
- Resolves: rhbz#2338618
-- Use meson instead of autotools to build.
-- Disable meson test on s390x temporarily.
-
-* Thu Jan 16 2025 Fedora Release Engineering - 2.15.0-9
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
-
-* Thu Aug 1 2024 Akira TAGOH - 2.15.0-8
-- Fix a memory leak and potentially uninitialized values.
-
-* Wed Jul 17 2024 Fedora Release Engineering - 2.15.0-7
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
-
-* Fri Jun 7 2024 Akira TAGOH - 2.15.0-6
-- Own /usr/lib/fontconfig
- Resolves: rhbz#2284076
-
-* Mon Apr 29 2024 Michael Kuhn - 2.15.0-5
-- Fix emoji fonts being disabled when bitmap fonts were disabled
-
-* Sat Feb 10 2024 Akira TAGOH - 2.15.0-4
-- Delete .uuid with fc-cache -f.
- Resolves: rhbz#1761885
-
-* Wed Jan 24 2024 Fedora Release Engineering - 2.15.0-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
-
-* Fri Jan 19 2024 Fedora Release Engineering - 2.15.0-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
-
-* Fri Dec 22 2023 Akira TAGOH - 2.15.0-1
-- New upstream release.
- Resolves: rhbz#2255623
-
-* Thu Aug 17 2023 Akira TAGOH - 2.14.2-5
-- Update 65-nonlatin.conf to 69-nonlatin.conf
- This basically provides substitutes for certain languages and is helpful
- to determine default behavior though, we have per-package config for similar purpose.
- Since 65 is mostly used for default fonts and this config prevents some behavior for
- packages named something coming later than "nonlatin" in the alphabetical order.
- So moving this to the safer priority.
- This would fixes an issue, particularly Lohit Marathi vs Lohit Devanagari after
- updating their priorities from 65 to 66.
-
-* Wed Jul 19 2023 Fedora Release Engineering - 2.14.2-4
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
-
-* Fri Jun 16 2023 Akira TAGOH - 2.14.2-3
-- Drop 10-sub-pixel-rgb-for-kde.conf
- Resolves: rhbz#2212512
-
-* Tue Apr 4 2023 Akira TAGOH - 2.14.2-2
-- Migrated license tag to SPDX.
-
-* Fri Jan 27 2023 Akira TAGOH - 2.14.2-1
-- New upstream release.
-
-* Thu Jan 19 2023 Fedora Release Engineering - 2.14.1-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
-
* Sat Nov 26 2022 Akira TAGOH - 2.14.1-2
- Enable RGB stripes layout for sub-pixel rendering on KDE only.
Resolves: rhbz#2137825
diff --git a/plans/basic.fmf b/plans/basic.fmf
deleted file mode 100644
index c1627f9..0000000
--- a/plans/basic.fmf
+++ /dev/null
@@ -1,5 +0,0 @@
-summary: Basic smoke test
-discover:
- how: fmf
-execute:
- how: tmt
diff --git a/sources b/sources
index 9a3bb99..51a9e53 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (fontconfig-2.17.0.tar.xz) = dd64905c3e0e5c5881df505b8f0bea594bbac5ce145f57aedcd7130978cd285491497198d8f2d6ed26f7b2abb31268dc3ff97aa75ce998b8e57f2d5c75b240b4
+SHA512 (fontconfig-2.14.1.tar.xz) = ba42e6f90ec92914895d2157c872c373adfc17be791b92253bcc40e85674a84e43c08ab2b37c3ae85b53b2e7bd2a7847abb479043f303b732c08eeac3ee733db
diff --git a/tests/basic/main.fmf b/tests/basic/main.fmf
deleted file mode 100644
index d6c06ec..0000000
--- a/tests/basic/main.fmf
+++ /dev/null
@@ -1,3 +0,0 @@
-summary: Concise summary describing what the test does
-test: ./test.sh
-framework: beakerlib
diff --git a/tests/basic/test.sh b/tests/basic/test.sh
deleted file mode 100755
index 10de1b4..0000000
--- a/tests/basic/test.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
-. /usr/share/beakerlib/beakerlib.sh || exit 1
-
-rlJournalStart
- rlPhaseStartSetup
- rlRun "tmp=\$(mktemp -d)" 0 "Create tmp directory"
- rlRun "pushd $tmp"
- rlRun "set -o pipefail"
- rlPhaseEnd
-
- rlPhaseStartTest
- rlRun "fc-match" 0 "Check fc-match"
- rlRun "fc-list" 0 "Check fc-list"
- rlRun "fc-scan /usr/share/fonts" 0 "Check fc-scan"
- rlPhaseEnd
-
- rlPhaseStartCleanup
- rlRun "popd"
- rlRun "rm -r $tmp" 0 "Remove tmp directory"
- rlPhaseEnd
-rlJournalEnd
diff --git a/tests/tests.yml b/tests/tests.yml
new file mode 100644
index 0000000..d3fa1ed
--- /dev/null
+++ b/tests/tests.yml
@@ -0,0 +1,14 @@
+- hosts: localhost
+ roles:
+ - role: standard-test-basic
+ tags:
+ - classic
+ required_packages:
+ - fontconfig
+ tests:
+ - fcmatch_test:
+ dir: .
+ run: fc-match
+ - fclist_test:
+ dir: .
+ run: fc-list