1 diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c
2 --- a/gfx/cairo/cairo/src/cairo-xlib-surface.c
3 +++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c
4 @@ -1722,30 +1722,31 @@ _surface_has_alpha (cairo_xlib_surface_t
8 /* In the no-render case, we never have alpha */
13 -/* Returns true if the given operator and source-alpha combination
14 - * requires alpha compositing to complete.
15 +/* Returns true if the given operator and alpha combination requires alpha
16 + * compositing to complete on source and destination surfaces with the same
17 + * format. i.e. if a simple bitwise copy is not appropriate.
20 _operator_needs_alpha_composite (cairo_operator_t op,
21 - cairo_bool_t destination_has_alpha,
22 - cairo_bool_t source_has_alpha)
23 + cairo_bool_t surfaces_have_alpha)
25 - if (op == CAIRO_OPERATOR_SOURCE ||
26 - (! source_has_alpha &&
27 - (op == CAIRO_OPERATOR_OVER ||
28 - op == CAIRO_OPERATOR_ATOP ||
29 - op == CAIRO_OPERATOR_IN)))
30 - return destination_has_alpha;
31 + if (op == CAIRO_OPERATOR_SOURCE)
34 + if (op == CAIRO_OPERATOR_OVER ||
35 + op == CAIRO_OPERATOR_IN ||
36 + op == CAIRO_OPERATOR_ATOP)
37 + return surfaces_have_alpha;
42 /* There is a bug in most older X servers with compositing using a
43 * untransformed repeating source pattern when the source is in off-screen
44 * video memory, and another with repeated transformed images using a
45 * general transform matrix. When these bugs could be triggered, we need a
46 @@ -1843,24 +1844,24 @@ _categorize_composite_operation (cairo_x
48 static composite_operation_t
49 _recategorize_composite_operation (cairo_xlib_surface_t *dst,
51 cairo_xlib_surface_t *src,
52 cairo_surface_attributes_t *src_attr,
53 cairo_bool_t have_mask)
55 - /* Can we use the core protocol? */
56 + /* Can we use the core protocol? (If _surfaces_compatible, then src and
57 + * dst have the same format and _surface_has_alpha is the same for each.)
61 - src->depth == dst->depth &&
62 + _surfaces_compatible (src, dst) &&
63 _cairo_matrix_is_integer_translation (&src_attr->matrix, NULL, NULL) &&
64 - ! _operator_needs_alpha_composite (op,
65 - _surface_has_alpha (dst),
66 - _surface_has_alpha (src)))
67 + ! _operator_needs_alpha_composite (op, _surface_has_alpha (dst)))
69 if (src_attr->extend == CAIRO_EXTEND_NONE)
72 if (dst->buggy_repeat && src_attr->extend == CAIRO_EXTEND_REPEAT)
76 @@ -2211,34 +2212,28 @@ _cairo_xlib_surface_composite (cairo_ope
77 cairo_surface_attributes_t src_attr, mask_attr;
78 cairo_xlib_surface_t *dst = abstract_dst;
79 cairo_xlib_surface_t *src;
80 cairo_xlib_surface_t *mask;
81 cairo_int_status_t status;
82 composite_operation_t operation;
84 cairo_bool_t is_integer_translation;
85 - cairo_bool_t needs_alpha_composite;
88 if (mask_pattern != NULL && ! CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst))
89 return UNSUPPORTED ("no support for masks");
91 operation = _categorize_composite_operation (dst, op, src_pattern,
92 mask_pattern != NULL);
93 if (operation == DO_UNSUPPORTED)
94 return UNSUPPORTED ("unsupported operation");
96 X_DEBUG ((dst->dpy, "composite (dst=%x)", (unsigned int) dst->drawable));
98 - needs_alpha_composite =
99 - _operator_needs_alpha_composite (op,
100 - _surface_has_alpha (dst),
101 - ! _cairo_pattern_is_opaque (src_pattern));
103 _cairo_xlib_display_notify (dst->display);
106 _cairo_xlib_surface_acquire_pattern_surfaces (dst,
107 src_pattern, mask_pattern,