1From b79ea8a6cab8bd28aebecf6e1e8229d5ac017264 Mon Sep 17 00:00:00 2001
2From: Karl Tomlinson <karlt+@karlt.net>
3Date: Fri, 16 Jul 2010 23:46:25 +0000
4Subject: clip: consider all_clipped in _cairo_clip_get_extents
5
6If the gstate clip in _cairo_gstate_int_clip_extents() has all_clipped
7set (and path NULL), then it returns the gstate target extents instead of
8an empty rectangle.  If the target is infinite, then it says the clip is
9unbounded.
10
11Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29124
12Tested-by test/get-clip
13
14Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
15---
16diff --git a/src/cairo-clip.c b/src/cairo-clip.c
17index 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
35diff --git a/test/get-clip.c b/test/get-clip.c
36index 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--
59cgit v0.8.3-6-g21f6
60