1diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c 2--- a/gfx/cairo/cairo/src/cairo-win32-surface.c 3+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c 4@@ -928,16 +928,19 @@ _cairo_win32_surface_composite_inner (ca 5 return _composite_alpha_blend (dst, src, alpha, 6 src_r.x, src_r.y, src_r.width, src_r.height, 7 dst_r.x, dst_r.y, dst_r.width, dst_r.height); 8 } 9 10 return CAIRO_STATUS_SUCCESS; 11 } 12 13+/* from pixman-private.h */ 14+#define MOD(a,b) ((a) < 0 ? ((b) - ((-(a) - 1) % (b))) - 1 : (a) % (b)) 15+ 16 static cairo_int_status_t 17 _cairo_win32_surface_composite (cairo_operator_t op, 18 cairo_pattern_t *pattern, 19 cairo_pattern_t *mask_pattern, 20 void *abstract_dst, 21 int src_x, 22 int src_y, 23 int mask_x, 24@@ -1209,18 +1212,18 @@ _cairo_win32_surface_composite (cairo_op 25 /* If we need to repeat, we turn the repeated blit into 26 * a bunch of piece-by-piece blits. 27 */ 28 if (needs_repeat) { 29 cairo_rectangle_int_t piece_src_r, piece_dst_r; 30 uint32_t rendered_width = 0, rendered_height = 0; 31 uint32_t to_render_height, to_render_width; 32 int32_t piece_x, piece_y; 33- int32_t src_start_x = src_r.x % src_extents.width; 34- int32_t src_start_y = src_r.y % src_extents.height; 35+ int32_t src_start_x = MOD(src_r.x, src_extents.width); 36+ int32_t src_start_y = MOD(src_r.y, src_extents.height); 37 38 if (needs_scale) 39 goto UNSUPPORTED; 40 41 /* If both the src and dest have an image, we may as well fall 42 * back, because it will be faster than our separate blits. 43 * Our blit code will be fastest when the src is a DDB and the 44 * destination is a DDB. 45