diff --git a/src/cairo-spline.c b/src/cairo-spline.c index 9d8c200e2..1b6f4cfb3 100644 --- a/src/cairo-spline.c +++ b/src/cairo-spline.c @@ -271,15 +271,28 @@ _cairo_spline_bound (cairo_spline_add_point_func_t add_point_func, #define FIND_EXTREMES(a,b,c) \ { \ - double delta = b * b - a * c; \ if (a == 0) { \ ADD (-c / (2*b)); \ - } else if (delta > 0) { \ - double sqrt_delta = sqrt (delta); \ - ADD ((-b - sqrt_delta) / a); \ - ADD ((-b + sqrt_delta) / a); \ - } else if (delta == 0) { \ - ADD (-b / a); \ + } else { \ + double b2 = b * b; \ + double delta = b2 - a * c; \ + if (delta > 0) { \ + double a2 = a * a; \ + double ab = a * b; \ + /* We are only interested in solutions t that satisfy 0 (ab >= 0 ? b2 : a2 + b2 + 2*ab)) { \ + double sqrt_delta = sqrt (delta); \ + ADD ((-b - sqrt_delta) / a); \ + ADD ((-b + sqrt_delta) / a); \ + } \ + } else if (delta == 0) { \ + ADD (-b / a); \ + } \ } \ }