[gtk/wip/matthiasc/lottie-stroke: 33/55] Add gsk_path_stroke




commit 1b9e1c24a0afd5c2b07a1fce5a2ef17313470522
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Dec 5 13:37:53 2020 -0500

    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 c7c74e9cff..0a290e7d67 100644
--- a/gsk/gskcontour.c
+++ b/gsk/gskcontour.c
@@ -81,6 +81,9 @@ struct _GskContourClass
                                                  gpointer                measure_data,
                                                  const graphene_point_t *point,
                                                  gboolean               *on_edge);
+  void                  (* add_stroke)          (const GskContour       *contour,
+                                                 GskPathBuilder         *builder,
+                                                 GskStroke              *stroke);
 };
 
 static gsize
@@ -469,6 +472,13 @@ gsk_rect_contour_get_winding (const GskContour       *contour,
   return 0;
 }
 
+static void
+gsk_rect_contour_add_stroke (const GskContour *contour,
+                             GskPathBuilder   *builder,
+                             GskStroke        *stroke)
+{
+}
+
 static const GskContourClass GSK_RECT_CONTOUR_CLASS =
 {
   sizeof (GskRectContour),
@@ -485,7 +495,8 @@ static const GskContourClass GSK_RECT_CONTOUR_CLASS =
   gsk_rect_contour_get_closest_point,
   gsk_rect_contour_copy,
   gsk_rect_contour_add_segment,
-  gsk_rect_contour_get_winding
+  gsk_rect_contour_get_winding,
+  gsk_rect_contour_add_stroke
 };
 
 GskContour *
@@ -818,6 +829,13 @@ gsk_circle_contour_get_winding (const GskContour       *contour,
   return 0;
 }
 
+static void
+gsk_circle_contour_add_stroke (const GskContour *contour,
+                               GskPathBuilder   *builder,
+                               GskStroke        *stroke)
+{
+}
+
 static const GskContourClass GSK_CIRCLE_CONTOUR_CLASS =
 {
   sizeof (GskCircleContour),
@@ -834,7 +852,8 @@ static const GskContourClass GSK_CIRCLE_CONTOUR_CLASS =
   gsk_circle_contour_get_closest_point,
   gsk_circle_contour_copy,
   gsk_circle_contour_add_segment,
-  gsk_circle_contour_get_winding
+  gsk_circle_contour_get_winding,
+  gsk_circle_contour_add_stroke
 };
 
 GskContour *
@@ -1470,6 +1489,13 @@ gsk_standard_contour_get_winding (const GskContour       *contour,
   return winding;
 }
 
+static void
+gsk_standard_contour_add_stroke (const GskContour *contour,
+                                 GskPathBuilder   *builder,
+                                 GskStroke        *stroke)
+{
+}
+
 static const GskContourClass GSK_STANDARD_CONTOUR_CLASS =
 {
   sizeof (GskStandardContour),
@@ -1486,7 +1512,8 @@ static const GskContourClass GSK_STANDARD_CONTOUR_CLASS =
   gsk_standard_contour_get_closest_point,
   gsk_standard_contour_copy,
   gsk_standard_contour_add_segment,
-  gsk_standard_contour_get_winding
+  gsk_standard_contour_get_winding,
+  gsk_standard_contour_add_stroke
 };
 
 /* You must ensure the contour has enough size allocated,
@@ -1649,6 +1676,14 @@ gsk_contour_get_winding (const GskContour       *self,
   return self->klass->get_winding (self, measure_data, point, on_edge);
 }
 
+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 bce0689d17..a3f9bb48ee 100644
--- a/gsk/gskcontourprivate.h
+++ b/gsk/gskcontourprivate.h
@@ -92,6 +92,12 @@ void                    gsk_contour_add_segment                 (const GskContou
                                                                  gpointer                measure_data,
                                                                  float                   start,
                                                                  float                   end);
+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 7aab4be14c..408a200f1d 100644
--- a/gsk/gskpath.c
+++ b/gsk/gskpath.c
@@ -1185,3 +1185,28 @@ error:
 
   return NULL;
 }
+
+/**
+ * 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 31f4cd10e9..48bf7e4476 100644
--- a/gsk/gskpath.h
+++ b/gsk/gskpath.h
@@ -106,6 +106,11 @@ gboolean                gsk_path_foreach                        (GskPath
                                                                  GskPathForeachFunc    func,
                                                                  gpointer              user_data);
 
+GDK_AVAILABLE_IN_ALL
+GskPath *               gsk_path_stroke                         (GskPath              *path,
+                                                                 GskStroke            *stroke);
+
+
 G_END_DECLS
 
 #endif /* __GSK_PATH_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]