diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2008-12-28 01:59:12 -0500 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2008-12-28 01:59:12 -0500 |
commit | 3292f9906b3637564c37863dde5d214b0fee2885 (patch) | |
tree | f20a2d782646ec03ad1523af658f5b34d51bf2de /src/cairo-spline.c | |
parent | efe4d2ce99e65f9841951d3ff3e0536973bfb12c (diff) | |
download | cairo-3292f9906b3637564c37863dde5d214b0fee2885.tar.gz |
[spline] Do some checks to avoid calling sqrt() if no feasible solution exists
Diffstat (limited to 'src/cairo-spline.c')
-rw-r--r-- | src/cairo-spline.c | 27 |
1 files changed, 20 insertions, 7 deletions
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<t<1 \ + * here. We do some checks to avoid sqrt if the solutions \ + * are not in that range. The checks can be derived from: \ + * \ + * 0 < (-b±√delta)/a < 1 \ + */ \ + if (delta > (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); \ + } \ } \ } |