你知道字体可以做到这一切吗?

2020-09-15 00:29:53

Unix的字体堆栈中包含的Freetype是一种准复杂的字体。要让它做它做的事情有这么多层,所以很容易迷路。从查找字体,到实际呈现它,以及介于两者之间的所有事情。像世界上大多数人一样,我使用相当低的屏幕清晰度(1366x768,96 dpi)和相当老式的笔记本电脑,不像一些字体设计师生活在过滤气泡中,每个人都有最新的Macbook。因此,好的和易读的字体渲染是很重要的。让我们玩一些鲜为人知的触发器,看看它们会做些什么,让我们尽情玩乐,探索各种可能性。

通常,为了使字体在像素数组的屏幕上看起来更好,我们结合使用以下三种方法:

抗锯齿:在字形周围应用浅色阴影。它在小比例下很有用,当你没有足够的像素时,但它会让字形看起来更粗体。

亚像素渲染:一种类似于抗锯齿的技术,但使用的是亚像素,即像素内部的颜色分量。在边上涂抹少量的颜色可以达到更精细的效果。然而,如果应用笨拙,或者你只是移动包含文本的窗口,这些有色的亚像素就会变得明显,这就是我们所说的条纹。

提示:像素是块,但文本是由曲线组成的,这意味着这些曲线永远不会与屏幕像素完全匹配。提示是指重新定位或选择最近的像素,同时尽可能保持字形的形状不变。有多个级别的提示、由字体自身提供的提示信息(字节码解释器提示)和由渲染库提供的提示(自动提示)。

注:“这只是文本”…。本文是另一篇展示字体并不像看起来那么简单的文章。有关字体堆栈的更多信息,请访问我上一篇关于该主题的文章,如果您想了解在屏幕上绘制字体意味着什么,请看这篇文章。

应用什么,什么时候,如何控制所有这一切,我们能看到他们做了什么吗,我们甚至应该关心吗?

目前Freetype和Fontconfig的默认呈现效果相当不错,所以应该没什么好担心的,除非有什么需要担心的,比如字体看起来不是你想要的样子。我们的第一站将是一些让我感兴趣的东西,因为我没有太多地谈论它:Freetype驱动程序的属性。无论何时需要提示,都会使用Freetype驱动程序,所以这是它实际改变的部分--如何应用提示。

让我们从用容易测试这一切的方法来武装自己开始吧。Freetype2演示实用程序是必须的,你可以在这里克隆它们或者从你的软件包库中获取它们,例如Debian和ArchLInux。这些工具将为您提供一系列有用的工具,如ftdiff、ftview、ftstring、ftgrid、ftTimer、ftbench等。对我们来说最重要的是ftdiff和ftgrid。

Ftdiff-r 96-s 10~/.local/share/fonts/times.ttfftgrid-r 96-f 20 10~/.local/share/fonts/times.ttfftstring-r 96-m';Hello World!';10~/.local/share/fonts/times.ttf。

此外,您还可以从Pango-tools安装Pango-view,以便稍后测试fontconfig是否正确应用了您的配置。可以通过准备一个用pangomarkup编写的文件并使用pango-view--markup file.pangpang显示它来使用它。通过将FC_DEBUG设置为类似于4096,FC_DEBUG=4096,可以将fontconfig调试级别设置得更高,以查看实际加载的是哪种字体。

在此处可以找到更多值,我们稍后将使用它们来查看是否正确应用了我们的fontconfig设置:

名称值Meaning---MATCH 1有关字体匹配的简要信息MATCHV 2广泛的字体匹配信息EDIT 4监视匹配/测试/编辑执行FONTSET 8跟踪启动时字体信息的加载CACHE 16监视正在写入的缓存文件CACHEV 32广泛的缓存文件写入信息PARSE 64(不再使用)扫描128个正在扫描的监视字体文件以构建缓存SCANV 256详细字体。文件扫描信息MEMORY 512监视字体配置内存使用CONFIG 1024监视加载了哪些配置文件LANGSET 2048用于构造LANG值的转储字符集MATCH2 4096显示模式中的字体匹配转换。

