[gtk/wip/matthiasc/lottie-stroke: 56/60] towards working subdivisions




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]