Skip to content

Commit

Permalink
Fix degenerate vertical path bounds.
Browse files Browse the repository at this point in the history
6b77567 made vertical
path bounds with no area return extents of 0,0. This fixes
the problem by not assuming degenerate path bounds are 0,0
  • Loading branch information
Jeff Muizelaar committed Nov 5, 2010
1 parent 91a6fe6 commit e9bb70d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 9 deletions.
4 changes: 3 additions & 1 deletion src/cairo-path-bounds.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,9 @@ _cairo_path_fixed_extents (const cairo_path_fixed_t *path,

if (! path->has_curve_to) {
*box = path->extents;
return path->extents.p1.x < path->extents.p2.x;
/* empty extents should still have an origin and should not
* be {0, 0, 0, 0} */
return path->extents.p1.x <= path->extents.p2.x;
}

_cairo_path_bounder_init (&bounder);
Expand Down
40 changes: 32 additions & 8 deletions test/get-path-extents.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,6 @@ check_extents (const cairo_test_context_t *ctx,
if (cairo_status (cr))
return 1;

/* let empty rects match */
if ((ext_x1 == ext_x2 || ext_y1 == ext_y2) && (width == 0 || height == 0))
return 1;

switch (relation) {
default:
case EQUALS:
Expand Down Expand Up @@ -152,14 +148,16 @@ draw (cairo_t *cr, int width, int height)
phase = "Degenerate arc (R=0)";
errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0);
errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0);
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0);
/*XXX: I'd expect these extents to be oriented at 200, 400 */
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 0, 0, 0, 0);

cairo_new_path (cr2);
cairo_arc (cr2, 200, 400, 10., 0, 0);
phase = "Degenerate arc (Θ=0)";
errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0);
errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0);
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0);
/*XXX: I'd expect these extents to be oriented at 200, 400 */
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 0, 0, 0, 0);

cairo_new_path (cr2);
cairo_restore (cr2);
Expand Down Expand Up @@ -191,15 +189,41 @@ draw (cairo_t *cr, int width, int height)
cairo_restore (cr2);

/* http://bugs.freedesktop.org/show_bug.cgi?id=7965 */
phase = "A vertical, open path";
phase = "A horizontal, open path";
cairo_save (cr2);
cairo_set_line_cap (cr2, CAIRO_LINE_CAP_ROUND);
cairo_set_line_join (cr2, CAIRO_LINE_JOIN_ROUND);
cairo_move_to (cr2, 0, 180);
cairo_line_to (cr2, 750, 180);
errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0);
errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, -5, 175, 760, 10);
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 0, 180, 755, 0);
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 0, 180, 750, 0);
cairo_new_path (cr2);
cairo_restore (cr2);

phase = "A vertical, open path";
cairo_save (cr2);
cairo_set_line_cap (cr2, CAIRO_LINE_CAP_ROUND);
cairo_set_line_join (cr2, CAIRO_LINE_JOIN_ROUND);
cairo_new_path (cr2);
cairo_move_to (cr2, 180, 0);
cairo_line_to (cr2, 180, 750);
errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0);
errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 175, -5, 10, 760);
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 180, 0, 0, 750);
cairo_new_path (cr2);
cairo_restore (cr2);

phase = "A degenerate open path";
cairo_save (cr2);
cairo_set_line_cap (cr2, CAIRO_LINE_CAP_ROUND);
cairo_set_line_join (cr2, CAIRO_LINE_JOIN_ROUND);
cairo_new_path (cr2);
cairo_move_to (cr2, 180, 0);
cairo_line_to (cr2, 180, 0);
errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0);
errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 175, -5, 10, 10);
errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 180, 0, 0, 0);
cairo_new_path (cr2);
cairo_restore (cr2);

Expand Down

0 comments on commit e9bb70d

Please sign in to comment.