diff --git a/docs/reference/gsk/gsk4-sections.txt b/docs/reference/gsk/gsk4-sections.txt index 81a55afbbc..b0f1f0cc8b 100644 --- a/docs/reference/gsk/gsk4-sections.txt +++ b/docs/reference/gsk/gsk4-sections.txt @@ -347,13 +347,18 @@ gsk_path_builder_unref gsk_path_builder_to_path gsk_path_builder_free_to_path +gsk_path_builder_get_current_point + gsk_path_builder_add_rect gsk_path_builder_add_circle gsk_path_builder_add_path gsk_path_builder_move_to +gsk_path_builder_rel_move_to gsk_path_builder_line_to +gsk_path_builder_rel_line_to gsk_path_builder_curve_to +gsk_path_builder_rel_curve_to gsk_path_builder_close GSK_TYPE_PATH_BUILDER diff --git a/gsk/gskpathbuilder.c b/gsk/gskpathbuilder.c index 90672bd1f9..fdae634a79 100644 --- a/gsk/gskpathbuilder.c +++ b/gsk/gskpathbuilder.c @@ -281,6 +281,25 @@ gsk_path_builder_add_contour (GskPathBuilder *builder, builder->contours = g_slist_prepend (builder->contours, contour); } +/** + * gsk_path_builder_get_current_point: + * @builder: a #GskPathBuilder + * + * Gets the current point. The current point is used for relative + * drawing commands and updated after every operation. + * + * When @builder is created, the default current point is set to (0, 0). + * + * Returns: (transfer none) The current point + **/ +const graphene_point_t * +gsk_path_builder_get_current_point (GskPathBuilder *builder) +{ + g_return_val_if_fail (builder != NULL, NULL); + + return &builder->current_point; +} + /** * gsk_path_builder_add_path: * @builder: a #GskPathBuilder @@ -383,6 +402,29 @@ gsk_path_builder_move_to (GskPathBuilder *builder, gsk_path_builder_ensure_current (builder); } +/** + * gsk_path_builder_rel_move_to: + * @builder: a #GskPathBuilder + * @x: x offset + * @y: y offset + * + * Starts a new contour by placing the pen at @x, @y relative to the current + * point. + * + * This is the relative version of gsk_path_builder_move_to(). + **/ +void +gsk_path_builder_rel_move_to (GskPathBuilder *builder, + float x, + float y) +{ + g_return_if_fail (builder != NULL); + + gsk_path_builder_move_to (builder, + builder->current_point.x + x, + builder->current_point.y + y); +} + /** * gsk_path_builder_line_to: * @builder: a #GskPathBuilder @@ -411,6 +453,29 @@ gsk_path_builder_line_to (GskPathBuilder *builder, }); } +/** + * gsk_path_builder_line_to: + * @builder: a #GskPathBuilder + * @x: x offset + * @y: y offset + * + * Draws a line from the current point to a point offset to it by @x, @y + * and makes it the new current point. + * + * This is the relative version of gsk_path_builder_line_to(). + **/ +void +gsk_path_builder_rel_line_to (GskPathBuilder *builder, + float x, + float y) +{ + g_return_if_fail (builder != NULL); + + gsk_path_builder_line_to (builder, + builder->current_point.x + x, + builder->current_point.y + y); +} + /** * gsk_path_builder_curve_to: * @builder: a #GskPathBuilder @@ -424,6 +489,8 @@ gsk_path_builder_line_to (GskPathBuilder *builder, * Adds a [cubic Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) * from the current point to @x3, @y3 with @x1, @y1 and @x2, @y2 as the control * points. + * + * After this, @x3, @y3 will be the new current point. **/ void gsk_path_builder_curve_to (GskPathBuilder *builder, @@ -446,6 +513,42 @@ gsk_path_builder_curve_to (GskPathBuilder *builder, }); } +/** + * gsk_path_builder_rel_curve_to: + * @builder: a #GskPathBuilder + * @x1: x offset of first control point + * @y1: y offset of first control point + * @x2: x offset of second control point + * @y2: y offset of second control point + * @x3: x offset of the end of the curve + * @y3: y offset of the end of the curve + * + * Adds a [cubic Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) + * from the current point to @x3, @y3 with @x1, @y1 and @x2, @y2 as the control + * points. All coordinates are given relative to the current point. + * + * This is the relative version of gsk_path_builder_curve_to(). + **/ +void +gsk_path_builder_rel_curve_to (GskPathBuilder *builder, + float x1, + float y1, + float x2, + float y2, + float x3, + float y3) +{ + g_return_if_fail (builder != NULL); + + gsk_path_builder_curve_to (builder, + builder->current_point.x + x1, + builder->current_point.y + y1, + builder->current_point.x + x2, + builder->current_point.y + y2, + builder->current_point.x + x3, + builder->current_point.y + y3); +} + /** * gsk_path_builder_close: * @builder: a #GskPathBuilder diff --git a/gsk/gskpathbuilder.h b/gsk/gskpathbuilder.h index 2bc7a3933d..4868ccf25e 100644 --- a/gsk/gskpathbuilder.h +++ b/gsk/gskpathbuilder.h @@ -45,6 +45,9 @@ GskPath * gsk_path_builder_free_to_path (GskPathBuilder GDK_AVAILABLE_IN_ALL GskPath * gsk_path_builder_to_path (GskPathBuilder *builder) G_GNUC_WARN_UNUSED_RESULT; +GDK_AVAILABLE_IN_ALL +const graphene_point_t *gsk_path_builder_get_current_point (GskPathBuilder *builder); + GDK_AVAILABLE_IN_ALL void gsk_path_builder_add_path (GskPathBuilder *builder, GskPath *path); @@ -61,10 +64,18 @@ void gsk_path_builder_move_to (GskPathBuilder float x, float y); GDK_AVAILABLE_IN_ALL +void gsk_path_builder_rel_move_to (GskPathBuilder *builder, + float x, + float y); +GDK_AVAILABLE_IN_ALL void gsk_path_builder_line_to (GskPathBuilder *builder, float x, float y); GDK_AVAILABLE_IN_ALL +void gsk_path_builder_rel_line_to (GskPathBuilder *builder, + float x, + float y); +GDK_AVAILABLE_IN_ALL void gsk_path_builder_curve_to (GskPathBuilder *builder, float x1, float y1, @@ -73,6 +84,14 @@ void gsk_path_builder_curve_to (GskPathBuilder float x3, float y3); GDK_AVAILABLE_IN_ALL +void gsk_path_builder_rel_curve_to (GskPathBuilder *builder, + float x1, + float y1, + float x2, + float y2, + float x3, + float y3); +GDK_AVAILABLE_IN_ALL void gsk_path_builder_close (GskPathBuilder *builder); G_END_DECLS