Fix numerical problem that could lead to infinite loops.

This commit is contained in:
Carl Worth 2004-07-09 13:47:46 +00:00
parent 63468474d7
commit d7a392bf30
3 changed files with 15 additions and 8 deletions

View file

@ -1,3 +1,8 @@
2004-07-09 Carl Worth <cworth@isi.edu>
* src/cairo_gstate.c (_cairo_gstate_arc_dir): Fix numerical
problem that could lead to infinite loops.
2004-07-09 Dave Beckett <Dave.Beckett@bristol.ac.uk>
* autogen.sh: Require automake 1.7 (and thus aclocal 1.7) which

View file

@ -879,25 +879,26 @@ _cairo_gstate_arc_dir (cairo_gstate_t *gstate,
/* Recurse if drawing arc larger than pi */
if (angle_max - angle_min > M_PI) {
double angle_mid = angle_min + (angle_max - angle_min) / 2.0;
/* XXX: Something tells me this block could be condensed. */
if (dir == CAIRO_DIRECTION_FORWARD) {
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min, angle_min + M_PI, dir);
angle_min, angle_mid, dir);
if (status)
return status;
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min + M_PI, angle_max, dir);
angle_mid, angle_max, dir);
if (status)
return status;
} else {
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min + M_PI, angle_max, dir);
angle_mid, angle_max, dir);
if (status)
return status;
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min, angle_min + M_PI, dir);
angle_min, angle_mid, dir);
if (status)
return status;
}

View file

@ -879,25 +879,26 @@ _cairo_gstate_arc_dir (cairo_gstate_t *gstate,
/* Recurse if drawing arc larger than pi */
if (angle_max - angle_min > M_PI) {
double angle_mid = angle_min + (angle_max - angle_min) / 2.0;
/* XXX: Something tells me this block could be condensed. */
if (dir == CAIRO_DIRECTION_FORWARD) {
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min, angle_min + M_PI, dir);
angle_min, angle_mid, dir);
if (status)
return status;
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min + M_PI, angle_max, dir);
angle_mid, angle_max, dir);
if (status)
return status;
} else {
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min + M_PI, angle_max, dir);
angle_mid, angle_max, dir);
if (status)
return status;
status = _cairo_gstate_arc_dir (gstate, xc, yc, radius,
angle_min, angle_min + M_PI, dir);
angle_min, angle_mid, dir);
if (status)
return status;
}