From 75db137ba982dba3492059e2e7df2b3c849acc3d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 19 Dec 2020 22:14:26 -0500 Subject: [PATCH] curve: Handle degenerate cases Nothing prevents control points from being identical, and if that happens, some of our constructions involving tangents and normals break down. Handle these cases in get_{start,end}_tangent and offset, for the case of cubics. --- gsk/gskcurve.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/gsk/gskcurve.c b/gsk/gskcurve.c index 755ef980f5..46db9ea3f0 100644 --- a/gsk/gskcurve.c +++ b/gsk/gskcurve.c @@ -877,7 +877,15 @@ gsk_cubic_curve_get_start_tangent (const GskCurve *curve, { const GskCubicCurve *self = &curve->cubic; - get_tangent (&self->points[0], &self->points[1], tangent); + if (graphene_point_near (&self->points[0], &self->points[1], 0.0001)) + { + if (graphene_point_near (&self->points[0], &self->points[2], 0.0001)) + get_tangent (&self->points[0], &self->points[3], tangent); + else + get_tangent (&self->points[0], &self->points[2], tangent); + } + else + get_tangent (&self->points[0], &self->points[1], tangent); } static void @@ -886,7 +894,15 @@ gsk_cubic_curve_get_end_tangent (const GskCurve *curve, { const GskCubicCurve *self = &curve->cubic; - get_tangent (&self->points[2], &self->points[3], tangent); + if (graphene_point_near (&self->points[2], &self->points[3], 0.0001)) + { + if (graphene_point_near (&self->points[1], &self->points[3], 0.0001)) + get_tangent (&self->points[0], &self->points[3], tangent); + else + get_tangent (&self->points[1], &self->points[3], tangent); + } + else + get_tangent (&self->points[2], &self->points[3], tangent); } static void