[gtk/path-work-rebased: 1029/1045] path: Add gsk_path_stroke
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/path-work-rebased: 1029/1045] path: Add gsk_path_stroke
- Date: Thu, 7 Apr 2022 19:09:27 +0000 (UTC)
commit 1401a080d514e42a68627c885c646764fec5b015
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Dec 5 13:37:53 2020 -0500
path: Add gsk_path_stroke
Add the plumbing that will let us do special-case stroking
for rectangles, circles and other special contours.
There is no implementation yet.
gsk/gskcontour.c | 41 ++++++++++++++++++++++++++++++++++++++---
gsk/gskcontourprivate.h | 6 ++++++
gsk/gskpath.c | 25 +++++++++++++++++++++++++
gsk/gskpath.h | 5 +++++
4 files changed, 74 insertions(+), 3 deletions(-)
---
diff --git a/gsk/gskcontour.c b/gsk/gskcontour.c
index ad4f269409..cddd2c5fc1 100644
--- a/gsk/gskcontour.c
+++ b/gsk/gskcontour.c
@@ -86,6 +86,9 @@ struct _GskContourClass
gboolean (* get_stroke_bounds) (const GskContour *contour,
const GskStroke *stroke,
graphene_rect_t *bounds);
+ void (* add_stroke) (const GskContour *contour,
+ GskPathBuilder *builder,
+ GskStroke *stroke);
};
static gsize
@@ -492,6 +495,13 @@ gsk_rect_contour_get_stroke_bounds (const GskContour *contour,
return TRUE;
}
+static void
+gsk_rect_contour_add_stroke (const GskContour *contour,
+ GskPathBuilder *builder,
+ GskStroke *stroke)
+{
+}
+
static const GskContourClass GSK_RECT_CONTOUR_CLASS =
{
sizeof (GskRectContour),
@@ -509,7 +519,8 @@ static const GskContourClass GSK_RECT_CONTOUR_CLASS =
gsk_rect_contour_copy,
gsk_rect_contour_add_segment,
gsk_rect_contour_get_winding,
- gsk_rect_contour_get_stroke_bounds
+ gsk_rect_contour_get_stroke_bounds,
+ gsk_rect_contour_add_stroke
};
GskContour *
@@ -840,6 +851,13 @@ gsk_circle_contour_get_stroke_bounds (const GskContour *contour,
return TRUE;
}
+static void
+gsk_circle_contour_add_stroke (const GskContour *contour,
+ GskPathBuilder *builder,
+ GskStroke *stroke)
+{
+}
+
static const GskContourClass GSK_CIRCLE_CONTOUR_CLASS =
{
sizeof (GskCircleContour),
@@ -857,7 +875,8 @@ static const GskContourClass GSK_CIRCLE_CONTOUR_CLASS =
gsk_circle_contour_copy,
gsk_circle_contour_add_segment,
gsk_circle_contour_get_winding,
- gsk_circle_contour_get_stroke_bounds
+ gsk_circle_contour_get_stroke_bounds,
+ gsk_circle_contour_add_stroke
};
GskContour *
@@ -1562,6 +1581,13 @@ gsk_standard_contour_get_stroke_bounds (const GskContour *contour,
return TRUE;
}
+static void
+gsk_standard_contour_add_stroke (const GskContour *contour,
+ GskPathBuilder *builder,
+ GskStroke *stroke)
+{
+}
+
static const GskContourClass GSK_STANDARD_CONTOUR_CLASS =
{
sizeof (GskStandardContour),
@@ -1579,7 +1605,8 @@ static const GskContourClass GSK_STANDARD_CONTOUR_CLASS =
gsk_standard_contour_copy,
gsk_standard_contour_add_segment,
gsk_standard_contour_get_winding,
- gsk_standard_contour_get_stroke_bounds
+ gsk_standard_contour_get_stroke_bounds,
+ gsk_standard_contour_add_stroke
};
/* You must ensure the contour has enough size allocated,
@@ -1751,6 +1778,14 @@ gsk_contour_get_stroke_bounds (const GskContour *self,
return self->klass->get_stroke_bounds (self, stroke, bounds);
}
+void
+gsk_contour_add_stroke (const GskContour *self,
+ GskPathBuilder *builder,
+ GskStroke *stroke)
+{
+ self->klass->add_stroke (self, builder, stroke);
+}
+
void
gsk_contour_copy (GskContour *dest,
const GskContour *src)
diff --git a/gsk/gskcontourprivate.h b/gsk/gskcontourprivate.h
index dcbf38c9c9..1145df7076 100644
--- a/gsk/gskcontourprivate.h
+++ b/gsk/gskcontourprivate.h
@@ -100,6 +100,12 @@ void gsk_contour_add_segment (const GskContou
gboolean gsk_contour_get_stroke_bounds (const GskContour *self,
const GskStroke *stroke,
graphene_rect_t *bounds);
+void gsk_contour_add_stroke (const GskContour *contour,
+ GskPathBuilder *builder,
+ GskStroke *stroke);
+void gsk_contour_default_add_stroke (const GskContour *contour,
+ GskPathBuilder *builder,
+ GskStroke *stroke);
G_END_DECLS
diff --git a/gsk/gskpath.c b/gsk/gskpath.c
index d15fbfcb2f..abdb5dd4f9 100644
--- a/gsk/gskpath.c
+++ b/gsk/gskpath.c
@@ -1239,3 +1239,28 @@ gsk_path_get_stroke_bounds (GskPath *path,
return TRUE;
}
+
+/**
+ * gsk_path_stroke:
+ * @self: a `GskPath`
+ * @stroke: stroke parameters
+ *
+ * Create a new path that follows the outline of the area
+ * that would be affected by stroking along @self with
+ * the given stroke parameters.
+ *
+ * Returns: a new `GskPath`
+ */
+GskPath *
+gsk_path_stroke (GskPath *self,
+ GskStroke *stroke)
+{
+ GskPathBuilder *builder;
+
+ builder = gsk_path_builder_new ();
+
+ for (int i = 0; i < self->n_contours; i++)
+ gsk_contour_add_stroke (gsk_path_get_contour (self, i), builder, stroke);
+
+ return gsk_path_builder_free_to_path (builder);
+}
diff --git a/gsk/gskpath.h b/gsk/gskpath.h
index 1c44acfede..50a4c85ccd 100644
--- a/gsk/gskpath.h
+++ b/gsk/gskpath.h
@@ -109,6 +109,11 @@ gboolean gsk_path_foreach (GskPath
GskPathForeachFunc func,
gpointer user_data);
+GDK_AVAILABLE_IN_ALL
+GskPath * gsk_path_stroke (GskPath *self,
+ GskStroke *stroke);
+
+
G_END_DECLS
#endif /* __GSK_PATH_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]