路径 [src]
GSK 提供路径 API,可用于呈现比直线或圆角矩形更复杂的形状。它类似于 cairo 的 路径 API,但需要注意一些显著的差异。
一般而言,路径包含一个或多个连接的轮廓,每个轮廓可能具有多个操作,可能闭合或不闭合。操作可以是直线或各种类型的曲线。在操作连接的点,路径可能急转。
GSK 路径 API 的中心对象是不可变的 GskPath
结构,它包含紧凑形式的路径数据,适合呈现。
创建路径
由于 GskPath
是不可变的,因此可以使用辅助 GskPathBuilder
结构逐段构造路径。这些段由点指定,其中一些点将位于路径上,而另一些点只是用于影响结果路径形状的控制点。
GskPathBuilder
API 有三组不同的 函数
-
用于从各个操作构建轮廓的函数,如
gsk_path_builder_move_to()
、gsk_path_builder_line_to()
、gsk_path_builder_cubic_to()
、gsk_path_builder_close()
。GskPathBuilder
维护一个当前点,因此这些方法都比操作所需的点的数量少一个(例如,gsk_path_builder_line_to
只需要一个点,并从当前点绘制一条直线到新 点)。 -
用于添加完整轮廓的函数,例如
gsk_path_builder_add_rect()
、gsk_path_builder_add_rounded_rect()
、gsk_path_builder_add_circle()
。 -
添加预先存在的路径的部分。这组函数包括
gsk_path_builder_add_path()
和gsk_path_builder_add_segment()
。
完成路径构建后,可以使用 gsk_path_builder_free_to_path()
将累积的路径数据转换为 GskPath
结构。
有时,一个比较便捷的替换方法是使用 gsk_path_parse()
从序列化形式创建路径。此函数解释 SVG 路径语法中的字符串,例如
M 100 100 C 100 200 200 200 200 100 Z
使用路径呈现
主要有两种渲染路径的方法。第一种是用颜色或更复杂的填充物(如渐变)填充路径的内部。 GSK 支持确定路径内侧平面的各个不同方法,可以通过 GskFillRule
值选择这些方法。
要填充路径,请使用 gtk_snapshot_append_fill() 或更通用的 gtk_snapshot_push_fill()。
或者,一条路径可以描边,这意味着模拟用理想化钢笔沿着路径进行绘制。描边路径的结果是另一条路径(描边路径),它随后被 填充。
笔划操作可以通过GskStroke
结构来影响,它收集了各种笔划参数,如线宽、连接类型、端点样式和虚线图案。
要为一条路径描边,请使用 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 个不同的值)和曲率(可以有两个不同的值)就是这种情况的示例。
超越 GskPath
可以为路径实现很多强大的功能
- 查找交叉点
- 偏移曲线
- 将描边轮廓转换为路径
- 塑造曲线(使其穿过给定点)
GSK并未针对所有这些内容提供API,但它确实提供了一种获取底层贝塞尔曲lines的方式,这样你可以自己实现此类功能。你可以使用gsk_path_foreach()
来迭代路径的操作,并获取重建或修改路径各个部分所需的点。
例如,请参阅贝塞尔曲线入门以获取探索有用内容的灵感。