diff --git a/gsk/gskpathbuilder.c b/gsk/gskpathbuilder.c index 99b05e058f..026db192a2 100644 --- a/gsk/gskpathbuilder.c +++ b/gsk/gskpathbuilder.c @@ -342,6 +342,73 @@ gsk_path_builder_add_rect (GskPathBuilder *builder, gsk_contour_get_start_end (contour, NULL, &builder->current_point); } +/** + * gsk_path_builder_add_rounded_rect: + * @builder: a `GskPathBuilder` + * @rect: the rounded rect + * + * Adds @rect as a new contour to the path built in @builder. + **/ +void +gsk_path_builder_add_rounded_rect (GskPathBuilder *builder, + const GskRoundedRect *rect) +{ + const float weight = M_SQRT1_2; + + g_return_if_fail (builder != NULL); + g_return_if_fail (rect != NULL); + + gsk_path_builder_move_to (builder, + rect->bounds.origin.x + rect->corner[GSK_CORNER_TOP_LEFT].width, + rect->bounds.origin.y); + /* top */ + gsk_path_builder_line_to (builder, + rect->bounds.origin.x + rect->bounds.size.width - rect->corner[GSK_CORNER_TOP_RIGHT].width, + rect->bounds.origin.y); + /* topright corner */ + gsk_path_builder_conic_to (builder, + rect->bounds.origin.x + rect->bounds.size.width, + rect->bounds.origin.y, + rect->bounds.origin.x + rect->bounds.size.width, + rect->bounds.origin.y + rect->corner[GSK_CORNER_TOP_RIGHT].height, + weight); + /* right */ + gsk_path_builder_line_to (builder, + rect->bounds.origin.x + rect->bounds.size.width, + rect->bounds.origin.y + rect->bounds.size.height - rect->corner[GSK_CORNER_BOTTOM_RIGHT].height); + /* bottomright corner */ + gsk_path_builder_conic_to (builder, + rect->bounds.origin.x + rect->bounds.size.width, + rect->bounds.origin.y + rect->bounds.size.height, + rect->bounds.origin.x + rect->bounds.size.width - rect->corner[GSK_CORNER_BOTTOM_RIGHT].width, + rect->bounds.origin.y + rect->bounds.size.height, + weight); + /* bottom */ + gsk_path_builder_line_to (builder, + rect->bounds.origin.x + rect->corner[GSK_CORNER_BOTTOM_LEFT].width, + rect->bounds.origin.y + rect->bounds.size.height); + /* bottomleft corner */ + gsk_path_builder_conic_to (builder, + rect->bounds.origin.x, + rect->bounds.origin.y + rect->bounds.size.height, + rect->bounds.origin.x, + rect->bounds.origin.y + rect->bounds.size.height - rect->corner[GSK_CORNER_BOTTOM_LEFT].height, + weight); + /* left */ + gsk_path_builder_line_to (builder, + rect->bounds.origin.x, + rect->bounds.origin.y + rect->corner[GSK_CORNER_TOP_LEFT].height); + /* topleft corner */ + gsk_path_builder_conic_to (builder, + rect->bounds.origin.x, + rect->bounds.origin.y, + rect->bounds.origin.x + rect->corner[GSK_CORNER_TOP_LEFT].width, + rect->bounds.origin.y, + weight); + /* done */ + gsk_path_builder_close (builder); +} + /** * gsk_path_builder_add_circle: * @builder: a `GskPathBuilder` diff --git a/gsk/gskpathbuilder.h b/gsk/gskpathbuilder.h index f1a59b2504..15bf3c469c 100644 --- a/gsk/gskpathbuilder.h +++ b/gsk/gskpathbuilder.h @@ -25,6 +25,7 @@ #endif +#include #include G_BEGIN_DECLS @@ -55,6 +56,9 @@ GDK_AVAILABLE_IN_ALL void gsk_path_builder_add_rect (GskPathBuilder *builder, const graphene_rect_t *rect); GDK_AVAILABLE_IN_ALL +void gsk_path_builder_add_rounded_rect (GskPathBuilder *builder, + const GskRoundedRect *rect); +GDK_AVAILABLE_IN_ALL void gsk_path_builder_add_circle (GskPathBuilder *builder, const graphene_point_t *center, float radius);