路径 [src]

GSK 提供路径 API,可用于呈现比直线或圆角矩形更复杂的形状。它类似于 cairo 的 路径 API,但需要注意一些显著的差异。

一般而言,路径包含一个或多个连接的轮廓,每个轮廓可能具有多个操作,可能闭合或不闭合。操作可以是直线或各种类型的曲线。在操作连接的点,路径可能急转。

A path with multiple contours
包含一个闭合轮廓和一个开放轮廓的路径

GSK 路径 API 的中心对象是不可变的 GskPath 结构,它包含紧凑形式的路径数据,适合呈现。

创建路径

由于 GskPath 是不可变的,因此可以使用辅助 GskPathBuilder 结构逐段构造路径。这些段由点指定,其中一些点将位于路径上,而另一些点只是用于影响结果路径形状的控制点

An cubic Bézier
立方贝塞尔操作,带 2 个控制点

GskPathBuilder API 有三组不同的 函数

完成路径构建后,可以使用 gsk_path_builder_free_to_path() 将累积的路径数据转换为 GskPath 结构。

有时,一个比较便捷的替换方法是使用 gsk_path_parse() 从序列化形式创建路径。此函数解释 SVG 路径语法中的字符串,例如

M 100 100 C 100 200 200 200 200 100 Z

使用路径呈现

主要有两种渲染路径的方法。第一种是用颜色或更复杂的填充物(如渐变)填充路径的内部。 GSK 支持确定路径内侧平面的各个不同方法,可以通过 GskFillRule 值选择这些方法。

A filled path
用 GSK_FILL_RULE_WINDING 填充的路径
A filled path
用 GSK_FILL_RULE_EVEN_ODD 填充的相同路径

要填充路径,请使用 gtk_snapshot_append_fill() 或更通用的 gtk_snapshot_push_fill()

或者,一条路径可以描边,这意味着模拟用理想化钢笔沿着路径进行绘制。描边路径的结果是另一条路径(描边路径),它随后被 填充。

笔划操作可以通过GskStroke结构来影响,它收集了各种笔划参数,如线宽、连接类型、端点样式和虚线图案。

A stroked path
同一条路径,用 GSK_LINE_JOIN_MITER 描边
A stroked path
同一条路径,用 GSK_LINE_JOIN_ROUND 描边

要为一条路径描边,请使用 gtk_snapshot_append_stroke()gtk_snapshot_push_stroke()

命中测试

当将路径作为交互式界面的组成部分进行渲染时,有时需要确定鼠标指针是否在路径上。GSK提供了gsk_path_in_fill()用于此目的。

路径长度

路径的一个重要属性是其长度。有效地计算它需要缓存,因此GSK提供了一个单独的GskPathMeasure对象来处理路径长度。为某个路径构造了`GskPathMeasure`对象后,可以使用该对象通过gsk_path_measure_get_length()来确定路径的长度,并可以使用gsk_path_measure_get_point()来找到路径中给定距离处的点。

其他路径 API

路径除了渲染之外还有其他用途,例如作为动画中的轨迹。在这种用途下,经常需要访问路径的属性,例如其在特定点处的切线。GSK通过GskPathPoint结构以抽象形式表示路径上的点。一旦你有了表示某个点的`GskPathPoint`,就可以在特定点查询路径的属性。

可以使用gsk_path_point_equal()比较GskPathPoint结构的相等性,并可以使用gsk_path_point_compare()按哪个先来排序。

要获取GskPathPoint,请使用gsk_path_get_closest_point()gsk_path_get_start_point()gsk_path_get_end_point()gsk_path_measure_get_point()

要查询某个点的路径属性,请使用gsk_path_point_get_position()gsk_path_point_get_tangent()gsk_path_point_get_rotation()gsk_path_point_get_curvature()gsk_path_point_get_distance()

某些属性对于进入点的路径和离开点的路径具有不同的值,通常在路径急转弯的点处。切线(最多可以有 4 个不同的值)和曲率(可以有两个不同的值)就是这种情况的示例。

Path Tangents
路径切线

超越 GskPath

可以为路径实现很多强大的功能

  • 查找交叉点
  • 偏移曲线
  • 将描边轮廓转换为路径
  • 塑造曲线(使其穿过给定点)

GSK并未针对所有这些内容提供API,但它确实提供了一种获取底层贝塞尔曲lines的方式,这样你可以自己实现此类功能。你可以使用gsk_path_foreach()来迭代路径的操作,并获取重建或修改路径各个部分所需的点。

例如,请参阅贝塞尔曲线入门以获取探索有用内容的灵感。