|
1 From b79ea8a6cab8bd28aebecf6e1e8229d5ac017264 Mon Sep 17 00:00:00 2001 |
|
2 From: Karl Tomlinson <karlt+@karlt.net> |
|
3 Date: Fri, 16 Jul 2010 23:46:25 +0000 |
|
4 Subject: clip: consider all_clipped in _cairo_clip_get_extents |
|
5 |
|
6 If the gstate clip in _cairo_gstate_int_clip_extents() has all_clipped |
|
7 set (and path NULL), then it returns the gstate target extents instead of |
|
8 an empty rectangle. If the target is infinite, then it says the clip is |
|
9 unbounded. |
|
10 |
|
11 Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29124 |
|
12 Tested-by test/get-clip |
|
13 |
|
14 Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> |
|
15 --- |
|
16 diff --git a/src/cairo-clip.c b/src/cairo-clip.c |
|
17 index f6173c6..77d8214 100644 |
|
18 --- a/src/cairo-clip.c |
|
19 +++ b/src/cairo-clip.c |
|
20 @@ -1264,9 +1264,14 @@ _cairo_clip_combine_with_surface (cairo_clip_t *clip, |
|
21 return CAIRO_STATUS_SUCCESS; |
|
22 } |
|
23 |
|
24 +static const cairo_rectangle_int_t _cairo_empty_rectangle_int = { 0, 0, 0, 0 }; |
|
25 + |
|
26 const cairo_rectangle_int_t * |
|
27 _cairo_clip_get_extents (const cairo_clip_t *clip) |
|
28 { |
|
29 + if (clip->all_clipped) |
|
30 + return &_cairo_empty_rectangle_int; |
|
31 + |
|
32 if (clip->path == NULL) |
|
33 return NULL; |
|
34 |
|
35 diff --git a/test/get-clip.c b/test/get-clip.c |
|
36 index 9d6e796..f0477a1 100644 |
|
37 --- a/test/get-clip.c |
|
38 +++ b/test/get-clip.c |
|
39 @@ -83,6 +83,8 @@ check_clip_extents (const cairo_test_context_t *ctx, |
|
40 cairo_clip_extents (cr, &ext_x1, &ext_y1, &ext_x2, &ext_y2); |
|
41 if (ext_x1 == x && ext_y1 == y && ext_x2 == x + width && ext_y2 == y + height) |
|
42 return 1; |
|
43 + if (width == 0.0 && height == 0.0 && ext_x1 == ext_x2 && ext_y1 == ext_y2) |
|
44 + return 1; |
|
45 cairo_test_log (ctx, "Error: %s; clip extents %f,%f,%f,%f should be %f,%f,%f,%f\n", |
|
46 message, ext_x1, ext_y1, ext_x2 - ext_x1, ext_y2 - ext_y1, |
|
47 x, y, width, height); |
|
48 @@ -138,7 +140,8 @@ preamble (cairo_test_context_t *ctx) |
|
49 cairo_save (cr); |
|
50 cairo_clip (cr); |
|
51 rectangle_list = cairo_copy_clip_rectangle_list (cr); |
|
52 - if (! check_count (ctx, phase, rectangle_list, 0)) |
|
53 + if (! check_count (ctx, phase, rectangle_list, 0) || |
|
54 + ! check_clip_extents (ctx, phase, cr, 0, 0, 0, 0)) |
|
55 { |
|
56 goto FAIL; |
|
57 } |
|
58 -- |
|
59 cgit v0.8.3-6-g21f6 |