字体渲染实际上如何工作?


11

我意识到,我对计算机中字体的呈现方式基本上一无所知。

据我观察,字体渲染通常是在整个系统中以一致的方式进行的。例如,我在DE控制面板中配置的亚像素字体提示设置会影响出现在窗口边框,浏览器,文本编辑器等中的文本。(我应该观察到某些Java应用程序显示出明显的差异,因此我猜它们正在使用不同的字体呈现机制)。

从上面我得到的是,可能所有需要字体渲染的应用程序都使用某些OS(或DE)范围的库。

另一方面,浏览器通常通过渲染引擎管理自己的渲染,该渲染引擎负责根据特定的流规则定位各种项目(包括文本)。

我不确定这两个事实如何兼容。我认为浏览器将不得不要求操作系统在给定位置绘制字形,但是如何在不事先知道字形需要多少空间的情况下如何管理文本流?是否有单独的调用来确定字形大小,以便浏览器可以像对待字符一样是小盒子然后由OS填充一样来管理流程?(尽管这并不涉及字距调整)。还是操作系统负责绘制整个文本区域,包括文本流?操作系统是否将渲染的字形作为位图返回并将其留给应用程序以在屏幕上绘制?


1
简短的回答是“是”。
Graham Borland

@GrahamBorland ...:-/我描述的三种选择中的哪一种是“是”?
Andrea

所有这些都取决于情况。我将尝试给出一个正确的答案。
Graham Borland

Answers:


9

通常,应用程序使用操作系统或GUI工具包提供的库来进行字体渲染是正确的。

典型的字体引擎允许多种操作模式。对于简单的情况,应用程序可以要求在特定位置绘制一串文本,引擎会处理所有事情(测量,定位,将像素绘制到显示器等)。

对于需要更好控制程度的应用程序(例如,浏览器或文字处理器),引擎将公开接口,应用程序可以在其中请求预先测量给定的文本。然后,应用程序可以使用此知识来计算出一行中可以容纳多少文本,换行符应该在哪里,段落将占用多少空间等。该应用程序仍可以要求引擎进行实际渲染像素。

(在中间情况下,引擎可以采用最大宽度参数,并可能采用某些字距调整/填充参数,并自动呈现尽可能多的文本。)

最后,字体引擎可能会通过返回以一定大小预先渲染的字形的位图,使应用程序接管文本的最终呈现,从而允许应用程序将其定位并合成到最终显示中。否则,引擎甚至可能会提供返回原始字形轮廓数据的功能,以使用某些矢量工具包进行渲染。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.