因此,让我们回到对Freetype2驱动程序的测试。在此文档页面上,列出了ft(Freetype)属性,据说这些属性会影响司机的行为,每个司机都会接触不同的司机。它们是通过修改FREETYPE_PROPERTIES环境变量来设置的,该环境变量通常从/etc/profile.d/freetype2.sh加载。然而,列出的大多数字体都是针对CFF、Type1和CID字体驱动程序,而不是TrueType字体,所以如果您没有这些字体类型,它们就不会考虑。TrueType唯一可用的切换是解释器版本,它控制字节码解释器、光栅化器,从而控制大纲的提示方式。

我们从35跳到38有点奇怪,36和其他的去哪里了?答案是,从Freetype devs中选择只包括那些,而不包括介于两者之间的那些。

我们也可以使用Pango-view进行测试(再次记住,这应该是一个启用了本机提示但没有自动提示的字体):

<;span font_family=";Times New Roman";font=";10";forecround=";Black";alpha=";83%";>;Lorem ipsum door坐着amet,敬爱您的足部精华,sed do eiusmod tempor indidut labore et dolore Magna aliqua。从现在开始到现在为止,我的鼻腔练习是最好的,也是最好的结果。被人斥责的酒鬼,在巴黎的逃亡者中.class=‘class 5’>.class=‘class 3’>.。除了偶尔在没有证据的情况下,没有任何过错的情况下,我的官司不在实验室里,而是一间没有人照看的实验室里的一只猫,这是一间没有证据的,没有任何过错的法庭上的一件事。<;/span>;

因此,可以肯定的是,较早版本的解释器带有更粗糙的提示,更大胆,并且可能会使字形变形。有了它,新的就更小了。我们还注意到自动提示并没有那么糟糕,避免暗示可以有所帮助。我以Windows字体“Times NewRoman”为例,因为它在Freetype上的渲染效果很差,这主要是因为解释器所做的工作。使用非常轻或完全没有暗示的应用非常有帮助,即使是非常小的点大小,就像你在下一个比较中看到的那样。这个提示确实有助于这种规模的易读性,但字体形状和个性都被完全破坏了。

我们还没有完成提示,可以有很多级别的提示可以应用,但是让我们先绕个弯,了解一下fontconfig以及如何使用它。

Fontconfig是字体堆栈中负责加载字体的层,以及告诉下一层如何查找字体文件以及在呈现它时应用哪些更改的配置。它通常由库、配置文件预置和一系列有用的工具组成,这些工具都以前缀fc开头,例如:fc-cache、fc-query、fc-match和fc-flicist,仅举几例。

配置文件通常位于/etc/fonts/中,并分为可用的/etc/fonts/conf.avail预设值和/etc/fonts/conf.d中的选定预设值,它们是指向前者的符号链接。规则的优先级是字母数字的,这是一个先到先得的原则,因此01-Customer-rule.conf将在99-Not-Important-rule.conf之前加载。用户的$XDG_CONFIG_HOME/fontconfig目录中的本地用户配置是从其中一个包含INCLUDE语句的配置加载的。在我的机器上,它是50-user.conf,所以它的优先级比它之前加载的任何文件都要低。这在测试规则时并不实用,因此将此文件重命名为01-user.conf之类的名称。现在,您放在$XDG_CONFIG_HOME/fontconfig/conf.d或$XDG_CONFIG_HOME/fontconfig/fonts.conf中的任何内容都应该优先。您可以使用fc-flicist命令确保正确加载顺序和配置。它按优先顺序列出找到的配置,以+开头的配置被加载,以-开头的配置不加载。

匹配规则:如果有匹配,则编辑提到的属性。有大量的匹配和编辑规则,甚至包括当前试图加载字体和自定义字体的程序名称。您还可以在不同的时间进行匹配:查找模式/font时、找到字体后、扫描字体时。

别名创建:别名是字体名称的缩写,在查询通用家族名称(如“monSpace”)时非常有用。

包含其他配置:可以有太多的配置文件,因此拆分它们是很好的做法。

在哪里查找设置和字体,以及是否应该完全定制某些字体(例如,如果它们不是可缩放的位图):您可能认为字体的位置是一个常量值,但事实并非如此。例如,在我的机器上,它在/etc/fonts/fonts.conf中设置为:

