diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2008-12-28 02:41:39 -0500 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2008-12-28 02:41:39 -0500 |
commit | 3bf1b7d574620b1ab3c1fa50977a23d36ab04a40 (patch) | |
tree | 7f07332018340a2f3ab0f5d7699e3fc2c858ee25 /src/cairo-spline.c | |
parent | 7f840d156c1212eeb0fddad4b4a6844a9c070bd5 (diff) | |
download | cairo-3bf1b7d574620b1ab3c1fa50977a23d36ab04a40.tar.gz |
[_cairo_spline_bound] Fix the check for feasible solutions
Also make it more strict. The only times we call sqrt now is
when a solution in (0,1) exists.
Diffstat (limited to 'src/cairo-spline.c')
-rw-r--r-- | src/cairo-spline.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/cairo-spline.c b/src/cairo-spline.c index 5f2dc6ce3..d2c45c3bb 100644 --- a/src/cairo-spline.c +++ b/src/cairo-spline.c @@ -277,15 +277,18 @@ _cairo_spline_bound (cairo_spline_add_point_func_t add_point_func, double b2 = b * b; \ double delta = b2 - a * c; \ if (delta > 0) { \ - double a2 = a * a; \ - double ab = a * b; \ + double a2_b2 = a * a + b2; \ + double _2ab = 2 * a * b; \ + double _b_a = - b / a; \ /* 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)) { \ + if ((_2ab >= 0 && delta > b2 && delta < a2_b2 - _2ab) || \ + (_2ab < 0 && ((_b_a>=1 && (delta < b2 && delta > a2_b2 + _2ab)) || \ + (_b_a< 1 && (delta < b2 || delta < a2_b2 + _2ab))))) { \ double sqrt_delta = sqrt (delta); \ ADD ((-b - sqrt_delta) / a); \ ADD ((-b + sqrt_delta) / a); \ |