From 25e60d50958ee231d568f04d463e9abf3bd358e8 Mon Sep 17 00:00:00 2001 From: Simon Cozens Date: Mon, 27 Nov 2023 15:27:51 +0000 Subject: [PATCH] Replace linelike intersections with line-curve/line-line tests, fixes #3352 --- Lib/fontTools/misc/bezierTools.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Lib/fontTools/misc/bezierTools.py b/Lib/fontTools/misc/bezierTools.py index 21ab0a5d0a..a1a707b098 100644 --- a/Lib/fontTools/misc/bezierTools.py +++ b/Lib/fontTools/misc/bezierTools.py @@ -1370,6 +1370,11 @@ def midpoint(r): return unique_values +def _is_linelike(segment): + maybeline = _alignment_transformation(segment).transformPoints(segment) + return all(math.isclose(p[1], 0.0) for p in maybeline) + + def curveCurveIntersections(curve1, curve2): """Finds intersections between a curve and a curve. @@ -1391,6 +1396,17 @@ def curveCurveIntersections(curve1, curve2): >>> intersections[0].pt (81.7831487395506, 109.88904552375288) """ + if _is_linelike(curve1): + line1 = curve1[0], curve1[-1] + if _is_linelike(curve2): + line2 = curve2[0], curve2[-1] + return lineLineIntersections(*line1, *line2) + else: + return curveLineIntersections(curve2, line1) + elif _is_linelike(curve2): + line2 = curve2[0], curve2[-1] + return curveLineIntersections(curve1, line2) + intersection_ts = _curve_curve_intersections_t(curve1, curve2) return [ Intersection(pt=segmentPointAtT(curve1, ts[0]), t1=ts[0], t2=ts[1])