From 7404dc8999d4c2de5ea03f1867d2a911daf6338f Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 5 Jul 2023 00:27:39 -0400 Subject: [PATCH] circle contour: Fix reverse segments Just turn them into a standard contour. --- gsk/gskcontour.c | 71 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/gsk/gskcontour.c b/gsk/gskcontour.c index fad3e2f7ae..1941c00046 100644 --- a/gsk/gskcontour.c +++ b/gsk/gskcontour.c @@ -842,6 +842,47 @@ gsk_circle_contour_copy (const GskContour *contour, *target = *self; } +static gboolean +add_segment (GskPathOperation op, + const graphene_point_t *pts, + gsize n_pts, + float weight, + gpointer data) +{ + GskPathBuilder *builder = data; + + switch (op) + { + case GSK_PATH_LINE: + gsk_path_builder_line_to (builder, pts[1].x, pts[1].y); + break; + + case GSK_PATH_QUAD: + gsk_path_builder_quad_to (builder, pts[1].x, pts[1].y, + pts[2].x, pts[2].y); + break; + + case GSK_PATH_CUBIC: + gsk_path_builder_cubic_to (builder, pts[1].x, pts[1].y, + pts[2].x, pts[2].y, + pts[3].x, pts[3].y); + break; + + case GSK_PATH_CONIC: + gsk_path_builder_conic_to (builder, pts[1].x, pts[1].y, + pts[2].x, pts[2].y, + weight); + break; + + case GSK_PATH_MOVE: + case GSK_PATH_CLOSE: + default: + g_assert_not_reached (); + } + + return TRUE; +} + static void gsk_circle_contour_add_segment (const GskContour *contour, GskPathBuilder *builder, @@ -851,16 +892,28 @@ gsk_circle_contour_add_segment (const GskContour *contour, float end) { const GskCircleContour *self = (const GskCircleContour *) contour; - float delta = self->end_angle - self->start_angle; - float length = self->radius * DEG_TO_RAD (delta); - GskContour *segment; - if (!emit_move_to) - g_warning ("FIXME: somebody needs to decompose contours into segments differently"); - segment = gsk_circle_contour_new (&self->center, self->radius, - self->start_angle + start/length * delta, - self->start_angle + end/length * delta); - gsk_path_builder_add_contour (builder, segment); + if (emit_move_to) + { + float delta = self->end_angle - self->start_angle; + float length = self->radius * DEG_TO_RAD (delta); + GskContour *segment; + + segment = gsk_circle_contour_new (&self->center, self->radius, + self->start_angle + start/length * delta, + self->start_angle + end/length * delta); + gsk_path_builder_add_contour (builder, segment); + } + else + { + gsk_spline_decompose_arc (&self->center, + self->radius, + GSK_PATH_TOLERANCE_DEFAULT, + DEG_TO_RAD (self->end_angle), + DEG_TO_RAD (self->start_angle), + gsk_circle_contour_curve, + &(ForeachWrapper) { add_segment, builder }); + } } static int