Change gsk_path_get_closest_point to return distance

We already compute it, so lets return it.
Bindings seems fine with this change - they
already return (success, point) as a tuple
anyway.
This commit is contained in:
Matthias Clasen 2023-08-28 11:20:16 -04:00
parent 7095a67910
commit 827bbc0cc1
6 changed files with 37 additions and 25 deletions

View File

@ -138,16 +138,20 @@ pointer_motion (GtkEventControllerMotion *controller,
GtkMaze *self)
{
GskPathPoint point;
graphene_point_t pos;
float distance;
if (!self->active)
return;
gsk_path_get_closest_point (self->path, &GRAPHENE_POINT_INIT (x, y), INFINITY, &point);
gsk_path_point_get_position (&point, self->path, &pos);
if (graphene_point_distance (&GRAPHENE_POINT_INIT (x, y), &pos, NULL, NULL) <= MAZE_STROKE_SIZE_ACTIVE / 2.0f)
return;
if (gsk_path_get_closest_point (self->path,
&GRAPHENE_POINT_INIT (x, y),
INFINITY,
&point,
&distance))
{
if (distance < MAZE_STROKE_SIZE_ACTIVE / 2.f)
return;
}
self->active = FALSE;
gtk_widget_queue_draw (GTK_WIDGET (self));

View File

@ -203,8 +203,8 @@ update_path (GtkSpinnerPaintable *self)
g_clear_pointer (&self->path, gsk_path_unref);
gsk_path_get_closest_point (self->circle, &p0, INFINITY, &start);
gsk_path_get_closest_point (self->circle, &p1, INFINITY, &end);
gsk_path_get_closest_point (self->circle, &p0, INFINITY, &start, NULL);
gsk_path_get_closest_point (self->circle, &p1, INFINITY, &end, NULL);
builder = gsk_path_builder_new ();
gsk_path_builder_add_segment (builder, self->circle, &start, &end);

View File

@ -506,10 +506,9 @@ pointer_motion (GtkEventControllerMotion *controller,
if (gsk_path_get_closest_point (self->line_path,
&GRAPHENE_POINT_INIT (x, y),
INFINITY,
&point))
&point,
NULL))
{
gsk_path_point_get_position (&point, self->line_path, &pos);
gtk_widget_queue_draw (GTK_WIDGET (self));
}
}

View File

@ -565,6 +565,7 @@ gsk_path_get_end_point (GskPath *self,
* @point: the point
* @threshold: maximum allowed distance
* @result: (out caller-allocates): return location for the closest point
* @distance: (out) (optional): return location for the distance
*
* Computes the closest point on the path to the given point
* and sets the @result to it.
@ -581,7 +582,8 @@ gboolean
gsk_path_get_closest_point (GskPath *self,
const graphene_point_t *point,
float threshold,
GskPathPoint *result)
GskPathPoint *result,
float *distance)
{
gboolean found;
@ -594,14 +596,17 @@ gsk_path_get_closest_point (GskPath *self,
for (int i = 0; i < self->n_contours; i++)
{
float distance;
float dist;
if (gsk_contour_get_closest_point (self->contours[i], point, threshold, result, &distance))
if (gsk_contour_get_closest_point (self->contours[i], point, threshold, result, &dist))
{
found = TRUE;
g_assert (0 <= result->t && result->t <= 1);
result->contour = i;
threshold = distance;
threshold = dist;
if (distance)
*distance = dist;
}
}

View File

@ -135,7 +135,8 @@ GDK_AVAILABLE_IN_4_14
gboolean gsk_path_get_closest_point (GskPath *self,
const graphene_point_t *point,
float threshold,
GskPathPoint *result);
GskPathPoint *result,
float *distance);
GDK_AVAILABLE_IN_4_14
gboolean gsk_path_foreach (GskPath *self,

View File

@ -301,7 +301,7 @@ test_empty_path (void)
g_assert_false (gsk_path_in_fill (path, &GRAPHENE_POINT_INIT (0, 0), GSK_FILL_RULE_WINDING));
g_assert_false (gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (0, 0), INFINITY, &point));
g_assert_false (gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (0, 0), INFINITY, &point, NULL));
gsk_path_unref (path);
}
@ -314,6 +314,7 @@ test_rect_path (void)
char *s;
graphene_rect_t bounds;
GskPathPoint point;
float distance;
builder = gsk_path_builder_new ();
gsk_path_builder_add_rect (builder, &GRAPHENE_RECT_INIT (0, 0, 200, 100));
@ -332,7 +333,9 @@ test_rect_path (void)
g_assert_true (gsk_path_in_fill (path, &GRAPHENE_POINT_INIT (50, 50), GSK_FILL_RULE_WINDING));
g_assert_false (gsk_path_in_fill (path, &GRAPHENE_POINT_INIT (200, 200), GSK_FILL_RULE_WINDING));
g_assert_true (gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (200, 200), INFINITY, &point));
g_assert_true (gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (200, 200), INFINITY, &point, &distance));
g_assert_true (distance == 100);
gsk_path_unref (path);
}
@ -455,7 +458,7 @@ test_path_point (void)
g_assert_true (point.idx == 4);
g_assert_true (point.t == 1);
ret = gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (200, 200), INFINITY, &point);
ret = gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (200, 200), INFINITY, &point, NULL);
g_assert_true (ret);
g_assert_true (point.contour == 0);
@ -473,7 +476,7 @@ test_path_point (void)
g_assert_true (graphene_vec2_equal (&t2, &mx));
g_assert_true (curvature == 0);
ret = gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (100, 50), INFINITY, &point);
ret = gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (100, 50), INFINITY, &point, NULL);
g_assert_true (ret);
g_assert_true (point.contour == 0);
@ -534,8 +537,8 @@ test_path_segments (void)
char *str;
path = gsk_path_parse (tests[i].path);
g_assert_true (gsk_path_get_closest_point (path, &tests[i].p1, INFINITY, &p1));
g_assert_true (gsk_path_get_closest_point (path, &tests[i].p2, INFINITY, &p2));
g_assert_true (gsk_path_get_closest_point (path, &tests[i].p1, INFINITY, &p1, NULL));
g_assert_true (gsk_path_get_closest_point (path, &tests[i].p2, INFINITY, &p2, NULL));
builder = gsk_path_builder_new ();
gsk_path_builder_add_segment (builder, path, &p1, &p2);
@ -602,7 +605,7 @@ test_path_builder_add (void)
path = gsk_path_parse ("M 10 10 L 100 100");
gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (50, 50), INFINITY, &point1);
gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (50, 50), INFINITY, &point1, NULL);
gsk_path_get_end_point (path, &point2);
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100);
@ -872,8 +875,8 @@ test_circle (void)
gsk_path_point_get_position (&point0, path, &p);
g_assert_true (graphene_point_equal (&p, &GRAPHENE_POINT_INIT (1, 0)));
gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (1, 1), INFINITY, &point0);
gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (-1, 1), INFINITY, &point1);
gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (1, 1), INFINITY, &point0, NULL);
gsk_path_get_closest_point (path, &GRAPHENE_POINT_INIT (-1, 1), INFINITY, &point1, NULL);
builder = gsk_path_builder_new ();
gsk_path_builder_add_segment (builder, path, &point0, &point1);