1diff --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
5 	else
6 	    return FALSE;
7     } else {
8 	/* In the no-render case, we never have alpha */
9 	return FALSE;
10     }
11 }
12
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.
18  */
19 static cairo_bool_t
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)
24 {
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)
32+	return FALSE;
33+
34+    if (op == CAIRO_OPERATOR_OVER ||
35+	op == CAIRO_OPERATOR_IN ||
36+	op == CAIRO_OPERATOR_ATOP)
37+	return surfaces_have_alpha;
38
39     return TRUE;
40 }
41
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
47  */
48 static composite_operation_t
49 _recategorize_composite_operation (cairo_xlib_surface_t	      *dst,
50 				   cairo_operator_t	       op,
51 				   cairo_xlib_surface_t	      *src,
52 				   cairo_surface_attributes_t *src_attr,
53 				   cairo_bool_t		       have_mask)
54 {
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.)
58+     */
59     if (! have_mask &&
60         src->owns_pixmap &&
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)))
68     {
69 	if (src_attr->extend == CAIRO_EXTEND_NONE)
70 	    return DO_XCOPYAREA;
71
72 	if (dst->buggy_repeat && src_attr->extend == CAIRO_EXTEND_REPEAT)
73 	    return DO_XTILE;
74     }
75
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;
83     int				itx, ity;
84     cairo_bool_t		is_integer_translation;
85-    cairo_bool_t		needs_alpha_composite;
86     GC				gc;
87
88     if (mask_pattern != NULL && ! CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst))
89 	return UNSUPPORTED ("no support for masks");
90
91     operation = _categorize_composite_operation (dst, op, src_pattern,
92 						 mask_pattern != NULL);
93     if (operation == DO_UNSUPPORTED)
94 	return UNSUPPORTED ("unsupported operation");
95
96     X_DEBUG ((dst->dpy, "composite (dst=%x)", (unsigned int) dst->drawable));
97
98-    needs_alpha_composite =
99-	_operator_needs_alpha_composite (op,
100-					 _surface_has_alpha (dst),
101-					 ! _cairo_pattern_is_opaque (src_pattern));
102-
103     _cairo_xlib_display_notify (dst->display);
104
105     status =
106 	_cairo_xlib_surface_acquire_pattern_surfaces (dst,
107 						      src_pattern, mask_pattern,
108 						      src_x, src_y,
109 						      mask_x, mask_y,
110 						      width, height,
111