fontconfig 提供 “别名”(alias) 字体匹配机制,比如:
<alias>
<family>serif</family>
<prefer>
<family>Font 1</family>
<family>Font 2</family>
<family>Font 3</family>
<family>Font 4</family>
<family>Font 5</family>
</prefer>
</alias>
如果应用程序请求字体 serif, 那么 fontconfig 会根据 “prefer” 的顺序(如果是弱绑定,那么先匹配语言 lang )匹配字体。这样可以让显示效果更佳的字体排在前面,而当字体里字符不存在时,再到后面显示效果更次的字体里去寻找。
fontconfig 的这种字体匹配机制似乎并非对上级应用程序透明,或者说:需要上级程序参与到字体匹配之中。因为我发现基于 libXft 的程序好像只匹配一次字体。匹配成功后,如果存在 “缺字” 的情况,并不会自动到后面的字体列表里去寻找。而 Xft 又是基于 fontconfig 的,因此可以断定 fontconfig 的别名字体机制并非对上次应用透明。
我看了一下应用程序,是调用了 libXft 的这个函数:
XftFont* XftFontOpenName( Display *dpy, int screen, unsigned char *fontname )
如果对该函数的第三个参数 fontname 传入诸如 “serif:bold:size=16” 这类的字体 Pattern, 那么可以匹配到一个字体,却无法在 “缺字” 的情况下继续匹配后面的字体。
如果 Xft 本身支持 “缺字替换” 的功能,那么该调用哪个函数?如果不支持,那么该如何直接调用 fontconfig 的函数,让 “缺字替换” 功能得以实现?
我发现 GTK 程序完美支持 fontconfig 的 “缺字替换” 功能,当然 GTK 并不依赖 Xft. 我对字体领域知之甚少,看 libXft 的文档以及源代码已经一头雾水,对于更加庞杂的 fontconfig 和 GTK, 就更难掌握了。如果哪位高人知道该如何做,恳请提供一些思路。