【发布时间】:2009-12-11 00:39:11
【问题描述】:
我正在试验 Xlib,以更深入地了解 Linux GUI 程序的工作原理。我编写了一个在窗口中显示“Hello, world”的简单程序,但它看起来相当不合时宜,因为文本没有抗锯齿。
在 X11 中显示抗锯齿文本的最佳方式是什么? GTK、Qt 和其他工具包中的抗锯齿是如何实现的?
【问题讨论】:
标签: linux x11 antialiasing xlib
我正在试验 Xlib,以更深入地了解 Linux GUI 程序的工作原理。我编写了一个在窗口中显示“Hello, world”的简单程序,但它看起来相当不合时宜,因为文本没有抗锯齿。
在 X11 中显示抗锯齿文本的最佳方式是什么? GTK、Qt 和其他工具包中的抗锯齿是如何实现的?
【问题讨论】:
标签: linux x11 antialiasing xlib
X 协议的文本渲染工具不支持抗锯齿功能,并且目前使用不多。 (我认为原因是 X 字体协议没有任何 alpha 通道的位置。)
GTK 和 Qt 使用 FreeType 库在客户端渲染文本,得到一个带有 alpha 通道的像素图作为结果。如果 X 服务器支持 RENDER 扩展,客户端可以将该像素图发送到服务器,以使用其 alpha 通道将其混合到显示器上。如果 X 服务器不支持 RENDER,客户端必须检索要显示文本的屏幕区域(基本上是截取小屏幕截图),在客户端进行 alpha 混合,并发送生成的不透明像素图返回要显示的 X 服务器。
【讨论】:
FreeType 位于堆栈的错误级别。它只允许您在某些地方绘制字形。通常,您至少需要一个字体选择机制(由Fontconfig 提供)和一个整形引擎(由Pango 或Qt 提供)。
Pango 和 Qt 都使用了一个废弃的 FreeType 布局引擎的分叉版本,但它正在被整合到 HarfBuzz 项目中。
另请参阅 Behdad Esfahbod 的这篇博文:Pango vs HarfBuzz,以及这篇更长、更全面的文档:State of Text Rendering。
【讨论】:
FreeType。 GTK+ 使用 Pango,Qt 有自己的文本布局库,但最终都使用了 FreeType,并且一些应用程序(例如启用了抗锯齿字体的 XTerm)通过 Xorg 附带的较低级别的 libXft 库使用 FreeType。
【讨论】: