summaryrefslogtreecommitdiff
path: root/src/cairo-spline.c
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2008-12-28 01:59:12 -0500
committerBehdad Esfahbod <behdad@behdad.org>2008-12-28 01:59:12 -0500
commit3292f9906b3637564c37863dde5d214b0fee2885 (patch)
treef20a2d782646ec03ad1523af658f5b34d51bf2de /src/cairo-spline.c
parentefe4d2ce99e65f9841951d3ff3e0536973bfb12c (diff)
downloadcairo-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.c27
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); \
+ } \
} \
}