fontconfig 是如何工作的?

Amm*_*san 9 linux fonts fontconfig

我是Linux环境的新手,已经开始研究字体。

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

当我走进主源代码目录,我看到很多子模块,如fc-cachefc-listfc-query等我试图寻找关于他们也没有找到他们实际上是如何工作的任何细节。所以我决定自己了解源代码,但我面临着很多麻烦,因为我不知道实际的起点是什么,比如当我们在终端上写命令时,实际发生了什么。

$ fc-query /usr/share/fonts/truetype/fonts-japanese-gothic.ttf
Run Code Online (Sandbox Code Playgroud)

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

我是新手,请详细说明。

gro*_*mal 18

TL;DR:理解 fontconfig 需要理解它为什么被创建以及它试图解决什么问题。这需要对 Xorg 有很多了解。

UNIX 机器上的字体配置经历了不同的阶段,fontconfig只是您可以用来通过 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 字体。

添加了其他几个属性,如hintinghintstyle,以定义这些字体的属性。

所有这些都可以在/usr/share/fonts. 并且 XFT 参数可以在您的Xresources.

字体配置

并且fontconfig 需要处理以上所有的不符点。换句话说, fontconfig 尝试以一种可以利用不同字体具有的共同语法的属性的方式配置上述所有字体类型。

位图字体有它们的问题:

  • 单个字体的几个不同文件
  • 通过点和像素大小限制大小。

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

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

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

fc-query告诉您 fontconfig 对字体文件的理解。特别是文件的属性(例如位图字体)以及可以使用的属性(矢量字体)。

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

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

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