[gtk/wip/otte/lottie: 20/38] pathbuilder: Add relative path commands
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/lottie: 20/38] pathbuilder: Add relative path commands
- Date: Tue, 1 Dec 2020 14:44:15 +0000 (UTC)
commit 6c32389652843e5e1e29ca1e34e0e7eb50166a36
Author: Benjamin Otte <otte redhat com>
Date: Sat Nov 28 14:52:17 2020 +0100
pathbuilder: Add relative path commands
And gsk_path_builder_get_current_point().
They will be needed by the string parser.
docs/reference/gsk/gsk4-sections.txt | 5 ++
gsk/gskpathbuilder.c | 103 +++++++++++++++++++++++++++++++++++
gsk/gskpathbuilder.h | 19 +++++++
3 files changed, 127 insertions(+)
---
diff --git a/docs/reference/gsk/gsk4-sections.txt b/docs/reference/gsk/gsk4-sections.txt
index e24292e295..8e50652f9f 100644
--- a/docs/reference/gsk/gsk4-sections.txt
+++ b/docs/reference/gsk/gsk4-sections.txt
@@ -293,12 +293,17 @@ gsk_path_builder_unref
gsk_path_builder_to_path
gsk_path_builder_free_to_path
<SUBSECTION>
+gsk_path_builder_get_current_point
+<SUBSECTION>
gsk_path_builder_add_rect
gsk_path_builder_add_circle
<SUBSECTION>
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
<SUBSECTION Private>
GSK_TYPE_PATH_BUILDER
diff --git a/gsk/gskpathbuilder.c b/gsk/gskpathbuilder.c
index 16242a306d..4498309a1a 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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]