[gtk/path-work-rebased: 22/71] path: Add gsk_path_builder_add_ellipse()
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/path-work-rebased: 22/71] path: Add gsk_path_builder_add_ellipse()
- Date: Fri, 8 Apr 2022 20:45:36 +0000 (UTC)
commit 94f93dbd2d572ad2a5895da1690c3ef8cf38d8f5
Author: Benjamin Otte <otte redhat com>
Date: Fri Dec 25 21:31:06 2020 +0100
path: Add gsk_path_builder_add_ellipse()
gsk/gskpathbuilder.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
gsk/gskpathbuilder.h | 4 ++++
2 files changed, 50 insertions(+)
---
diff --git a/gsk/gskpathbuilder.c b/gsk/gskpathbuilder.c
index 89d37894e7..7ea5ba8d7e 100644
--- a/gsk/gskpathbuilder.c
+++ b/gsk/gskpathbuilder.c
@@ -446,6 +446,52 @@ gsk_path_builder_add_circle (GskPathBuilder *builder,
gsk_path_builder_add_contour (builder, contour);
}
+/**
+ * gsk_path_builder_add_ellipse:
+ * @builder: a `GskPathBuilder`
+ * @center: the center point of the ellipse
+ * @radius: the radius of the ellipse in x/y direction
+ *
+ * Adds an ellipse with the given @center and the @radius in
+ * x/y direction.
+ **/
+void
+gsk_path_builder_add_ellipse (GskPathBuilder *builder,
+ const graphene_point_t *center,
+ const graphene_size_t *radius)
+{
+ const float weight = sqrt(0.5f);
+ graphene_point_t pts[8];
+
+ g_return_if_fail (builder != NULL);
+ g_return_if_fail (center != NULL);
+ g_return_if_fail (radius != NULL);
+
+ pts[0] = GRAPHENE_POINT_INIT (center->x + radius->width / 2,
+ center->y);
+ pts[1] = GRAPHENE_POINT_INIT (center->x + radius->width / 2,
+ center->y + radius->height / 2);
+ pts[2] = GRAPHENE_POINT_INIT (center->x,
+ center->y + radius->height / 2);
+ pts[3] = GRAPHENE_POINT_INIT (center->x - radius->width / 2,
+ center->y + radius->height / 2);
+ pts[4] = GRAPHENE_POINT_INIT (center->x - radius->width / 2,
+ center->y);
+ pts[5] = GRAPHENE_POINT_INIT (center->x - radius->width / 2,
+ center->y - radius->height / 2);
+ pts[6] = GRAPHENE_POINT_INIT (center->x,
+ center->y - radius->height / 2);
+ pts[7] = GRAPHENE_POINT_INIT (center->x + radius->width / 2,
+ center->y - radius->height / 2);
+
+ gsk_path_builder_move_to (builder, pts[0].x, pts[0].y);
+ gsk_path_builder_conic_to (builder, pts[1].x, pts[1].y, pts[2].x, pts[2].y, weight);
+ gsk_path_builder_conic_to (builder, pts[3].x, pts[3].y, pts[4].x, pts[4].y, weight);
+ gsk_path_builder_conic_to (builder, pts[5].x, pts[5].y, pts[6].x, pts[6].y, weight);
+ gsk_path_builder_conic_to (builder, pts[7].x, pts[7].y, pts[0].x, pts[0].y, weight);
+ gsk_path_builder_close (builder);
+}
+
/**
* gsk_path_builder_move_to:
* @builder: a `GskPathBuilder`
diff --git a/gsk/gskpathbuilder.h b/gsk/gskpathbuilder.h
index 15bf3c469c..a28d90100d 100644
--- a/gsk/gskpathbuilder.h
+++ b/gsk/gskpathbuilder.h
@@ -62,6 +62,10 @@ GDK_AVAILABLE_IN_ALL
void gsk_path_builder_add_circle (GskPathBuilder *builder,
const graphene_point_t *center,
float radius);
+GDK_AVAILABLE_IN_ALL
+void gsk_path_builder_add_ellipse (GskPathBuilder *builder,
+ const graphene_point_t *center,
+ const graphene_size_t *radius);
/* next function implemented in gskpathmeasure.c */
GDK_AVAILABLE_IN_ALL
void gsk_path_builder_add_segment (GskPathBuilder *builder,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]