From 66ef9c6c9c251b13711d025b3fe472d3cd81a7c6 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 7 Dec 2021 12:37:53 -0500 Subject: [PATCH] import fontconfig-2.13.94-2.el9 --- .fontconfig.metadata | 2 +- .gitignore | 2 +- SOURCES/fontconfig-hotfix.patch | 772 ----------------------------- SOURCES/fontconfig-lcdfilter.patch | 40 ++ SOURCES/fontconfig-score-fix.patch | 188 +++++++ SPECS/fontconfig.spec | 20 +- 6 files changed, 242 insertions(+), 782 deletions(-) delete mode 100644 SOURCES/fontconfig-hotfix.patch create mode 100644 SOURCES/fontconfig-lcdfilter.patch create mode 100644 SOURCES/fontconfig-score-fix.patch diff --git a/.fontconfig.metadata b/.fontconfig.metadata index eec2747..d822693 100644 --- a/.fontconfig.metadata +++ b/.fontconfig.metadata @@ -1 +1 @@ -484645daa95612521344bd88f8a4862c843d2549 SOURCES/fontconfig-2.13.93.tar.xz +4d2d34e0894141a9ed6b5693caa06560d7b741e9 SOURCES/fontconfig-2.13.94.tar.xz diff --git a/.gitignore b/.gitignore index 610450c..a41067c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/fontconfig-2.13.93.tar.xz +SOURCES/fontconfig-2.13.94.tar.xz diff --git a/SOURCES/fontconfig-hotfix.patch b/SOURCES/fontconfig-hotfix.patch deleted file mode 100644 index e506fde..0000000 --- a/SOURCES/fontconfig-hotfix.patch +++ /dev/null @@ -1,772 +0,0 @@ -From 93c93689f5da4ceaa675e006df63283e25b91d49 Mon Sep 17 00:00:00 2001 -From: Akira TAGOH -Date: Fri, 4 Dec 2020 18:18:03 +0900 -Subject: [PATCH 01/12] Add back fullname property at scan matching phase - -There seems to be a lot of config files using fullname property in the world. -To keep the backward compatibility, fullname property is back to a cache at -the scan matching phase but will be rebuilt once it is done according to family -and style property in the pattern no matter what changes one made in fullname -property during that. - -Ref. https://bugzilla.redhat.com/show_bug.cgi?id=1902881 ---- - src/fcfreetype.c | 21 ++++++++++++++++++++- - src/fcopentype.c | 2 ++ - 2 files changed, 22 insertions(+), 1 deletion(-) - -diff --git a/src/fcfreetype.c b/src/fcfreetype.c -index a7809cb..4b545bf 100644 ---- a/src/fcfreetype.c -+++ b/src/fcfreetype.c -@@ -1087,6 +1087,8 @@ static const FT_UShort nameid_order[] = { - TT_NAME_ID_WWS_FAMILY, - TT_NAME_ID_TYPOGRAPHIC_FAMILY, - TT_NAME_ID_FONT_FAMILY, -+ TT_NAME_ID_MAC_FULL_NAME, -+ TT_NAME_ID_FULL_NAME, - TT_NAME_ID_WWS_SUBFAMILY, - TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY, - TT_NAME_ID_FONT_SUBFAMILY, -@@ -1222,6 +1224,8 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, - int nfamily_lang = 0; - int nstyle = 0; - int nstyle_lang = 0; -+ int nfullname = 0; -+ int nfullname_lang = 0; - unsigned int p, n; - - FcChar8 *style = 0; -@@ -1443,7 +1447,8 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, - * and treat the instance's nameid as FONT_SUBFAMILY. - * Postscript name is automatically handled by FreeType. */ - if (nameid == TT_NAME_ID_WWS_SUBFAMILY || -- nameid == TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY) -+ nameid == TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY || -+ nameid == TT_NAME_ID_FULL_NAME) - continue; - - if (nameid == TT_NAME_ID_FONT_SUBFAMILY) -@@ -1474,6 +1479,20 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, - np = &nfamily; - nlangp = &nfamily_lang; - break; -+ case TT_NAME_ID_MAC_FULL_NAME: -+ case TT_NAME_ID_FULL_NAME: -+ if (variable) -+ break; -+ if (FcDebug () & FC_DBG_SCANV) -+ printf ("found full (n %2d p %d e %d l 0x%04x)", -+ sname.name_id, sname.platform_id, -+ sname.encoding_id, sname.language_id); -+ -+ obj = FC_FULLNAME_OBJECT; -+ objlang = FC_FULLNAMELANG_OBJECT; -+ np = &nfullname; -+ nlangp = &nfullname_lang; -+ break; - case TT_NAME_ID_WWS_SUBFAMILY: - case TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY: - case TT_NAME_ID_FONT_SUBFAMILY: -diff --git a/src/fcopentype.c b/src/fcopentype.c -index 9382a1b..59cce45 100644 ---- a/src/fcopentype.c -+++ b/src/fcopentype.c -@@ -76,12 +76,14 @@ FcPatternAddFullname (FcPattern *pat) - FcStrBufChar (&sbuf, ' '); - FcStrBufString (&sbuf, style); - } -+ FcPatternObjectDel (pat, FC_FULLNAME_OBJECT); - if (!FcPatternObjectAddString (pat, FC_FULLNAME_OBJECT, FcStrBufDoneStatic (&sbuf))) - { - FcStrBufDestroy (&sbuf); - return FcFalse; - } - FcStrBufDestroy (&sbuf); -+ FcPatternObjectDel (pat, FC_FULLNAMELANG_OBJECT); - if (!FcPatternObjectAddString (pat, FC_FULLNAMELANG_OBJECT, (const FcChar8 *) "en")) - return FcFalse; - } --- -2.29.2 - -From 3d6926380dc3c8597dc2fd9d34087da9b39dfdd9 Mon Sep 17 00:00:00 2001 -From: Ben Wagner -Date: Fri, 4 Dec 2020 15:00:08 -0500 -Subject: [PATCH 02/12] Skip leading whitespace in style name. - -Found by Clang-Tidy. The intent seems to have been to skip all leading -whitespace in the 'style' string, but instead this loop was an odd -looking no-op. Remove the 'break' from the loop so that it will -continue until end of string or a non-space character is found. ---- - src/fcopentype.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/src/fcopentype.c b/src/fcopentype.c -index 59cce45..39c05e9 100644 ---- a/src/fcopentype.c -+++ b/src/fcopentype.c -@@ -66,8 +66,7 @@ FcPatternAddFullname (FcPattern *pat) - if (FcPatternObjectGetString (pat, FC_STYLE_OBJECT, n, &style) != FcResultMatch) - return FcFalse; - len = strlen ((const char *) style); -- for (i = 0; style[i] != 0 && isspace (style[i]); i++) -- break; -+ for (i = 0; style[i] != 0 && isspace (style[i]); i++); - memcpy (style, &style[i], len - i); - FcStrBufInit (&sbuf, NULL, 0); - FcStrBufString (&sbuf, family); --- -2.29.2 - -From 97d541855429629f40a0accdd2b06b7dce7ba2db Mon Sep 17 00:00:00 2001 -From: Ben Wagner -Date: Fri, 4 Dec 2020 15:42:28 -0500 -Subject: [PATCH 03/12] Remove abort from FcCompareSize. - -There doesn't appear to be a good reason to abort when 'v1' has type -FcTypeRange. If there does turn out to be a good reason for this then it -should be better documented and the code for handling this case removed. -At worst it seems -1 should be returned as it is for other unknown -types. It is possible this is left over debug code from the initial -implementation. ---- - src/fcmatch.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/fcmatch.c b/src/fcmatch.c -index df6db71..53c3b0e 100644 ---- a/src/fcmatch.c -+++ b/src/fcmatch.c -@@ -235,7 +235,6 @@ FcCompareSize (const FcValue *v1, const FcValue *v2, FcValue *bestValue) - b1 = e1 = value1.u.d; - break; - case FcTypeRange: -- abort(); - b1 = value1.u.r->begin; - e1 = value1.u.r->end; - break; --- -2.29.2 - -From d55eaa6b3148691f32ec19c5c36dfc8818a6385f Mon Sep 17 00:00:00 2001 -From: Ben Wagner -Date: Fri, 11 Dec 2020 11:54:43 -0500 -Subject: [PATCH 07/12] Fix leaks in fcxml.c, fc-match.c, and tests. - -Fix leaks reported by AddressSanitizer when running 'make check'. ---- - fc-match/fc-match.c | 8 +++++++- - src/fcxml.c | 4 +++- - test/test-bz106632.c | 8 ++++++++ - test/test-issue180.c | 4 +++- - 4 files changed, 21 insertions(+), 3 deletions(-) - -diff --git a/fc-match/fc-match.c b/fc-match/fc-match.c -index 4362ec1..f31047e 100644 ---- a/fc-match/fc-match.c -+++ b/fc-match/fc-match.c -@@ -117,6 +117,7 @@ main (int argc, char **argv) - int brief = 0; - int sort = 0, all = 0; - const FcChar8 *format = NULL; -+ const FcChar8 *format_optarg = NULL; - int i; - FcObjectSet *os = 0; - FcFontSet *fs; -@@ -146,7 +147,7 @@ main (int argc, char **argv) - brief = 1; - break; - case 'f': -- format = (FcChar8 *) strdup (optarg); -+ format = format_optarg = (FcChar8 *) strdup (optarg); - break; - case 'V': - fprintf (stderr, "fontconfig version %d.%d.%d\n", -@@ -269,5 +270,10 @@ main (int argc, char **argv) - - FcFini (); - -+ if (format_optarg) { -+ free ((void*)format_optarg); -+ format_optarg = NULL; -+ } -+ - return 0; - } -diff --git a/src/fcxml.c b/src/fcxml.c -index 3f22581..9efe157 100644 ---- a/src/fcxml.c -+++ b/src/fcxml.c -@@ -2307,7 +2307,9 @@ FcParseCacheDir (FcConfigParse *parse) - if (data[0] == 0) - { - FcConfigMessage (parse, FcSevereWarning, "empty cache directory name ignored"); -- return; -+ FcStrFree (data); -+ data = prefix; -+ goto bail; - } - if (prefix) - { -diff --git a/test/test-bz106632.c b/test/test-bz106632.c -index 0f37b9c..c610d73 100644 ---- a/test/test-bz106632.c -+++ b/test/test-bz106632.c -@@ -221,6 +221,7 @@ main (void) - ret = 1; - goto bail; - } -+ FcFontSetDestroy (fs); - fprintf (stderr, "D: Removing %s\n", fontdir); - snprintf (cmd, 512, "sleep 1; rm -f %s%s*; sleep 1", fontdir, FC_DIR_SEPARATOR_S); - (void) system (cmd); -@@ -243,6 +244,8 @@ main (void) - ret = 3; - goto bail; - } -+ FcConfigDestroy (config); -+ - config = FcConfigCreate (); - if (!FcConfigParseAndLoadFromMemory (config, (const FcChar8 *) conf, FcTrue)) - { -@@ -266,6 +269,7 @@ main (void) - ret = 1; - goto bail; - } -+ FcFontSetDestroy (fs); - fprintf (stderr, "D: Copying %s to %s\n", FONTFILE, fontdir); - snprintf (cmd, 512, "sleep 1; cp -a %s %s; sleep 1", FONTFILE, fontdir); - (void) system (cmd); -@@ -288,6 +292,8 @@ main (void) - ret = 3; - goto bail; - } -+ FcConfigDestroy (config); -+ - config = FcConfigCreate (); - if (!FcConfigParseAndLoadFromMemory (config, (const FcChar8 *) conf, FcTrue)) - { -@@ -311,6 +317,8 @@ main (void) - ret = 1; - goto bail; - } -+ FcFontSetDestroy (fs); -+ FcConfigDestroy (config); - - bail: - fprintf (stderr, "Cleaning up\n"); -diff --git a/test/test-issue180.c b/test/test-issue180.c -index 2832d3b..9d0795e 100644 ---- a/test/test-issue180.c -+++ b/test/test-issue180.c -@@ -53,7 +53,9 @@ main (void) - fprintf (stderr, "There was one or more cachedirs\n"); - return 1; - } -+ FcStrListDone (l); - FcConfigDestroy (cfg); -+ - cfg = FcConfigCreate (); - if (!FcConfigParseAndLoadFromMemory (cfg, doc2, FcTrue)) - { -@@ -66,7 +68,7 @@ main (void) - fprintf (stderr, "There was one or more cachedirs (with prefix)\n"); - return 1; - } -- -+ FcStrListDone (l); - FcConfigDestroy (cfg); - - return 0; --- -2.29.2 - -From 5cd11d19dfb2d901e1f6b690ae504d3bf5f5ff69 Mon Sep 17 00:00:00 2001 -From: Ben Wagner -Date: Thu, 10 Dec 2020 14:12:05 -0500 -Subject: [PATCH 08/12] Fix wild frees and leak of fs in test-conf. - -Reported by AddressSanitizer when running test-conf. The `query`, -`result`, and `result_fs` were not initialized to NULL so could result -in a wild free when first initialized. - -The `method` was also not initialized to NULL so comparisons could be -made against random data if it had not yet been assigned. - -The outer `fs` was never destroyed, but is also not used, so remove. ---- - test/test-conf.c | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -diff --git a/test/test-conf.c b/test/test-conf.c -index d4de21a..6097983 100644 ---- a/test/test-conf.c -+++ b/test/test-conf.c -@@ -158,7 +158,6 @@ static FcBool - run_test (FcConfig *config, json_object *root) - { - json_object *tests; -- FcFontSet *fs; - int i, n, fail = 0; - - if (!json_object_object_get_ex (root, "tests", &tests) || -@@ -167,15 +166,15 @@ run_test (FcConfig *config, json_object *root) - fprintf (stderr, "W: No test cases defined\n"); - return FcFalse; - } -- fs = FcFontSetCreate (); - n = json_object_array_length (tests); - for (i = 0; i < n; i++) - { - json_object *obj = json_object_array_get_idx (tests, i); - json_object_iter iter; -- FcPattern *query, *result; -- FcFontSet *result_fs; -- const char *method; -+ FcPattern *query = NULL; -+ FcPattern *result = NULL; -+ FcFontSet *result_fs = NULL; -+ const char *method = NULL; - - if (json_object_get_type (obj) != json_type_object) - continue; --- -2.29.2 - -From b35c72dbc7da5b61a84766cfa431c95c1d1b35bd Mon Sep 17 00:00:00 2001 -From: Ben Wagner -Date: Tue, 15 Dec 2020 17:39:05 -0500 -Subject: [PATCH 09/12] Always run-test-conf, but skip if not built. - -The test-conf test requires libjson-c to be available in order to be -built. However, there has been no user indication that additional tests -could be built if the json-c development files were available. - -Continue to not build test-conf if json-c is not available, but do run -the test harness. The test harness is updated to SKIP the test if the -test-conf binary is unavailable. ---- - test/Makefile.am | 2 +- - test/run-test-conf.sh | 6 ++++++ - 2 files changed, 7 insertions(+), 1 deletion(-) - -diff --git a/test/Makefile.am b/test/Makefile.am -index 5a998b3..1a9b293 100644 ---- a/test/Makefile.am -+++ b/test/Makefile.am -@@ -101,8 +101,8 @@ if ENABLE_JSONC - check_PROGRAMS += test-conf - test_conf_CFLAGS = $(JSONC_CFLAGS) - test_conf_LDADD = $(top_builddir)/src/libfontconfig.la $(JSONC_LIBS) --TESTS += run-test-conf.sh - endif -+TESTS += run-test-conf.sh - - check_PROGRAMS += test-bz106618 - test_bz106618_LDADD = $(top_builddir)/src/libfontconfig.la -diff --git a/test/run-test-conf.sh b/test/run-test-conf.sh -index 437bafa..e085e82 100644 ---- a/test/run-test-conf.sh -+++ b/test/run-test-conf.sh -@@ -33,6 +33,12 @@ BUILDTESTDIR=${builddir-"$MyPWD"} - - RUNNER=../test/test-conf$EXEEXT - -+if [ ! -f ${RUNNER} ]; then -+ echo "${RUNNER} not found!\n" -+ echo "Building this test requires libjson-c development files to be available." -+ exit 77 # SKIP -+fi -+ - for i in \ - 60-generic.conf \ - 90-synthetic.conf \ --- -2.29.2 - -From 921ede9f460fb661146182809557a1da2dd7afd7 Mon Sep 17 00:00:00 2001 -From: Ben Wagner -Date: Tue, 15 Dec 2020 16:30:14 -0500 -Subject: [PATCH 10/12] Fix test-conf string to integer conversion. - -The test-conf build_pattern attempted to convert known constant strings -into integer values. However, it did so by always converting the string -value to an integer if possible and then complaining if the key wasn't -of the expected type. This lead to error messages on "style": "Regular" -since "Regular" was recognized as "weight". - -Instead, only attempt conversion from string to integer if the key is -the name of an object which can take an integer type. This eliminates -the spurious non-fatal errors reported when parsing -test-90-synthetic.json. - -This also fixes an issue where the created value was given the type of -the object found, but the integer field was assigned. Instead, check -that the object type can take an integer and always set the value type -to integer. ---- - test/test-conf.c | 25 ++++++++++++++----------- - 1 file changed, 14 insertions(+), 11 deletions(-) - -diff --git a/test/test-conf.c b/test/test-conf.c -index 6097983..288bb5b 100644 ---- a/test/test-conf.c -+++ b/test/test-conf.c -@@ -69,22 +69,25 @@ build_pattern (json_object *obj) - } - else if (json_object_get_type (iter.val) == json_type_string) - { -- const FcConstant *c = FcNameGetConstant ((const FcChar8 *) json_object_get_string (iter.val)); -- FcBool b; -- -- if (c) -+ const FcObjectType *o = FcNameGetObjectType (iter.key); -+ if (o && (o->type == FcTypeRange || o->type == FcTypeDouble || o->type == FcTypeInteger)) - { -- const FcObjectType *o; -- -+ const FcConstant *c = FcNameGetConstant ((const FcChar8 *) json_object_get_string (iter.val)); -+ if (!c) { -+ fprintf (stderr, "E: value is not a known constant\n"); -+ fprintf (stderr, " key: %s\n", iter.key); -+ fprintf (stderr, " val: %s\n", json_object_get_string (iter.val)); -+ continue; -+ } - if (strcmp (c->object, iter.key) != 0) - { -- fprintf (stderr, "E: invalid object type for const\n"); -- fprintf (stderr, " actual result: %s\n", iter.key); -- fprintf (stderr, " expected result: %s\n", c->object); -+ fprintf (stderr, "E: value is a constant of different object\n"); -+ fprintf (stderr, " key: %s\n", iter.key); -+ fprintf (stderr, " val: %s\n", json_object_get_string (iter.val)); -+ fprintf (stderr, " key implied by value: %s\n", c->object); - continue; - } -- o = FcNameGetObjectType (c->object); -- v.type = o->type; -+ v.type = FcTypeInteger; - v.u.i = c->value; - } - else if (strcmp (json_object_get_string (iter.val), "DontCare") == 0) --- -2.29.2 - -From df29933e1a06b7aa7af229bd7cd03c62d957f15f Mon Sep 17 00:00:00 2001 -From: Szunti -Date: Sun, 6 Dec 2020 12:52:44 +0100 -Subject: [PATCH 11/12] Check qual and compare for family tests - -Fixes #267. Hash table lookups assumed qual="any" compare="eq". -Add a test too. ---- - src/fccfg.c | 16 ++- - test/Makefile.am | 4 + - test/meson.build | 1 + - test/test-family-matching.c | 228 ++++++++++++++++++++++++++++++++++++ - 4 files changed, 248 insertions(+), 1 deletion(-) - create mode 100644 test/test-family-matching.c - -diff --git a/src/fccfg.c b/src/fccfg.c -index 7b857bf..00a94e5 100644 ---- a/src/fccfg.c -+++ b/src/fccfg.c -@@ -1714,6 +1714,7 @@ FcConfigMatchValueList (FcPattern *p, - FcExpr *e = t->expr; - FcValue value; - FcValueList *v; -+ FcOp op; - - while (e) - { -@@ -1731,10 +1732,23 @@ FcConfigMatchValueList (FcPattern *p, - - if (t->object == FC_FAMILY_OBJECT && table) - { -- if (!FamilyTableLookup (table, t->op, FcValueString (&value))) -+ op = FC_OP_GET_OP (t->op); -+ if (op == FcOpEqual || op == FcOpListing) - { -+ if (!FamilyTableLookup (table, t->op, FcValueString (&value))) -+ { - ret = 0; - goto done; -+ } -+ } -+ if (op == FcOpNotEqual && t->qual == FcQualAll) -+ { -+ ret = 0; -+ if (!FamilyTableLookup (table, t->op, FcValueString (&value))) -+ { -+ ret = values; -+ } -+ goto done; - } - } - for (v = values; v; v = FcValueListNext(v)) -diff --git a/test/Makefile.am b/test/Makefile.am -index 1a9b293..30d8c2a 100644 ---- a/test/Makefile.am -+++ b/test/Makefile.am -@@ -167,6 +167,10 @@ check_PROGRAMS += test-issue180 - test_issue180_LDADD = $(top_builddir)/src/libfontconfig.la - TESTS += test-issue180 - -+check_PROGRAMS += test-family-matching -+test_family_matching_LDADD = $(top_builddir)/src/libfontconfig.la -+TESTS += test-family-matching -+ - EXTRA_DIST=run-test.sh run-test-conf.sh $(LOG_COMPILER) $(TESTDATA) out.expected-long-family-names out.expected-no-long-family-names - - CLEANFILES = \ -diff --git a/test/meson.build b/test/meson.build -index 96b30a9..59de427 100644 ---- a/test/meson.build -+++ b/test/meson.build -@@ -6,6 +6,7 @@ tests = [ - ['test-bz106618.c'], - ['test-bz1744377.c'], - ['test-issue180.c'], -+ ['test-family-matching.c'], - ] - - if host_machine.system() != 'windows' -diff --git a/test/test-family-matching.c b/test/test-family-matching.c -new file mode 100644 -index 0000000..9fab36c ---- /dev/null -+++ b/test/test-family-matching.c -@@ -0,0 +1,228 @@ -+/* -+ * fontconfig/test/test-family-matching.c -+ * -+ * Copyright © 2020 Zoltan Vandrus -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and its -+ * documentation for any purpose is hereby granted without fee, provided that -+ * the above copyright notice appear in all copies and that both that -+ * copyright notice and this permission notice appear in supporting -+ * documentation, and that the name of the author(s) not be used in -+ * advertising or publicity pertaining to distribution of the software without -+ * specific, written prior permission. The authors make no -+ * representations about the suitability of this software for any purpose. It -+ * is provided "as is" without express or implied warranty. -+ * -+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -+ * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR -+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -+ * PERFORMANCE OF THIS SOFTWARE. -+ */ -+#include -+#include -+#include -+ -+#define FC_TEST_RESULT "testresult" -+ -+typedef enum _TestMatchResult { -+ TestMatch, -+ TestNoMatch, -+ TestMatchError -+} TestMatchResult; -+ -+typedef enum _TestResult { -+ TestPassed, -+ TestFailed, -+ TestError -+} TestResult; -+ -+static TestMatchResult -+TestMatchPattern (const char *test, FcPattern *p) -+{ -+ const FcChar8 *xml_pre = (const FcChar8 *) "" -+ "\n" -+ " \n" -+ ""; -+ -+ const FcChar8 *xml_post = (const FcChar8 *) "" -+ " \n" -+ " true\n" -+ " \n" -+ " \n" -+ "\n" -+ ""; -+ -+ FcChar8 *xml, *concat; -+ FcConfig *cfg; -+ FcResult result; -+ FcBool dummy; -+ TestResult ret = TestMatchError; -+ -+ FcPattern *pat = FcPatternDuplicate (p); -+ if (!pat) -+ { -+ fprintf (stderr, "Unable to duplicate pattern.\n"); -+ goto bail0; -+ } -+ -+ concat = FcStrPlus (xml_pre, (const FcChar8 *) test); -+ if (!concat) -+ { -+ fprintf (stderr, "Concatenation failed.\n"); -+ goto bail0; -+ } -+ -+ xml = FcStrPlus (concat, xml_post); -+ FcStrFree (concat); -+ if (!xml) -+ { -+ fprintf (stderr, "Concatenation failed.\n"); -+ goto bail0; -+ } -+ -+ cfg = FcConfigCreate (); -+ if (!cfg) -+ { -+ fprintf (stderr, "Unable to create a new empty config.\n"); -+ return TestMatchError; -+ } -+ -+ if (!FcConfigParseAndLoadFromMemory (cfg, xml, FcTrue)) -+ { -+ fprintf (stderr, "Unable to load a config from memory.\n"); -+ goto bail1; -+ } -+ -+ if (!FcConfigSubstitute (cfg, pat, FcMatchPattern)) -+ { -+ fprintf (stderr, "Unable to substitute config.\n"); -+ goto bail1; -+ } -+ -+ result = FcPatternGetBool (pat, FC_TEST_RESULT, 0, &dummy); -+ switch (result) { -+ case FcResultMatch: -+ ret = TestMatch; -+ break; -+ case FcResultNoMatch: -+ ret = TestNoMatch; -+ break; -+ default: -+ fprintf (stderr, "Unable to check pattern.\n"); -+ break; -+ } -+ -+bail1: -+ FcConfigDestroy (cfg); -+bail0: -+ FcPatternDestroy (pat); -+ return ret; -+} -+ -+static TestResult -+TestShouldMatchPattern(const char* test, FcPattern *pat, int negate) -+{ -+ switch (TestMatchPattern (test, pat)) { -+ case TestMatch: -+ if (!negate) { -+ return TestPassed; -+ } -+ else -+ { -+ printf ("Following test unexpectedly matched:\n%s", test); -+ printf ("on\n"); -+ FcPatternPrint (pat); -+ return TestFailed; -+ } -+ break; -+ case TestNoMatch: -+ if (!negate) { -+ printf ("Following test should have matched:\n%s", test); -+ printf ("on\n"); -+ FcPatternPrint (pat); -+ return TestFailed; -+ } -+ else -+ { -+ return TestPassed; -+ } -+ break; -+ case TestMatchError: -+ return TestError; -+ break; -+ default: -+ fprintf (stderr, "This shouldn't have been reached.\n"); -+ return TestError; -+ } -+} -+ -+#define MAX(a,b) ((a) > (b) ? (a) : (b)) -+ -+static TestResult -+UpdateResult (TestResult* res, TestResult resNew) -+{ -+ *res = MAX(*res, resNew); -+ return *res; -+} -+ -+static TestResult -+TestFamily (void) -+{ -+ const char *test; -+ TestResult res = TestPassed; -+ -+ FcPattern *pat = FcPatternBuild (NULL, -+ FC_FAMILY, FcTypeString, "family1", -+ FC_FAMILY, FcTypeString, "family2", -+ FC_FAMILY, FcTypeString, "family3", -+ NULL); -+ -+ if (!pat) -+ { -+ fprintf (stderr, "Unable to build pattern.\n"); -+ return TestError; -+ } -+ -+ #define SHOULD_MATCH(p,t) \ -+ UpdateResult (&res, TestShouldMatchPattern (t, p, 0)) -+ #define SHOULD_NOT_MATCH(p,t) \ -+ UpdateResult (&res, TestShouldMatchPattern (t, p, 1)) -+ -+ test = "\n" -+ " foo\n" -+ "\n" -+ ""; -+ SHOULD_MATCH(pat, test); -+ -+ test = "" -+ "\n" -+ " family2\n" -+ "\n" -+ ""; -+ SHOULD_NOT_MATCH(pat, test); -+ -+ test = "" -+ "\n" -+ " family3\n" -+ "\n" -+ ""; -+ SHOULD_MATCH(pat, test); -+ -+ test = "" -+ "\n" -+ " foo\n" -+ "\n" -+ ""; -+ SHOULD_NOT_MATCH(pat, test); -+ -+ return res; -+} -+ -+int -+main (void) -+{ -+ return (TestFamily ()); -+} --- -2.29.2 - diff --git a/SOURCES/fontconfig-lcdfilter.patch b/SOURCES/fontconfig-lcdfilter.patch new file mode 100644 index 0000000..c99cdb6 --- /dev/null +++ b/SOURCES/fontconfig-lcdfilter.patch @@ -0,0 +1,40 @@ +From 2b897d4624f015c0f59a9f46925b758adfc79190 Mon Sep 17 00:00:00 2001 +From: Akira TAGOH +Date: Mon, 19 Jul 2021 21:03:20 +0900 +Subject: [PATCH] Enable 11-lcdfilter-default.conf by default + +Some applications needs this enabled by default on non-GNOME desktops. + +reference: https://bugzilla.redhat.com/show_bug.cgi?id=1965684 +--- + conf.d/Makefile.am | 1 + + conf.d/meson.build | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/conf.d/Makefile.am b/conf.d/Makefile.am +index 710318c1..43b6e2b9 100644 +--- a/conf.d/Makefile.am ++++ b/conf.d/Makefile.am +@@ -32,6 +32,7 @@ DOC_FILES = $(DOC_SOURCES:.in=) + CONF_LINKS = \ + 10-hinting-$(PREFERRED_HINTING).conf \ + 10-scale-bitmap-fonts.conf \ ++ 11-lcdfilter-default.conf \ + 20-unhint-small-vera.conf \ + 30-metric-aliases.conf \ + 40-nonlatin.conf \ +diff --git a/conf.d/meson.build b/conf.d/meson.build +index 2cb144ee..172e2af2 100644 +--- a/conf.d/meson.build ++++ b/conf.d/meson.build +@@ -42,6 +42,7 @@ preferred_hinting = 'slight' + conf_links = [ + '10-hinting-@0@.conf'.format(preferred_hinting), + '10-scale-bitmap-fonts.conf', ++ '11-lcdfilter-default.conf', + '20-unhint-small-vera.conf', + '30-metric-aliases.conf', + '40-nonlatin.conf', +-- +2.32.0 + diff --git a/SOURCES/fontconfig-score-fix.patch b/SOURCES/fontconfig-score-fix.patch new file mode 100644 index 0000000..1842985 --- /dev/null +++ b/SOURCES/fontconfig-score-fix.patch @@ -0,0 +1,188 @@ +From 4d43f84188847a6a77f7259f986fb178c52c1ea7 Mon Sep 17 00:00:00 2001 +From: Akira TAGOH +Date: Thu, 8 Jul 2021 14:21:50 +0900 +Subject: [PATCH 1/2] Do not set different score to non-string values + +Non-string values in a cache is supposed to choose one from them. +Due to the change of da1c9f7a, there was a regression on scoring for +matching functions. So reverting the behavior for evaluating non-string +values to the previous one. + +Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/286 +--- + src/fcmatch.c | 2 +- + test/Makefile.am | 1 + + test/run-test-conf.sh | 1 + + test/test-conf.c | 71 ++++++++++++++++++++++++++-------------- + test/test-issue-286.json | 35 ++++++++++++++++++++ + 5 files changed, 85 insertions(+), 25 deletions(-) + create mode 100644 test/test-issue-286.json + +diff --git a/src/fcmatch.c b/src/fcmatch.c +index c88e3aa..fd43cbd 100644 +--- a/src/fcmatch.c ++++ b/src/fcmatch.c +@@ -433,7 +433,7 @@ FcCompareValueList (FcObject object, + *result = FcResultTypeMismatch; + return FcFalse; + } +- v = v * 1000 + j * 100 + k; ++ v = v * 1000 + j * 100 + k * (v2->value.type == FcTypeString ? 1 : 0); + if (v < best) + { + if (bestValue) +diff --git a/test/Makefile.am b/test/Makefile.am +index aea8724..d07654b 100644 +--- a/test/Makefile.am ++++ b/test/Makefile.am +@@ -47,6 +47,7 @@ TESTDATA = \ + test-45-generic.json \ + test-60-generic.json \ + test-90-synthetic.json \ ++ test-issue-286.json \ + test-style-match.json \ + $(NULL) + +diff --git a/test/run-test-conf.sh b/test/run-test-conf.sh +index 0c2bd52..bbb56f4 100644 +--- a/test/run-test-conf.sh ++++ b/test/run-test-conf.sh +@@ -49,6 +49,7 @@ for i in \ + $RUNNER $TESTDIR/../conf.d/$i $TESTDIR/$test_json + done + for i in \ ++ test-issue-286.json \ + test-style-match.json \ + ; do + echo $RUNNER $TESTDIR/$i ... +diff --git a/test/test-conf.c b/test/test-conf.c +index e4e9da4..1a52c6e 100644 +--- a/test/test-conf.c ++++ b/test/test-conf.c +@@ -207,35 +207,58 @@ build_pattern (json_object *obj) + } + } + } else if (type == json_type_double || type == json_type_int) { ++ const FcObjectType *fc_o = FcNameGetObjectType (iter.key); + double values[4]; +- if (n != 2 && n != 4) { +- fprintf (stderr, "E: array starting with number not range or matrix\n"); ++ ++ if (fc_o && fc_o->type == FcTypeDouble) { ++ for (i = 0; i < n; i++) ++ { ++ o = json_object_array_get_idx (iter.val, i); ++ type = json_object_get_type (o); ++ if (type == json_type_double) { ++ v.type = FcTypeDouble; ++ v.u.d = json_object_get_double (o); ++ } else if (type == json_type_int) { ++ v.type = FcTypeInteger; ++ v.u.i = json_object_get_int (o); ++ } else { ++ fprintf (stderr, "E: unable to convert to double\n"); ++ continue; ++ } ++ FcPatternAdd (pat, iter.key, v, FcTrue); ++ v.type = FcTypeVoid; ++ } + continue; +- } +- for (i = 0; i < n; i++) { +- o = json_object_array_get_idx (iter.val, i); +- type = json_object_get_type (o); +- if (type != json_type_double && type != json_type_int) { +- fprintf (stderr, "E: numeric array entry not a number\n"); ++ } else { ++ if (n != 2 && n != 4) { ++ fprintf (stderr, "E: array starting with number not range or matrix\n"); + continue; + } +- values[i] = json_object_get_double (o); +- } +- if (n == 2) { +- v.type = FcTypeRange; +- v.u.r = FcRangeCreateDouble (values[0], values[1]); +- if (!v.u.r) { +- fprintf (stderr, "E: failed to create range\n"); +- continue; ++ for (i = 0; i < n; i++) { ++ o = json_object_array_get_idx (iter.val, i); ++ type = json_object_get_type (o); ++ if (type != json_type_double && type != json_type_int) { ++ fprintf (stderr, "E: numeric array entry not a number\n"); ++ continue; ++ } ++ values[i] = json_object_get_double (o); ++ } ++ if (n == 2) { ++ v.type = FcTypeRange; ++ v.u.r = FcRangeCreateDouble (values[0], values[1]); ++ if (!v.u.r) { ++ fprintf (stderr, "E: failed to create range\n"); ++ continue; ++ } ++ destroy_v = FcTrue; ++ } else { ++ v.type = FcTypeMatrix; ++ v.u.m = &matrix; ++ matrix.xx = values[0]; ++ matrix.xy = values[1]; ++ matrix.yx = values[2]; ++ matrix.yy = values[3]; + } +- destroy_v = FcTrue; +- } else { +- v.type = FcTypeMatrix; +- v.u.m = &matrix; +- matrix.xx = values[0]; +- matrix.xy = values[1]; +- matrix.yx = values[2]; +- matrix.yy = values[3]; + } + } else { + fprintf (stderr, "E: array format not recognized\n"); +diff --git a/test/test-issue-286.json b/test/test-issue-286.json +new file mode 100644 +index 0000000..a3199fa +--- /dev/null ++++ b/test/test-issue-286.json +@@ -0,0 +1,35 @@ ++{ ++ "fonts": [ ++ { ++ "family": "Foo", ++ "style": "Italic", ++ "pixelsize": [15, 16, 17, 18], ++ "file": "/path/to/Foo-Italic.ttf", ++ "fontversion": 133365 ++ }, ++ { ++ "family": "Foo", ++ "style": "Regular", ++ "pixelsize": [11, 12, 13, 14, 15, 16, 17, 18, 22], ++ "file": "/path/to/Foo-Regular.ttf", ++ "fontversion": 133365 ++ } ++ ], ++ "tests": [ ++ { ++ "method": "match", ++ "query": { ++ "family": "Foo", ++ "style": "Regular", ++ "pixelsize": 16 ++ }, ++ "result": { ++ "family": "Foo", ++ "style": "Regular", ++ "pixelsize": 16, ++ "file": "/path/to/Foo-Regular.ttf", ++ "fontversion": 133365 ++ } ++ } ++ ] ++} +-- +2.31.1 + diff --git a/SPECS/fontconfig.spec b/SPECS/fontconfig.spec index ae1f29b..6b7d167 100644 --- a/SPECS/fontconfig.spec +++ b/SPECS/fontconfig.spec @@ -4,8 +4,8 @@ Summary: Font configuration and customization library Name: fontconfig -Version: 2.13.93 -Release: 8%{?dist} +Version: 2.13.94 +Release: 2%{?dist} # src/ftglue.[ch] is in Public Domain # src/fccache.c contains Public Domain code # fc-case/CaseFolding.txt is in the UCD @@ -20,7 +20,8 @@ Source2: fc-cache Patch0: %{name}-sleep-less.patch Patch4: %{name}-drop-lang-from-pkgkit-format.patch Patch5: %{name}-disable-network-required-test.patch -Patch6: %{name}-hotfix.patch +Patch6: %{name}-score-fix.patch +Patch7: %{name}-lcdfilter.patch BuildRequires: libxml2-devel BuildRequires: freetype-devel >= %{freetype_version} @@ -188,12 +189,15 @@ fi %doc fontconfig-devel.txt fontconfig-devel %changelog -* Mon Aug 09 2021 Mohan Boddu - 2.13.93-8 -- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags - Related: rhbz#1991688 +* Tue Jul 20 2021 Akira TAGOH - 2.13.94-2 +- Fix the score calculation on matching for multiple values. +- Enable 11-lcdfilter-default.conf. + Resolves: rhbz#1965684 +- Rebase to the latest release. + Resolves: rhbz#2023161 -* Thu Apr 15 2021 Mohan Boddu - 2.13.93-7 -- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 +* Thu Jun 29 2021 Akira TAGOH - 2.13.94-1 +- New upstream release. * Thu Mar 25 2021 Akira TAGOH - 2.13.93-6 - Fix postun scriptlet to remove the entry from xml catalog.