fontconfig 实际上是如何工作的?

fontconfig 实际上是如何工作的?

我刚接触Linux环境,开始研究字体。

我读过 fontconfig 是实际处理 Linux 中字体管理的库。因此,为此我下载了 fontconfig 源代码并对其进行了编译,可以使用了。

当我进入主源目录时,我看到了许多子模块,如fc-cache、等fc-listfc-query我尝试搜索它们,但找不到它们实际工作原理的任何详细信息。所以我决定自己了解源代码,但我面临很多麻烦,因为我不知道实际的起点是什么,就像当我们在终端上编写命令时,如下所示,实际发生了什么。

$ fc-query /usr/share/fonts/truetype/fonts-japanese-gothic.ttf

假设我想修改一个 fontconfig 文件,例如Fcquery.c,使其调用驻留在其他共享库中的其他函数。我需要做什么?只是编译工作,还是我必须在 Makefile 中注册一些东西。

我是新人所以请详细说明。

答案1

长话短说:了解 fontconfig 需要了解它为何创建以及它试图解决什么问题。这需要对 Xorg 有很多了解。

UNIX 机器上的字体配置经历了不同的阶段字体配置只是通过 Xorg 使用字体的可能性之一。如果对 Xorg 的源代码没有很好的理解,阅读 fontconfig 的源代码可能非常困难。但是,我相信理解字体演变背后的概念可能是一个不错的起点。

免责声明:我在 Linux 上处理了很多字体问题,但我从来没有真正需要更改与字体相关的 Xorg 代码。

Arch Linux wiki 也有很多这方面的信息

一点历史

最初的 UNIX 字体只是位图字体。今天这些可以在 中找到/usr/share/fonts/misc,PCF(可移植编译格式)现在几乎用于所有这些。它是一种二进制格式。还有其他格式的二进制字体,但我需要承认我从来不需要使用除 PCF 之外的任何其他格式作为二进制字体。使用xfontsel您可以配置 Xorg 字符串来定义字体的点、间距、像素大小、终端粗细(粗体、倾斜)、编码等。

对于不同像素大小的字体,位图字体具有不同的文件。位图字体已经引入了字体系列的概念。

Postscript(以及某种程度上的 TeX)创建了 Type 1 字体,它是基于矢量的字体。这些都在/usr/share/fonts/Type1.矢量字体配置有多个配置值,例如抗锯齿、粗体、dpi 或大小(这次不一定是基于点的)。

基于矢量的字体是可缩放的并且不需要多个文件。

Xorg 使用位图和 Type1 字体。它创建了 XFT(X FreeType 是 FreeType 的接口,FreeType 是一个模仿和扩展 Type1 的 GPL/BSD 库)。 XFT 不仅允许使用 Type1 和 FreeType 字体,还允许使用其他格式:Adobe 和 Microsoft 的 OTF、Apple 的 TTF。此外,XFT 允许将旧位图字体缩放为看起来像 Type1 字体。

其他几个属性,例如暗示或者提示风格,被添加来定义这些字体的属性。

所有这些都可以在 的子文件夹中找到/usr/share/fonts。并且 XFT 参数可以在您的Xresources.

字体配置

fontconfig 需要处理上述所有差异。换句话说,fontconfig 试图以一种可以利用不同字体具有的通用语法的属性的方式配置上述所有字体类型。

位图字体有其问题:

  • 单个字体的多个不同文件
  • 尺寸受点和像素尺寸限制。

但基于矢量的字体也是如此:

  • 缩放需要时间,尤其是使用多个参数时
  • 并非所有字体属性都以相同的方式影响不同的字体类型

两者都存在字体格式繁多,用户可能希望在家中安装自己的字体的问题。 Fontconfig 试图解决这些问题。

fc-query告诉您 fontconfig 对字体文件的理解。值得注意的是文件的属性是什么(例如位图字体)以及可以使用哪些属性(矢量字体)。

fc-list是一种告诉您可以在 fontconfig 正在查看的目录中找到哪些字体的方式,因此可以由应用程序使用。最后对fc-cache这些字体执行索引,以便更轻松地找到它们并缩放它们(除其他外)以供应用程序使用。

另一方面,fontconfig 共享库是最有趣的部分。它使用配置文件 ( /etc/fonts~/.config/fontconfig) 和字体缓存将预先准备好的字体直接提供给与其链接的应用程序。由于大多数应用程序使用 XFT(因此使用 FreeType),并且 FreeType 库使用来自 fontconfig 库的调用,因此这些字体的使用变得无处不在。

但请注意,您可以编译一个程序,该程序将向 Xorg 询问旧样式的位图字体(例如-*-terminus-medium-r-normal-*-*-200-*-*-c-*-*-u),并且该调用不会通过 fontconfig 共享库。

相关内容