[gtk/wip/matthiasc/lottie-stroke: 56/60] towards working subdivisions
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/lottie-stroke: 56/60] towards working subdivisions
- Date: Mon, 30 Nov 2020 19:40:20 +0000 (UTC)
commit 9f156343df70d06dd1933de9b8bf3cb6a6a81841
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Nov 30 02:23:04 2020 -0500
towards working subdivisions
Much simpler now
gsk/gskpathstroke.c | 88 ++++++-----------------------------------------------
1 file changed, 10 insertions(+), 78 deletions(-)
---
diff --git a/gsk/gskpathstroke.c b/gsk/gskpathstroke.c
index 21c71c3dbb..c08d7a9bb3 100644
--- a/gsk/gskpathstroke.c
+++ b/gsk/gskpathstroke.c
@@ -891,89 +891,24 @@ typedef struct
graphene_point_t *start;
} 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],
- AddOpData *data)
+ AddOpData *data,
+ int level)
{
- float pos[8];
- int i, k, n = 0;
- GList *l, *pass1 = NULL;
- graphene_point_t p[4];
- graphene_point_t *segment;
- float t0, t1;
-
- 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;
-
-#if 0
- t0 = 0.1;
- t1 = 0.9;
- for (i = 0; i < n; i++)
+ if (level == 0 || cubic_is_simple (pts))
+ data->ops = g_list_prepend (data->ops,
+ path_op_data_new (GSK_PATH_CURVE, pts, 4));
+ else
{
graphene_point_t left[4];
graphene_point_t right[4];
- float t;
- t = pos[i];
- if (t < t0 || t > t1)
- continue;
+ split_bezier (pts, 4, 0.5, left, right);
- 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] - pos[i]) / (1 - pos[i]);
-
- t0 = 0;
- t1 = (t1 - pos[i]) / (1 - pos[i]);
- }
-#endif
-
- segment = g_new (graphene_point_t, 4);
- memcpy (segment, pts, sizeof (graphene_point_t) * 4);
- pass1 = g_list_append (pass1, segment);
-
- 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));
- }
+ subdivide_and_add (left, data, level - 1);
+ subdivide_and_add (right, data, level - 1);
}
-
- g_list_free_full (pass1, g_free);
}
static gboolean
@@ -997,10 +932,7 @@ add_op_to_list (GskPathOperation op,
break;
case GSK_PATH_CURVE:
- if (g_getenv ("SUBDIVIDE"))
- subdivide_and_add (pts, data);
- else
- data->ops = g_list_prepend (data->ops, path_op_data_new (op, pts, n_pts));
+ subdivide_and_add (pts, data, 2);
break;
case GSK_PATH_CONIC:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]