[gtk/wip/matthiasc/lottie-stroke: 24/24] wip: Enable subdividing
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/lottie-stroke: 24/24] wip: Enable subdividing
- Date: Sun, 29 Nov 2020 18:57:12 +0000 (UTC)
commit a6021558787ae0f85a478834563b66cc50fb97d6
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Nov 29 00:47:40 2020 -0500
wip: Enable subdividing
This still needs more work.
gsk/gskpath.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 87 insertions(+), 1 deletion(-)
---
diff --git a/gsk/gskpath.c b/gsk/gskpath.c
index aa61da0a03..ca04c4a65a 100644
--- a/gsk/gskpath.c
+++ b/gsk/gskpath.c
@@ -3577,6 +3577,92 @@ typedef struct
GskStroke *stroke;
} AddOpData;
+static int
+compare_pos (const void *p1, const void *p2)
+{
+ const float *f1 = p1;
+ const float *f2 = p2;
+ return f1 < f2 ? -1 : (f1 > f2 ? 1 : 0);
+}
+
+static void
+subdivide_and_add (const graphene_point_t pts[4],
+ const graphene_point_t *p0,
+ const graphene_point_t *p1,
+ AddOpData *data)
+{
+ float pos[8];
+ int i, k, n = 0;
+ GList *l, *pass1 = NULL;
+ graphene_point_t p[4];
+ graphene_point_t *segment;
+
+ n += get_cubic_extrema (pts[0].x, pts[1].x, pts[2].x, pts[3].x, &pos[n]);
+ n += get_cubic_extrema (pts[0].y, pts[1].y, pts[2].y, pts[3].y, &pos[n]);
+ n += get_cubic_inflections (pts[0].x, pts[1].x, pts[2].x, pts[3].x, &pos[n]);
+ n += get_cubic_inflections (pts[0].y, pts[1].y, pts[2].y, pts[3].y, &pos[n]);
+
+ qsort (pos, n, sizeof (float), compare_pos);
+
+ for (i = 0; i < 4; i++)
+ p[i] = pts[i];
+
+ pass1 = NULL;
+
+ g_print ("splitting at ");
+ for (i = 0; i < n; i++)
+ g_print ("%f ", pos[i]);
+ g_print ("\n");
+
+ for (i = 0; i < n; i++)
+ {
+ graphene_point_t left[4];
+ graphene_point_t right[4];
+ float t;
+
+ t = pos[i];
+ if (t < 0.1 || t > 0.9)
+ continue;
+
+ split_bezier (p, 4, t, left, right);
+
+ segment = g_new (graphene_point_t, 4);
+ memcpy (segment, left, sizeof (graphene_point_t) * 4);
+ pass1 = g_list_append (pass1, segment);
+
+ for (k = 0; k < 4; k++)
+ p[k] = right[k];
+
+ for (k = i + 1; k < n; k++)
+ pos[k] = pos[k] / (1 - pos[i]);
+ }
+
+ segment = g_new (graphene_point_t, 4);
+ memcpy (segment, pts, sizeof (graphene_point_t) * 4);
+ pass1 = g_list_append (pass1, segment);
+
+ g_print ("after pass1: %d segments\n", g_list_length (pass1));
+
+ for (l = pass1; l; l = l->next)
+ {
+ segment = l->data;
+ if (cubic_is_simple (segment))
+ data->ops = g_list_prepend (data->ops, path_op_data_new (GSK_PATH_CURVE, segment, 4));
+ else
+ {
+ graphene_point_t left[4];
+ graphene_point_t right[4];
+
+ split_bezier (segment, 4, 0.5, left, right);
+
+ data->ops = g_list_prepend (data->ops, path_op_data_new (GSK_PATH_CURVE, left, 4));
+ data->ops = g_list_prepend (data->ops, path_op_data_new (GSK_PATH_CURVE, right, 4));
+ }
+ }
+
+ g_list_free_full (pass1, g_free);
+}
+
static gboolean
add_op_to_list (GskPathOperation op,
const graphene_point_t *pts,
@@ -3598,7 +3684,7 @@ add_op_to_list (GskPathOperation op,
break;
case GSK_PATH_CURVE:
- data->ops = g_list_prepend (data->ops, path_op_data_new (GSK_PATH_CURVE, pts, 4));
+ subdivide_and_add (pts, &pts[0], &pts[1], data);
break;
case GSK_PATH_CONIC:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]