描述字体的大小我们常会用三种标准:
- 像素大小——pixel
- 物理大小——inch
- 绝对大小——pt(point 磅)
freetype2中除了显式标记为pixel的,其余size均是以pt为单位,且定义:在现实排版中(如打印时)72 pt = 1 inch
Points are a physical unit, where 1 point equals 1/72 of an inch in digital typography.
——FreeType Glyph Conventions | Glyph Outlines
因为pt是根据现实的物理长度单位inch定义的,所以想要按定义的物理长度呈现在屏幕显示器上,需要知道屏幕设备的dpi(dots per inch 每英寸多少像素点),这个可以通过屏幕的分辨率和实际长宽计算获取。(比如高7.62英寸1080p的屏幕高度上dpi就是141)
有了points per inch(72)1以及dpi(根据设备而定),可以计算出dots per points(dpp),即每个单位字体长度多少个像素,从而进行修正。如此在不同尺寸、不同分辨率的设备上,设置一样的字号可以获得同样物理大小的字体。(比如12磅的汉字在显示器上长宽均为1/6英寸)
反之,我们也可以不使用真实的dpi,而是预设一个期望的dpp(如设置dpi为72,此时dpp为1,在屏幕上1pt = 1px。12磅的字体占12*12的像素,而具体的物理长度未知)。
回到freetype2,font大小的设置接口为:
FT_Set_Char_Size( FT_Face face,
FT_F26Dot6 char_width,
FT_F26Dot6 char_height,
FT_UInt horz_resolution,
FT_UInt vert_resolution );
这里char_width、char_height设置字体大小,单位都是pt。后6位用来表示小数部分,所以传入的字号需要乘以64。如果一个参数为0,则另一个参数的值会被拷贝给它使用。
horz_resolution、vert_resolution是需要自定义的dpi,你可以传入根据设备参数算出的dpi,使得屏幕上字体大小可以和实际打印时一样。也可以传入其余数据,设置期望的dpp,让1pt 等于你想要的像素大小。两个参数缺省(=0)一个时和char_width、char_height一样会由另一个拷贝补充,两个都为0时,则会赋予默认值72,此时1pt = 1px。
这里的point per inch并不是字体设计常见的ppi(pixel per inch),后者往往和dpi等同混用 ↩︎