[packages/fontconfig] up to 2.18.1

atler atler at pld-linux.org
Tue Jun 2 17:07:54 CEST 2026


commit c4a1423cbc4d4b31525b54675155277e85c08be9
Author: Jan Palus <atler at pld-linux.org>
Date:   Tue Jun 2 17:07:41 2026 +0200

    up to 2.18.1

 fixes.patch     | 1138 -------------------------------------------------------
 fontconfig.spec |    8 +-
 2 files changed, 3 insertions(+), 1143 deletions(-)
---
diff --git a/fontconfig.spec b/fontconfig.spec
index a852fb5..805bd9b 100644
--- a/fontconfig.spec
+++ b/fontconfig.spec
@@ -8,8 +8,8 @@ Summary:	Font configuration and customization tools
 Summary(pl.UTF-8):	Narzędzia do konfigurowania fontów
 Summary(pt_BR.UTF-8):	Ferramentas para configuração e customização do acesso a fontes
 Name:		fontconfig
-Version:	2.18.0
-Release:	2
+Version:	2.18.1
+Release:	1
 Epoch:		1
 License:	MIT
 Group:		Libraries
@@ -18,11 +18,10 @@ Group:		Libraries
 # now at gitlab only
 #Source0Download: https://gitlab.freedesktop.org/fontconfig/fontconfig/-/releases
 Source0:	https://gitlab.freedesktop.org/api/v4/projects/890/packages/generic/fontconfig/%{version}/%{name}-%{version}.tar.xz
-# Source0-md5:	6d8e89d90cf4a9c5d15ae4a6c5d75537
+# Source0-md5:	7c28095f89559d9bdef9d2e5d9d882f6
 Source1:	%{name}-lcd-filter.conf
 Patch0:		%{name}-bitstream-cyberbit.patch
 Patch1:		disable-tests.patch
-Patch2:		fixes.patch
 URL:		http://fontconfig.org/
 BuildRequires:	autoconf >= 2.71
 BuildRequires:	automake >= 1:1.11
@@ -144,7 +143,6 @@ Este pacote contém a biblioteca estática do fontconfig
 %setup -q
 %patch -P0 -p1
 %patch -P1 -p1
-%patch -P2 -p1
 
 # bwrap: No permissions to creating new namespace, likely because the kernel does not allow non-privileged user namespaces...
 sed -i -e 's#BWRAP=.*#BWRAP=#g' test/run-test-map.sh
