GTK 中的路径

我们希望摆脱 cairo 作为 GTK 中的绘图 API,以便可以将更多的绘图转移到 GPU 上,这已不是什么秘密。

尽管人们已经找到了使用渲染节点绘制内容的创造性方法,但它们并没有提供像 Skia 或者,是的,cairo 那样的全面的绘图 API。这并不是一个令人满意的现状。

几年前,我们开始研究如何通过使路径作为 GTK 中的一等对象来改变这种情况。这项工作终于开始取得成果,您可以在 GTK 4.13.0 中看到初步结果。

路径

那么,什么是路径?一个粗略的定义可以是:

一系列线段或曲线,它们的端点可能连接也可能不连接。

当我们说曲线时,我们特指二次或三次贝塞尔曲线。在 cairo 之上,我们还支持有理二次贝塞尔曲线(或 Skia 称之为:圆锥曲线),因为它们可以让我们精确地建模圆形和圆角矩形。

这张图片显示了一条典型的路径,由 4 条曲线和 2 条线组成,其中一些是连接的。正如你所看到的,路径可以是闭合的(如这里的 4 条曲线)或开放的(如 2 条线),具有起点和终点。

路径对于绘图有什么用呢?首先,您可以使用路径来定义一个区域(路径内部的部分)并用颜色、渐变或更复杂的内容填充它。

或者,您可以用各种属性(如线宽、颜色或虚线图案)描边路径。

GTK 中的路径

我们在 GTK 中用于路径的对象是 GskPath。它是一个紧凑、不可变的表示形式,针对渲染进行了优化。要创建 GskPath,您需要使用 GskPathBuilder,它有许多便捷的方法来创建路径,可以从单独的曲线或预定义的形状创建。

此示例创建的路径是一个闭合的三角形

builder = gsk_path_builder_new ();
gsk_path_builder_move_to (builder, 0, 50);
gsk_path_builder_line_to (builder, 100, 50);
gsk_path_builder_line_to (builder, 50, 0);
gsk_path_builder_close (builder);
path = gsk_path_builder_free_to_path (builder);

而这个示例创建了一个具有给定中心和半径的圆形路径

builder = gsk_path_builder_new ();
gsk_path_builder_add_circle (builder, center, radius);
path = gsk_path_builder_free_to_path (builder);

展望

在下一篇文章中,我们将研究路径的属性以及如何查询它们。