我正在尝试使用 Xlib 来更深入地了解 Linux GUI 程序的工作原理。我编写了一个在窗口中显示“Hello, world”的简单程序,但它看起来相当不合时宜,因为文本没有抗锯齿。
在 X11 中显示抗锯齿文本的最佳方式是什么?GTK、Qt 和其他工具包中如何实现抗锯齿?
我正在尝试使用 Xlib 来更深入地了解 Linux GUI 程序的工作原理。我编写了一个在窗口中显示“Hello, world”的简单程序,但它看起来相当不合时宜,因为文本没有抗锯齿。
在 X11 中显示抗锯齿文本的最佳方式是什么?GTK、Qt 和其他工具包中如何实现抗锯齿?
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,以及这个更长更全面的文档:文本渲染状态。
自由类型。GTK+ 使用 Pango,Qt 有自己的文本布局库,但最终都使用 FreeType,并且一些应用程序(例如启用了抗锯齿字体的 XTerm)通过 Xorg 附带的较低级别的 libXft 库使用 FreeType。