diff --git a/ChangeLog b/ChangeLog index c1d3154d6..fa7d3e0bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-07-09 Carl Worth + + * src/cairo_gstate.c (_cairo_gstate_arc_dir): Fix numerical + problem that could lead to infinite loops. + 2004-07-09 Dave Beckett * autogen.sh: Require automake 1.7 (and thus aclocal 1.7) which diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index cad3b15e1..dbe923275 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -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; } diff --git a/src/cairo_gstate.c b/src/cairo_gstate.c index cad3b15e1..dbe923275 100644 --- a/src/cairo_gstate.c +++ b/src/cairo_gstate.c @@ -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; }