conf.d/70-no-bitmaps-and-emoji.conf | 13 +++++++++ conf.d/70-no-bitmaps-except-emoji.conf | 14 +++++++++ conf.d/70-no-bitmaps.conf | 11 +------ conf.d/Makefile.am | 2 + conf.d/meson.build | 2 + doc/fcconfig.fncs | 13 +++++++++ fontconfig/fontconfig.h | 4 ++ src/fcint.h | 4 -- test/Makefile.am | 10 ++++-- test/run-test-conf.sh | 2 + test/test-70-no-bitmaps-and-emoji.json | 34 +++++++++++++++++++++++ test/test-70-no-bitmaps-except-emoji.json | 43 ++++++++++++++++++++++++++++++ test/test-conf.c | 27 ++++++++++++++---- 13 files changed, 156 insertions(+), 23 deletions(-) New commits: commit c6849aca73c60c3fcba5c6e4e2cb2d7b59050dd2 Author: Akira TAGOH <akira@xxxxxxxxx> Date: Fri Mar 8 03:02:33 2024 +0900 Add test cases for 70-no-bitmap-and-emoji.conf and 70-no-bitmap-except-emoji.conf diff --git a/doc/fcconfig.fncs b/doc/fcconfig.fncs index df25e2d..49e691e 100644 --- a/doc/fcconfig.fncs +++ b/doc/fcconfig.fncs @@ -502,3 +502,16 @@ before using <function>FcConfigFileInfoIterInit</function> and then <function>FcConfigDestroy</function> when the relevant values are no longer referenced. @SINCE@ 2.12.91 @@ + +@RET@ FcBool +@FUNC@ FcConfigAcceptFont +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcPattern * @ARG2@ pat +@PURPOSE@ Test whether the given pattern matches deny list +@DESC@ +fontconfig has the deny list which is built against <rejectfont> directive +in configuration file. This function tries to match 'pat' with them and +return FcFalse if 'pat' is rejected, otherwise FcTrue. +@SINCE@ 2.15.1 +@@ + diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h index 77974e1..47d7b83 100644 --- a/fontconfig/fontconfig.h +++ b/fontconfig/fontconfig.h @@ -453,6 +453,10 @@ FcPublic FcFontSet * FcConfigGetFonts (FcConfig *config, FcSetName set); +FcPublic FcBool +FcConfigAcceptFont (FcConfig *config, + const FcPattern *font); + FcPublic FcBool FcConfigAppFontAddFile (FcConfig *config, const FcChar8 *file); diff --git a/src/fcint.h b/src/fcint.h index fbf0e81..86676b3 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -732,10 +732,6 @@ FcConfigPatternsAdd (FcConfig *config, FcPattern *pattern, FcBool accept); -FcPrivate FcBool -FcConfigAcceptFont (FcConfig *config, - const FcPattern *font); - FcPrivate FcFileTime FcConfigModifiedTime (FcConfig *config); diff --git a/test/Makefile.am b/test/Makefile.am index 03f7324..3b79c78 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,8 +1,8 @@ -# +# # test/Makefile.am -# +# # Copyright © 2003 Keith Packard -# +# # 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 @@ -12,7 +12,7 @@ # 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 @@ -46,6 +46,8 @@ TESTDATA = \ fonts.conf.in \ test-45-generic.json \ test-60-generic.json \ + test-70-no-bitmaps-and-emoji.json \ + test-70-no-bitmaps-except-emoji.json \ test-90-synthetic.json \ test-issue-286.json \ test-style-match.json \ diff --git a/test/run-test-conf.sh b/test/run-test-conf.sh index bbb56f4..20b80e1 100644 --- a/test/run-test-conf.sh +++ b/test/run-test-conf.sh @@ -42,6 +42,8 @@ fi for i in \ 45-generic.conf \ 60-generic.conf \ + 70-no-bitmaps-and-emoji.conf \ + 70-no-bitmaps-except-emoji.conf \ 90-synthetic.conf \ ; do test_json=$(echo test-$i|sed s'/\.conf/.json/') diff --git a/test/test-70-no-bitmaps-and-emoji.json b/test/test-70-no-bitmaps-and-emoji.json new file mode 100644 index 0000000..6868a5b --- /dev/null +++ b/test/test-70-no-bitmaps-and-emoji.json @@ -0,0 +1,34 @@ +{ + "fonts": [ + { + "family": "Noto Color Emoji", + "style": "Regular", + "outline": false, + "scalable": true + }, + { + "family": "Fixed", + "style": "Regular", + "outline": false, + "scalable": false + } + ], + "tests": [ + { + "method": "match", + "query": { + "family": "Noto Color Emoji" + }, + "result": { + } + }, + { + "method": "match", + "query": { + "family": "Fixed" + }, + "result": { + } + } + ] +} diff --git a/test/test-70-no-bitmaps-except-emoji.json b/test/test-70-no-bitmaps-except-emoji.json new file mode 100644 index 0000000..fbef5af --- /dev/null +++ b/test/test-70-no-bitmaps-except-emoji.json @@ -0,0 +1,43 @@ +{ + "fonts": [ + { + "family": "Noto Color Emoji", + "style": "Regular", + "outline": false, + "scalable": true + }, + { + "family": "Fixed", + "style": "Regular", + "outline": false, + "scalable": false + } + ], + "tests": [ + { + "method": "match", + "query": { + "family": "Noto Color Emoji" + }, + "result": { + "family": "Noto Color Emoji", + "style": "Regular", + "outline": false, + "scalable": true + } + }, + { + "method": "match", + "query": { + "family": "Fixed" + }, + "$comment": "fontconfig always fallback to something. Even though the expected result here would be no result.", + "result": { + "family": "Noto Color Emoji", + "style": "Regular", + "outline": false, + "scalable": true + } + } + ] +} diff --git a/test/test-conf.c b/test/test-conf.c index 235dce5..c5ddabe 100644 --- a/test/test-conf.c +++ b/test/test-conf.c @@ -278,7 +278,7 @@ build_pattern (json_object *obj) } static FcFontSet * -build_fs (json_object *obj) +build_fs (FcConfig *config, json_object *obj) { FcFontSet *fs = FcFontSetCreate (); int i, n; @@ -292,7 +292,10 @@ build_fs (json_object *obj) if (json_object_get_type (o) != json_type_object) continue; pat = build_pattern (o); - FcFontSetAdd (fs, pat); + if (FcConfigAcceptFont (config, pat)) + FcFontSetAdd (fs, pat); + else + FcPatternDestroy(pat); } return fs; @@ -310,7 +313,7 @@ build_fonts (FcConfig *config, json_object *root) fprintf (stderr, "W: No fonts defined\n"); return FcFalse; } - fs = build_fs (fonts); + fs = build_fs (config, fonts); /* FcConfigSetFonts (config, fs, FcSetSystem); */ if (config->fonts[FcSetSystem]) FcFontSetDestroy (config->fonts[FcSetSystem]); @@ -385,7 +388,11 @@ run_test (FcConfig *config, json_object *root) } if (result_fs) FcFontSetDestroy (result_fs); - result_fs = build_fs (iter.val); + result_fs = build_fs (config, iter.val); + } + else if (strcmp (iter.key, "$comment") == 0) + { + /* ignore it */ } else { @@ -453,8 +460,16 @@ run_test (FcConfig *config, json_object *root) } else { - fprintf (stderr, "E: no match\n"); - fail++; + FcPatternIter iter; + int x, vc; + + FcPatternIterStart (result, &iter); + vc = FcPatternIterValueCount (result, &iter); + if (vc > 0) + { + fprintf (stderr, "E: no match\n"); + fail++; + } } } else if (method != NULL && strcmp (method, "list") == 0) commit 810a300398dc93b7becca4a7f286e8999adc09a5 Author: Akira TAGOH <akira@xxxxxxxxx> Date: Fri Mar 8 01:55:14 2024 +0900 Sort out bitmap related config files 70-no-bitmaps-and-emoji.conf: reject bitmap fonts including bitmap emoji fonts. 70-no-bitmaps-except-emoji.conf: reject bitmap fonts except bitmap emoji fonts. 70-no-bitmaps.conf: same to 70-no-bitmaps-except-emoji.conf for backward compatibility but deprecated. This will be dropped in the future. Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/409 diff --git a/conf.d/70-no-bitmaps-and-emoji.conf b/conf.d/70-no-bitmaps-and-emoji.conf new file mode 100644 index 0000000..3e18a4c --- /dev/null +++ b/conf.d/70-no-bitmaps-and-emoji.conf @@ -0,0 +1,13 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd"> +<fontconfig> + <description>Reject bitmap fonts, including bitmap emoji fonts</description> + <!-- Reject bitmap fonts --> + <selectfont> + <rejectfont> + <pattern> + <patelt name="outline"><bool>false</bool></patelt> + </pattern> + </rejectfont> + </selectfont> +</fontconfig> diff --git a/conf.d/70-no-bitmaps-except-emoji.conf b/conf.d/70-no-bitmaps-except-emoji.conf new file mode 100644 index 0000000..3170cd6 --- /dev/null +++ b/conf.d/70-no-bitmaps-except-emoji.conf @@ -0,0 +1,14 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd"> +<fontconfig> + <description>Reject bitmap fonts except bitmap emoji fonts</description> + <!-- Reject bitmap fonts --> + <selectfont> + <rejectfont> + <pattern> + <patelt name="outline"><bool>false</bool></patelt> + <patelt name="scalable"><bool>false</bool></patelt> + </pattern> + </rejectfont> + </selectfont> +</fontconfig> diff --git a/conf.d/70-no-bitmaps.conf b/conf.d/70-no-bitmaps.conf index 10203ac..767e411 100644 --- a/conf.d/70-no-bitmaps.conf +++ b/conf.d/70-no-bitmaps.conf @@ -1,13 +1,6 @@ <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd"> <fontconfig> - <description>Reject bitmap fonts</description> -<!-- Reject bitmap fonts --> - <selectfont> - <rejectfont> - <pattern> - <patelt name="outline"><bool>false</bool></patelt> - </pattern> - </rejectfont> - </selectfont> + <description>Reject bitmap fonts except bitmap emoji fonts (deprecated; use 70-no-bitmaps-except-emoji.conf)</description> + <include ignore_missing="yes">70-no-bitmaps-except-emoji.conf</include> </fontconfig> diff --git a/conf.d/Makefile.am b/conf.d/Makefile.am index fd85834..737b4fb 100644 --- a/conf.d/Makefile.am +++ b/conf.d/Makefile.am @@ -98,6 +98,8 @@ template_DATA = \ 65-nonlatin.conf \ 69-unifont.conf \ 70-no-bitmaps.conf \ + 70-no-bitmaps-and-emoji.conf \ + 70-no-bitmaps-except-emoji.conf \ 70-yes-bitmaps.conf \ 80-delicious.conf \ 90-synthetic.conf diff --git a/conf.d/meson.build b/conf.d/meson.build index 8e89611..b6d07ee 100644 --- a/conf.d/meson.build +++ b/conf.d/meson.build @@ -36,6 +36,8 @@ conf_files = [ '65-nonlatin.conf', '69-unifont.conf', '70-no-bitmaps.conf', + '70-no-bitmaps-and-emoji.conf', + '70-no-bitmaps-except-emoji.conf', '70-yes-bitmaps.conf', '80-delicious.conf', '90-synthetic.conf',