summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/handle-multi-path-clip.patch
blob: fe426888564c106e8239831bfe612c91f3a7c405 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c
--- a/gfx/cairo/cairo/src/cairo-image-surface.c
+++ b/gfx/cairo/cairo/src/cairo-image-surface.c
@@ -2885,16 +2885,18 @@ static cairo_status_t
     cairo_bool_t need_clip_mask = FALSE;
     cairo_status_t status;
     struct _cairo_boxes_chunk *chunk;
     uint32_t pixel;
     int i;
 
     if (clip != NULL) {
 	status = _cairo_clip_get_region (clip, &clip_region);
+	if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO))
+	    return CAIRO_STATUS_SUCCESS;
 	need_clip_mask = status == CAIRO_INT_STATUS_UNSUPPORTED;
 	if (need_clip_mask &&
 	    (op == CAIRO_OPERATOR_SOURCE || ! extents->is_bounded))
 	{
 	    return CAIRO_INT_STATUS_UNSUPPORTED;
 	}
 
 	if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1)
@@ -3200,30 +3202,20 @@ static cairo_status_t
     return _clip_and_composite (dst, op, src,
 				_composite_traps, &info,
 				extents, clip);
 }
 
 static cairo_clip_path_t *
 _clip_get_single_path (cairo_clip_t *clip)
 {
-    cairo_clip_path_t *iter = clip->path;
-    cairo_clip_path_t *path = NULL;
-
-    do {
-	if ((iter->flags & CAIRO_CLIP_PATH_IS_BOX) == 0) {
-	    if (path != NULL)
-		return FALSE;
-
-	    path = iter;
-	}
-	iter = iter->prev;
-    } while (iter != NULL);
-
-    return path;
+    if (clip->path->prev == NULL)
+      return clip->path;
+
+    return NULL;
 }
 
 /* high level image interface */
 
 static cairo_int_status_t
 _cairo_image_surface_paint (void			*abstract_surface,
 			    cairo_operator_t		 op,
 			    const cairo_pattern_t	*source,