<;!--字体目录列表-->;<;dir>;/usr/share/fonts<;/dir>;<;dir>;/usr/local/share/fonts<;/dir>;<;dir prefix=";xdg&34;>;fonts<;/dir>;<;!

编辑XML文件很麻烦,不幸的是,今天没有太多的GUI或更简单的工具来设置这些。到目前为止,我只找到一个名为FontWare的,但还不完整的。这很遗憾,因为很少有人知道如何正确设置字体配置。

如果您需要更多信息,可以咨询man5fonts-conf。它的内容很重,可能会令人困惑,但仍然是很棒的内容。

注:Fontconfig不足以配置每个图形程序,有些程序通过X的resource_manager来加载字体设置的方式更简单。

让我们结束这个括号,回到暗示上来。Fontconfig有4个与之相关的设置,其中一个是匹配标准,另外三个是编辑规则。它们如下所示。

提示:如果设置为true,则通知下一阶段(光栅化程序)一般将应用提示。

自动提示:使用自动提示而不是普通提示。这将完全跳过字节码解释器。

Hintstyle:将应用的暗示的严厉程度。它可以是hintone、hintlight、hintMedium或hintfull。需要指出的是,如果字体有提示,它们将混合使用自动提示和字节码解释程序。例如,hintlight将仅在垂直网格上捕捉,但hintmediate和hintfull也会在水平网格上捕捉更多。

实际上,这意味着什么呢?让我们结合这些提示配置来展示字体的外观。请记住,如果在用户字体配置文件中应用这些配置有问题,可以设置我们前面提到的FC_DEBUG环境变量。始终通过FC-Match--Verbose YourFontSearchHere检查FC-CONFLIST和当前应用的匹配规则,以确保一切正常加载。

不是很漂亮,也许只是垂直抓拍更好,让我们试试-autohinter和一个小小的暗示。

好多了,但看起来还是太大胆了。让我们再试一次自动打印机,但现在要用更柔和的暗示。

它看起来与完整的提示非常相似,让我们测试一下,完全不提示。

看起来自动打印机在以一种微妙的方式垂直对齐字母方面做得很好。当放大时,你可以清楚地看到在打开自动提示器的情况下,这些提示器看起来是如何被压缩的。

总体而言,对于我测试的特定字体,“Times New Roman”、完全没有提示或轻微的自动提示在我的显示器上是最好的。

让我们转到亚像素渲染。Fontconfig提供了一些预置来表示亚像素渲染的严酷程度。LCdDefault是色彩平衡和规格化的,LCdLegend既不是规格化的也不是色彩平衡的,它使用它能找到的任何子像素,LCdlight类似于LCdDefault,但是将较浅的色调应用于周围像素,而LCdone则禁用它。此外,还有一些方法可以通过重新编译Freetype来启用Microsoft的ClearType子像素渲染(由于专利的原因,默认情况下是禁用的),还有一些方法可以通过手动编辑Freetype代码来调整子像素渲染矩阵。但为什么要费这么大劲呢。

在测试这些之前,您应该通过查看此页面找出屏幕的亚像素几何图形,并将其设置为RGBA属性。通常,预置文件(如10-sub-Pixel-rgb.conf)已经安装,因此您只需将它们符号链接到/etc/fonts/conf.d目录。

注:这些测试似乎没有显示与Pango-view的不同之处,但启动任何其他图形程序应该就足够了。注:黑底白字时,条纹更明显。

这是比较的结果,当选择了错误的亚像素几何图形时,您可以清楚地看到条纹,这里我的屏幕有rgb几何图形。此外,对于位图字体而言,无子像素渲染似乎是一个非常好的选择,请记住这一点。

我试着注意到lcddefault、lcdlight和lcdlegage之间的区别,但它太小了,不值得一提。因此,在大多数情况下,lcddefault应该没有问题。

注:这很少见,但如果字体在屏幕上看起来变形了,可能是因为字体配置没有正确检测到您的DPI。通过执行xdpyinfo|grep-B2分辨率在X11上找到它,并使用以下匹配进行设置:

抗锯齿是您几乎永远不应该关闭的设置,除非您的字体是位图/不可缩放的。这张图清楚地显示了在可缩放字体上使用抗锯齿的优势。右侧是非抗锯齿版本。

