我们希望摆脱 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);
展望
在下一篇文章中,我们将研究路径的属性以及如何查询它们。