关于 Font Metrics & 在 FontLab 5 中的相关设置

| | Comments (0)
关于 Font Metrics 的一些基础

UPM: Units per Em
UPM的意思是每个em由多少个单位(unit)组成。Em大概可以理解成一个字母的宽度,但它没有固定的大小,计算机处理字体时都先将Em变成一定的point(点),比如某个字体的大小是12pt(points),那么在这个例子中em就等于12pt。Em是字体最基本的单位,在不同的字体中不一样。Em不是字母"M"的宽度,但基本上等于一个 em dash (Unicode: 2014) 的宽度(但也不完全等于)。在一个字体中,一个字母(或标点符号)和这个字体的 em square (边长是一个em的正方形)的比例是固定不变,不管字体的大小是12pt或100pt。
UPM一般设为1000。在1995年左右,有建议将UPM设为2的正次方倍数,1024或2048是最理想的数值,即2的10或11次方。这是因为当时的计算机运算速度很慢,象1024这样的数值方便计算机运算,正如人类计算1000除以10很容易一样,1024除以2对于计算机而言一样容易。2048曾被认为是最理想的数值,因为可以包含足够多的细节也很容易计算。但随着计算机运算速度的提高,UPM一般都设为1000,当设计师想要更高的精确度或更多的细节时,可以将UPM设为2000,2048,甚至10000(FontLab的最大限制)。

在FontLab 5中设置字体的UPM值,见下图。
FontMetrics-UPM.png


设计字体的时候,第一步应当是确定字体的比例,即大写字母和小写字母的比例,这一步非常,非常,非常的重要。相应的,descender的比例也可以确定下来 (至于如何确定我可能大概也许在不久的将来会写个教程)。一个字体,尽管是不同样式(粗体,斜体等),font metrics 的设置应当是一样的,不然从常规体转到粗体的时候,用户发现字体大小竟然变了,这样的结果肯定不是我们想要的(当然这种可能性不应该排除)。

需要注意的是,descender的值都是是用负数表示的,因为它在基线(baseline)以下。

下图是一个比较不怎么典型的Font Metrics设置,在FontLab 5中。FontMetrics-KeyDimensions.png







关于上图的一点解释:
Set dimensions for the master,该选项只适用于有multiple master的字体,除非你的字体用有multiple master设置,可以无视。
Ascender,descender 等等就略过了,凡是看这篇文章能从头看到这里的人也应该知道。右边那个有图标的按钮是让FontLab自动计算左边的4个值,不建议用,经常是错的。
Copy values to TrueType metrics,是自动把上面的4个值添到TrueType信息里,见下一图。该选项适合懒人用。
Italic angle,意大利体的倾斜角度。Slant angle,斜体的倾斜角度。这两个选项适合给有一定倾斜角度的字体用,如果不是就无视。(意大利体和斜体的区别?什么‽你不知道‽) 这两个值一般是负数(没错,的确有向左倾斜的斜体)。
Underline,你的字体的下划线的中间的位置,因为是在基线一下,所以是用负数表示。(你的下划线在基线以上?)
Thickness,你的字体的下划线的厚度。
Font is monospaced,你的字体的所有字符都是一样宽度么? 如果是就钩上。
Font BBox,即Font Bounding Box,代表你的字体的上下限。该选项不是选项。



在FontLab 5中如何设置Font Metrics

终于步入正题了。见下图。请参照上图的数字的以便你确认下图的这些数字不是胡编乱造的。下图不是一个比较不典型的例子,不过这个不重要。我的系统是苹果的而且换了系统皮肤所以你在你的电脑上看到的有很大的可能性和下图不一样。

FontMetrics-Tables.png
关于上图的解释:
Font metrics,可以理解成字体的度量规格,是储存在字体里的一些数字,用来让程序知道该字体的ascender, descender, linegap (行距)等等是什么,以便程序能够正确地显示和处理字体,尤其是行距。当然,不同的系统和不同的程序处理字体的方式也不同。Windows一般用 OS/2 规格 (table),而苹果只用 hhea 规格。Font metrics 直接关系到你的字体在实际应用的时候是什么样子,所以非常,非常,非常的重要,就好比人的衣服一样。Font metrics 实际上比较复杂而且混乱,连微软自己的程序员都搞错了(他们的理解能力估计有问题)。
下面是 "基本的计算公式" 。

OS/2.TypoAscender + |OS/2.TypoDescender| + OS/2.TypoLineGap
= hhea.Ascender + |hhea.Descender| + hhea.LineGap
= OS/2.WinAscent + OS/2.WinDescent


注: "||" 表示绝对值。



关于 TypoAscender, TypoDescender, WinAscent 等等

根据Microsoft "最初" 的规定,Typo(即TypoAscender, TypoDescender, TypoLineGap)的值是 "应该" 和hhea的Ascender, Descender, LineGap一样的,用来计算一个字体默认的行距。
WinAscent, WinDescent 值表示字体的上下限,即一个字体的字符最高是多高,最低是多低,超过的这个限制的部分程序都会忽略(切掉)。这两个值并不代表字体 "真正" 的AscenderDescender。然而,基本上所有的Windows程序员,包括Microsft他们自己的,都认为WinAscent和WinDescent 就相当于字体 "真正" 的AscenderDescender。这个理解其实也不是不合理(对于程序员而言),因为WinAscent和WinDescent可以保证字体的任何部分都不会被"切掉",而TypoAscender, TypoDescender, TypoLineGap则无法保证。因此,很多情况下,苹果系统上显示的行距和Windows系统上的不一样,为了解决这个兼容性的问题有点麻烦。
"行距"在这里的意思是字体的默认行距,又叫做 baseline-to-baseline 的距离,即基线到基线的距离,也可以理解为行距。下面是苹果系统和Windows系统上计算行距的公式,不一定准确。
简单的来讲,在苹果系统上根据hhea规格,基线到基线的距离 = hhea.Ascender + |hhea.Descender| + LineGap。而在Windows系统上根据OS/2规格,基线到基线的距离 = OS/2.WinAscender + |OS/2.WinDescender|,(不过最近又有改动,改成用Typo值计算)。
为了在所有系统上都达到同样的效果(尤其是对于OpenType字体而言),即无论是在什么系统上都能满足上述的基本公式,要妥协一下。

根据我的经验,我的设置一般是:

UPM = TypoAscender + |TypoDescender|
TypoLineGap = hhea.LineGap = 0
hhea.Ascender = OS/2.WinAscender
hhea.Descender = OS/2.WinDescender

计算 WinAscent 和 WinDescent 这两个值。下面是适用于拉丁文语言字体的公式(对于中文,阿拉伯文等其他文字要用其他方法):
WinAscent = Ascender * 1.20
WinDescent = Descender * 1.20
WinAscent + |WinDescent| = UPM * 1.20

1.2 可以换成 1.25, 1.3 等等,根据不同语言作出调整。



相关资料
OS/2 Table from Microsoft

Leave a comment