当存在10比例尺的位图字体.conf预设时,会出现奇怪的情况。下图显示了没有提示的位图字体和带有它们的左侧和右侧的抗锯齿。删除此文件将修复字体并使其尽可能清晰。

注:如果您想要将位图/PCF/BdF字体转换为Pango支持的字体,请参阅nixers.netForum上的此帖子。

众所周知,有些字体在使用Freetype时呈现效果很差,例如WindowsFonts。所以,让我们测试一下我们学到了什么,让它们看起来更好看。

您可以从Windows机器上获得Windows字体的副本,它们位于C:\WINDOWS\Fonts\*目录中(PS:出于法律原因,如果您这样做,我不承担任何责任)。现在您应该有了字体,将它们放入$XDG_DATA_HOME/Fonts(通常是$HOME/.local/share/fonts)或$XDG_DATA_DIRS/Fonts(通常是/usr/share/fonts)中。确保遵循了前面重命名50-user.confto 01-user.conf的建议,并通过执行fc-flicist确认您的本地字体配置是第一个。

<;?xml version=";1.0&34;?>;<;!DOCTYPE Fontconfig System";fonts.dtd&34;>;<;fontconfig>;<;description>;使Windows字体看起来不错<;/description>;<;Match target=";font";>;<;edit name=&&。<;eq>;<;name>;family<;/name>;<;string>;Arial<;/string>;<;/eq>;<;name>;family<;/name>;Arial Black<;/string>;<;/ee名称>;家族<;/名称>;<;String>;Calibri<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;<;string>;/string>;<;/eq>;<;eq>;<;name>;family<;/name&<;/eq>;<;Eq>;<;name>;family<;/name>;<;string>;Cambria Math<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;Comic Sans MS<;/string>;<;/名称>;家族<;/名称>;<;String>;Consolas<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;<;string>;georia<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;<;/eq>;<;eq>;<;name>;family<;/name>;<;string>;爪哇语文本<;/string>;<;/eq>;<;name>;family<;/name>;<;string>;segoe print<;/string>;<;/eq>;<;/name>;<;字符串>;Segoe脚本<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;<;string>;segoe UI<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;&<;/eq>;<;eq>;<;name>;family<;/name>;<;string>;segoe UI History<;/string>;<;<;eq>;<;name>;family<;/name>;<;string>;segoe UI Black<;/string>;<;/eq>;系列<;/名称>;<;字符串>;Segoe UI Light<;/string&>;<;/eq&>;<;eq&>;<;name>;family<;/name>;<;string>;segoe UI Semibold<;/string>;<;/eq>;<;eq&>;<;name>;family<;/name&/string>;<;/eq>;<;Eq>;<;name>;family<;/name>;<;string>;segoe UI Symbol<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;tahoma<;/string>;<;/eq名称>;家族<;/名称>;<;String>;Times New Roman<;/string>;<;/eq>;<;eq>;<;name>;family<;/name>;<;string>;Trebuchet MS<;/string>;<;/eq>;<;eq>;<;name>;family<;/name/string>;<;/eq>;<;Eq>;<;name>;family<;/name>;<;/string>;Webdings<;/string>;<;/eq>;<;name>;family<;/name>;<;string>;Wingdings<;/string>;<;/eq>;/eq>;/name>;family<;/string>;<;/eq<;name>;family<;/string>;<;/eq>;/eq>;<;/匹配>;<;匹配目标=";font";>;<;测试名称=";iswindowsfont";比较=";eq";>;bool>;true<;/bool>;<;/test>;<;编辑模式=";分配";名称=";提示&34;>;<;/编辑>;<;编辑名称=";autohint&34;mode=";分配";>;<;bool&>;false<;/bool&>;<;/edit>;<;编辑模式=";分配";名称=";hintstyle";>;<;const>;hintone<;/const<;名称=";Antialias";>;<;bool&>;true<;/bool&>;<;/edit>;<;/edit>;<;edit name=";embeddedbitmap";mode=";assign";>;<;bool&>;false<;/bool&>;<;/edit>;<;/match>;

这可能看起来像是一个大剧本,这可能是你第一次