summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Muizelaar <jmuizelaar@mozilla.com>2010-11-05 11:40:00 -0400
committerJeff Muizelaar <jmuizelaar@mozilla.com>2010-11-05 11:40:00 -0400
commite9bb70d2dee4ef7a54e3971f09a08df30c2b5287 (patch)
tree905e60cb696a41fad498ef68f7ae7313306578b5
parent91a6fe64236985d30f5794d760698deafd9e6511 (diff)
downloadcairo-e9bb70d2dee4ef7a54e3971f09a08df30c2b5287.tar.gz
Fix degenerate vertical path bounds.
6b77567b6ef28710c7707ab82c7fa95c810152d1 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
-rw-r--r--src/cairo-path-bounds.c4
-rw-r--r--test/get-path-extents.c40
2 files changed, 35 insertions, 9 deletions
diff --git a/src/cairo-path-bounds.c b/src/cairo-path-bounds.c
index d32c2607f..75308c6ec 100644
--- a/src/cairo-path-bounds.c
+++ b/src/cairo-path-bounds.c
@@ -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);
diff --git a/test/get-path-extents.c b/test/get-path-extents.c
index a3e9554d1..3a05eff7a 100644
--- a/test/get-path-extents.c
+++ b/test/get-path-extents.c
@@ -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:
@@ -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);
@@ -191,7 +189,7 @@ 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);
@@ -199,7 +197,33 @@ draw (cairo_t *cr, int width, int height)
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);