summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/handle-multi-path-clip.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/cairo/handle-multi-path-clip.patch')
-rw-r--r--gfx/cairo/handle-multi-path-clip.patch57
1 files changed, 57 insertions, 0 deletions
diff --git a/gfx/cairo/handle-multi-path-clip.patch b/gfx/cairo/handle-multi-path-clip.patch
new file mode 100644
index 000000000..fe4268885
--- /dev/null
+++ b/gfx/cairo/handle-multi-path-clip.patch
@@ -0,0 +1,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,