如何确定PostScript字体的高度和深度?

5

我正在寻找一些PostScript代码,用于估算PostScript字体的高度(升高线空间)和深度(降低线空间)。可以使用字体的边界框(FontBBox)来实现这个目标吗?

以下是我的问题背景:字体的字形坐落在基线上。显然,具有下降线的字形将会延伸到基线以下,我想知道下降线能够延伸多远以便在布局中提供足够的空间。

我已经看到了用于渲染给定字符串并检查其尺寸的PostScript代码,但我更感兴趣的是针对给定字体的通用答案。

2个回答

8
好的,您已经发现了两个“快捷方式”。FontBBox给出了字体中所有字形的边界框。false charpath flattenpath pathbbox为指定字符串提供框。
对于Type 3(用户定义)字体,这是您可以合理地期望做到的全部;但对于更流行的Type 1字体,有丰富的度量信息,既在字体中,也在“度量”文件中(适用于其他应用程序)。
但这是我不太了解的部分。因此,我将阅读Adobe Type 1手册并稍后扩展此答案。
实际上,看起来这些可能是一般情况下最好的方法。
Type 1字体中存在一个垂直对齐值数组,在/ Private字典下,名称为/ BlueValues;但不能保证字体会遵守它们。数组中的第一个数字是基线超出量;这是像'O'这样向下倾斜到基线以下的字母的底部边缘。数组中最大的值将是ascender-height overshoot或cap-height overshoot(以较高者为准)。但是,任何单个字符都可以绘制而不考虑这些值(因此没有保证)。
另一方面,FontBBox本身可能反映字体中存在的任何“特殊”字符的边界框,无论它们是否可通过编码向量访问(即,您无法显示它们,但必须glyphshow它们)。
因此,最好的选择可能是获取您打算使用的所有字符的字符串的pathbbox。这将忽略任何其他存在但与您的目的无关的字符的贡献。并且不要忘记flattenpath以从曲线中删除控制点(这些点可能远在“真实”边界框之外)。

5

luser droog的回答看起来相当完整,毫无疑问比我的更加健壮,但我不满意它是确定标准字体可用垂直空间并允许我创建可行的newline的最简单方法。这是我想出的:

%!ps-nonconforming
/inch {72 mul} bind def
/Helvetica 10 selectfont
1 inch 10 inch moveto
/fontheight currentfont dup /FontBBox get dup 3 get % top
 exch 1 get sub % top - bottom
 exch /FontMatrix get 3 get mul def % adjusted by height multiplier
/lineheight fontheight 1.2 mul def % add 20% for line spacing
/newline {0 lineheight neg rmoveto} bind def % negate height to move downwards
gsave (lineheight: ) show lineheight 20 string cvs show grestore
newline gsave (that worked!) show grestore
showpage

使用gs test.ps运行的结果如下图所示:

ghostscript渲染test.ps


一天后重新审视,发现OP想要分别处理升高部和降低部。下面是仅使用降低部分的演示图片:

%!ps-nonconforming
/inch {72 mul} bind def
/Helvetica 30 selectfont
1 inch 2 inch moveto
/descender currentfont dup /FontBBox get 1 get % bottom (negative number!)
 exch /FontMatrix get 3 get mul def % adjusted by height multiplier
% first draw a gray line at base of text
gsave 7.5 inch 0 rlineto 0.5 setgray stroke grestore
gsave (descender: ) show descender 20 string cvs show ( pixels) show grestore
gsave 0 descender 1 sub rmoveto  % one pixel below lowest descender
7.5 inch 0 rlineto 0 setgray stroke grestore
showpage

以下是gs -sDEVICE=pnggray -g640x480 -o/tmp/descender.png descender.ps的结果: 最低下降线下的线


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接