diff --git a/fixes.patch b/fixes.patch
deleted file mode 100644
index f2cd1a7..0000000
--- a/fixes.patch
+++ /dev/null
@@ -1,1138 +0,0 @@
-From ec3ac5609a95d9338744d2e39af3a29c6349d2d5 Mon Sep 17 00:00:00 2001
-From: Akira TAGOH <akira at tagoh.org>
-Date: Fri, 22 May 2026 08:07:00 +0900
-Subject: [PATCH] Fix not matching with a font family name
-
-Give higher priority to FC_FAMILY with the strong binding more than
-FC_GENERIC_FAMILY. So even if we add a default value for
-genericfamily in 49-sansserif.conf, a font that is actually
-available on the system will be picked up when it matches a query.
-
-https://gitlab.freedesktop.org/fontconfig/fontconfig/-/work_items/520
-
-Changelog: fixed
----
- src/fcmatch.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/fcmatch.c b/src/fcmatch.c
-index e0ab9503..ea6c2243 100644
---- a/src/fcmatch.c
-+++ b/src/fcmatch.c
-@@ -330,8 +330,8 @@ typedef enum _FcMatcherPriority {
-     PRI1 (COLOR),
-     PRI1 (FOUNDRY),
-     PRI1 (CHARSET),
--    PRI1 (GENERIC_FAMILY),
-     PRI_FAMILY_STRONG,
-+    PRI1 (GENERIC_FAMILY),
-     PRI_POSTSCRIPT_NAME_STRONG,
-     PRI1 (LANG),
-     PRI_FAMILY_WEAK,
--- 
-GitLab
-
-From 56a2f98298642ce34311a02f1299b0282f89a46b Mon Sep 17 00:00:00 2001
-From: Marcus Spencer <marcus at marcusspencer.us>
-Date: Fri, 22 May 2026 01:28:46 -0500
-Subject: [PATCH] Fix a null pointer dereference when computing a pattern from
- a FreeType face that has no family name
-
-Changelog: fixed
----
- src/fcfreetype.c | 39 +++++++++++++++++++++------------------
- 1 file changed, 21 insertions(+), 18 deletions(-)
-
-diff --git a/src/fcfreetype.c b/src/fcfreetype.c
-index c57f9b33..05c2e8a0 100644
---- a/src/fcfreetype.c
-+++ b/src/fcfreetype.c
-@@ -2080,28 +2080,31 @@ FcFreeTypeQueryFaceInternal (const FT_Face   face,
- 	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 (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;
-+		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);
-     }
- 
--- 
-GitLab
-
-From 661fb663fd37be1ff637f1eed9832a388981191e Mon Sep 17 00:00:00 2001
-From: Akira TAGOH <akira at tagoh.org>
-Date: Wed, 27 May 2026 13:24:33 +0900
-Subject: [PATCH 1/3] test-conf: Add a feature to load a certain config for
- testing
-
----
- test/Makefile.am |  2 +-
- test/meson.build |  3 ++-
- test/test-conf.c | 60 ++++++++++++++++++++++++++++++++++++++++++++----
- 3 files changed, 58 insertions(+), 7 deletions(-)
-
-diff --git a/test/Makefile.am b/test/Makefile.am
-index 4b6fd1e4..f6dcf2d3 100644
---- a/test/Makefile.am
-+++ b/test/Makefile.am
-@@ -104,7 +104,7 @@ TESTS += test-name-parse
- 
- 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 --git a/test/meson.build b/test/meson.build
-index 64d0035c..8bc31646 100644
---- a/test/meson.build
-+++ b/test/meson.build
-@@ -112,7 +112,8 @@ endif
- 
- 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 --git a/test/test-conf.c b/test/test-conf.c
-index 8dcc367d..8709f509 100644
---- a/test/test-conf.c
-+++ b/test/test-conf.c
-@@ -53,9 +53,9 @@ int
- 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 @@ build_env (FcConfig *config, json_object *root)
-     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 @@ bail:
- 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 @@ build_fonts (FcConfig *config, json_object *root)
- 	    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 @@ process_pattern (FcConfig  *config,
- 	    }
- 	}
-     } while (FcPatternIterNext (result, &iter2));
-- bail:
-+bail:
-     return fail;
- }
- 
--- 
-GitLab
-
-
-From 466454b59b4110dda237001deba30be3ff77a603 Mon Sep 17 00:00:00 2001
-From: Akira TAGOH <akira at tagoh.org>
-Date: Wed, 27 May 2026 13:29:44 +0900
-Subject: [PATCH 2/3] test: Add comprehensive documentation for test-conf JSON
- format
-
-Document the JSON schema used by test-conf for defining test scenarios,
-including all top-level fields (env, fonts, appfonts, filter, load_xml,
-tests), pattern value types, test methods, and common fontconfig properties.
-
-Assisted-By: Claude Sonnet 4.5 <noreply at anthropic.com>
----
- test/TEST-JSON-FORMAT.md | 482 +++++++++++++++++++++++++++++++++++++++
- 1 file changed, 482 insertions(+)
- create mode 100644 test/TEST-JSON-FORMAT.md
-
-diff --git a/test/TEST-JSON-FORMAT.md b/test/TEST-JSON-FORMAT.md
-new file mode 100644
-index 00000000..1a1cfc14
---- /dev/null
-+++ b/test/TEST-JSON-FORMAT.md
-@@ -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.
--- 
-GitLab
-
-
-From e17806afda817cf8ba2fe6e0d063617994dcdc0f Mon Sep 17 00:00:00 2001
-From: Akira TAGOH <akira at tagoh.org>
-Date: Wed, 27 May 2026 13:36:49 +0900
-Subject: [PATCH 3/3] Fix another font matching issue
-
-Do not score genericfamily by difference. it isn't like other properties.
-If it doesn't match, the matching decision should simply leaves to the next
-property.
-So we can't use FcCompareNumber for this.
-
-Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/work_items/525
-
-Changelog: fixed
----
- src/fcmatch.c            | 36 ++++++++++++++++++++++++++++++++++++
- src/fcobjs.h             |  2 +-
- test/test-issue-525.conf |  8 ++++++++
- test/test-issue-525.json | 38 ++++++++++++++++++++++++++++++++++++++
- 4 files changed, 83 insertions(+), 1 deletion(-)
- create mode 100644 test/test-issue-525.conf
- create mode 100644 test/test-issue-525.json
-
-diff --git a/src/fcmatch.c b/src/fcmatch.c
-index ea6c2243..1adbbdc2 100644
---- a/src/fcmatch.c
-+++ b/src/fcmatch.c
-@@ -164,6 +164,41 @@ FcCompareBool (const FcValue *v1, const FcValue *v2, FcValue *bestValue)
-     return (double)((v2->u.b ^ v1->u.b) == 1);
- }
- 
-+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)
- {
-@@ -296,6 +331,7 @@ FcCompareFilename (const FcValue *v1, const FcValue *v2, FcValue *bestValue)
- #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)
-diff --git a/src/fcobjs.h b/src/fcobjs.h
-index 1de0ad0e..bace9a96 100644
---- a/src/fcobjs.h
-+++ b/src/fcobjs.h
-@@ -77,5 +77,5 @@ FC_OBJECT (ORDER,		FcTypeInteger,	FcCompareNumber)
- 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 --git a/test/test-issue-525.conf b/test/test-issue-525.conf
-new file mode 100644
-index 00000000..31eb2fd1
---- /dev/null
-+++ b/test/test-issue-525.conf
-@@ -0,0 +1,8 @@
-+<fontconfig>
-+  <alias>
-+    <family>system-ui</family>
-+    <prefer>
-+      <family>Lato</family>
-+    </prefer>
-+  </alias>
-+</fontconfig>
-diff --git a/test/test-issue-525.json b/test/test-issue-525.json
-new file mode 100644
-index 00000000..86e9890e
---- /dev/null
-+++ b/test/test-issue-525.json
-@@ -0,0 +1,38 @@
-+{
-+  "fonts": [
-+    {
-+      "family": "Noto Sans",
-+      "style": "Regular",
-+      "file": "/path/to/NotoSans.ttf",
-+      "fontversion": 1,
-+      "genericfamily": 1
-+    },
-+    {
-+      "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",
-+    "conf.d/60-latin.conf",
-+    "%test%/test-issue-525.conf",
-+  ],
-+  "tests": [
-+    {
-+      "method": "match",
-+      "query": {
-+        "family": "system-ui"
-+      },
-+      "result": {
-+        "family": "Lato",
-+        "style": "Regular",
-+        "file": "/path/to/Lato.ttf",
-+        "fontversion": 1
-+      }
-+    }
-+  ]
-+}
--- 
-GitLab
-
-From 66757ccdbd43260bba3195265311cf8ca268f0d4 Mon Sep 17 00:00:00 2001
-From: Akira TAGOH <akira at tagoh.org>
-Date: Thu, 28 May 2026 12:56:25 +0900
-Subject: [PATCH 1/2] Do not set 'sans-serif' for default genericfamily
-
-To allow a custom family name for alias.
-
-Changelog: fixed
----
- conf.d/49-sansserif.conf   | 21 ---------------------
- test/test-issue-525-2.conf |  8 ++++++++
- test/test-issue-525-2.json | 38 ++++++++++++++++++++++++++++++++++++++
- test/test-issue-525.json   |  2 +-
- 4 files changed, 47 insertions(+), 22 deletions(-)
- create mode 100644 test/test-issue-525-2.conf
- create mode 100644 test/test-issue-525-2.json
-
-diff --git a/conf.d/49-sansserif.conf b/conf.d/49-sansserif.conf
-index 8446b235..b6f8f713 100644
---- a/conf.d/49-sansserif.conf
-+++ b/conf.d/49-sansserif.conf
-@@ -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 --git a/test/test-issue-525-2.conf b/test/test-issue-525-2.conf
-new file mode 100644
-index 00000000..8531931c
---- /dev/null
-+++ b/test/test-issue-525-2.conf
-@@ -0,0 +1,8 @@
-+<fontconfig>
-+  <alias>
-+    <family>-apple-system</family>
-+    <prefer>
-+      <family>Lato</family>
-+    </prefer>
-+  </alias>
-+</fontconfig>
-diff --git a/test/test-issue-525-2.json b/test/test-issue-525-2.json
-new file mode 100644
-index 00000000..cf410cab
---- /dev/null
-+++ b/test/test-issue-525-2.json
-@@ -0,0 +1,38 @@
-+{
-+  "fonts": [
-+    {
-+      "family": "Noto Sans",
-+      "style": "Regular",
-+      "file": "/path/to/NotoSans.ttf",
-+      "fontversion": 1,
-+      "genericfamily": 2
-+    },
-+    {
-+      "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 --git a/test/test-issue-525.json b/test/test-issue-525.json
-index 86e9890e..cf61dc19 100644
---- a/test/test-issue-525.json
-+++ b/test/test-issue-525.json
-@@ -18,8 +18,8 @@
-   "load_xml": [
-     "conf.d/48-guessfamily.conf",
-     "conf.d/49-sansserif.conf",
--    "conf.d/60-latin.conf",
-     "%test%/test-issue-525.conf",
-+    "conf.d/60-latin.conf",
-   ],
-   "tests": [
-     {
--- 
-GitLab
-
-
-From 31d3b16c97f8965eec7e3361015b3cb10910fc12 Mon Sep 17 00:00:00 2001
-From: Akira TAGOH <akira at tagoh.org>
-Date: Thu, 28 May 2026 13:00:06 +0900
-Subject: [PATCH 2/2] test: use const instead of number for genericfamily
-
----
- test/test-48-guessfamily.json | 16 ++++++++--------
- test/test-issue-525-2.json    |  2 +-
- test/test-issue-525.json      |  2 +-
- 3 files changed, 10 insertions(+), 10 deletions(-)
-
-diff --git a/test/test-48-guessfamily.json b/test/test-48-guessfamily.json
-index 7dedbf81..01fe8e1f 100644
---- a/test/test-48-guessfamily.json
-+++ b/test/test-48-guessfamily.json
-@@ -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 --git a/test/test-issue-525-2.json b/test/test-issue-525-2.json
-index cf410cab..ccf0e90f 100644
---- a/test/test-issue-525-2.json
-+++ b/test/test-issue-525-2.json
-@@ -5,7 +5,7 @@
-       "style": "Regular",
-       "file": "/path/to/NotoSans.ttf",
-       "fontversion": 1,
--      "genericfamily": 2
-+      "genericfamily": "sans-serif"
-     },
-     {
-       "family": "Lato",
-diff --git a/test/test-issue-525.json b/test/test-issue-525.json
-index cf61dc19..ba8e3332 100644
---- a/test/test-issue-525.json
-+++ b/test/test-issue-525.json
-@@ -5,7 +5,7 @@
-       "style": "Regular",
-       "file": "/path/to/NotoSans.ttf",
-       "fontversion": 1,
--      "genericfamily": 1
-+      "genericfamily": "sans-serif"
-     },
-     {
-       "family": "Lato",
--- 
-GitLab
-
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/fontconfig.git/commitdiff/c4a1423cbc4d4b31525b54675155277e85c08be9



More information about the pld-cvs-commit mailing list