![确定哪些字体已被 fontconfig 列入黑名单?](https://linux22.com/image/94696/%E7%A1%AE%E5%AE%9A%E5%93%AA%E4%BA%9B%E5%AD%97%E4%BD%93%E5%B7%B2%E8%A2%AB%20fontconfig%20%E5%88%97%E5%85%A5%E9%BB%91%E5%90%8D%E5%8D%95%EF%BC%9F.png)
有没有类似的相反的东西fc-list
,它将列出被 fontconfig 明确列入黑名单/拒绝的字体文件?
答案1
fontconfig
具有可以通过环境变量启用的调试跟踪。这可能比您想要的要低(没有好的报告),但信息就在那里。
该功能描述于调试应用程序,在用户手册中:
为了帮助诊断字体和应用程序问题,fontconfig 是在启用大量内部调试的情况下构建的。它是通过以下方式控制的
FC_DEBUG
环境变量。此变量的值被解释为一个数字,该值中的每一位控制不同的调试消息。
进一步阅读:
答案2
不,我认为除非有东西重新实现 fontconfig 的整个解析逻辑,否则不会有。当您将字体列入黑名单时,应用程序(包括fc-list
)根本看不到它们。
如果你检查来源,没有日志记录,没有(额外的)调试,也没有钩子。
也就是说,这是 fontconfig 的一个简单补丁,用于记录匹配和拒绝:
--- src/fccfg.c.orig 2018-10-04 18:55:53.000000000 +0100
+++ src/fccfg.c 2018-10-04 19:15:46.000000000 +0100
@@ -2349,9 +2349,16 @@
{
int i;
- for (i = 0; i < patterns->nfont; i++)
- if (FcListPatternMatchAny (patterns->fonts[i], font))
- return FcTrue;
+ printf("!check for <%s>:\n",
+ FcPatternFormat((FcPattern *)font,(FcChar8 *)"%{file}"));
+ for (i = 0; i < patterns->nfont; i++) {
+ FcPatternPrint(patterns->fonts[i]);
+ if (FcListPatternMatchAny (patterns->fonts[i], font)) {
+ printf("!pattern match %i of %i\n",i,patterns->nfont);
+ return FcTrue;
+ }
+ }
+ if (patterns->nfont) printf("!pattern does not match\n");
return FcFalse;
}
@@ -2359,10 +2366,19 @@
FcConfigAcceptFont (FcConfig *config,
const FcPattern *font)
{
- if (FcConfigPatternsMatch (config->acceptPatterns, font))
- return FcTrue;
- if (FcConfigPatternsMatch (config->rejectPatterns, font))
- return FcFalse;
+ if (FcConfigPatternsMatch (config->acceptPatterns, font)) {
+ printf("!accepting file by pattern: ");
+ printf("%s\n",FcPatternFormat((FcPattern *)font,(FcChar8 *)"%{file}"));
+ return FcTrue;
+ }
+ if (FcConfigPatternsMatch (config->rejectPatterns, font)) {
+ printf("!rejecting file by pattern: ");
+ printf("%s\n",FcPatternFormat((FcPattern *)font,(FcChar8 *)"%{file}"));
+ return FcFalse;
+ }
+ printf("!default accept: %s\n",
+ FcPatternFormat((FcPattern *)font,(FcChar8 *)"%{file}"));
+
return FcTrue;
}
上面的内容完全适用于 fontconfig-2.11.95,这是我手头的最新源代码。FC_DEBUG
打印到 stderr,上面的内容打印到 stdout 以避免交错输出问题(FcPatternPrint()
打印到 stdout)。
该代码位于 中libfontconfig.so
,您可以使用以下内容测试结果:
LD_PRELOAD=src/.libs/libfontconfig.so.1.9.1 fc-list
假设你有你的配置中任何有趣的东西你应该看到结果。