确定哪些字体已被 fontconfig 列入黑名单?

确定哪些字体已被 fontconfig 列入黑名单?

有没有类似的相反的东西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 

假设你有你的配置中任何有趣的东西你应该看到结果。

相关内容