michael@0: diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c michael@0: --- a/gfx/cairo/cairo/src/cairo-win32-surface.c michael@0: +++ b/gfx/cairo/cairo/src/cairo-win32-surface.c michael@0: @@ -928,16 +928,19 @@ _cairo_win32_surface_composite_inner (ca michael@0: return _composite_alpha_blend (dst, src, alpha, michael@0: src_r.x, src_r.y, src_r.width, src_r.height, michael@0: dst_r.x, dst_r.y, dst_r.width, dst_r.height); michael@0: } michael@0: michael@0: return CAIRO_STATUS_SUCCESS; michael@0: } michael@0: michael@0: +/* from pixman-private.h */ michael@0: +#define MOD(a,b) ((a) < 0 ? ((b) - ((-(a) - 1) % (b))) - 1 : (a) % (b)) michael@0: + michael@0: static cairo_int_status_t michael@0: _cairo_win32_surface_composite (cairo_operator_t op, michael@0: cairo_pattern_t *pattern, michael@0: cairo_pattern_t *mask_pattern, michael@0: void *abstract_dst, michael@0: int src_x, michael@0: int src_y, michael@0: int mask_x, michael@0: @@ -1209,18 +1212,18 @@ _cairo_win32_surface_composite (cairo_op michael@0: /* If we need to repeat, we turn the repeated blit into michael@0: * a bunch of piece-by-piece blits. michael@0: */ michael@0: if (needs_repeat) { michael@0: cairo_rectangle_int_t piece_src_r, piece_dst_r; michael@0: uint32_t rendered_width = 0, rendered_height = 0; michael@0: uint32_t to_render_height, to_render_width; michael@0: int32_t piece_x, piece_y; michael@0: - int32_t src_start_x = src_r.x % src_extents.width; michael@0: - int32_t src_start_y = src_r.y % src_extents.height; michael@0: + int32_t src_start_x = MOD(src_r.x, src_extents.width); michael@0: + int32_t src_start_y = MOD(src_r.y, src_extents.height); michael@0: michael@0: if (needs_scale) michael@0: goto UNSUPPORTED; michael@0: michael@0: /* If both the src and dest have an image, we may as well fall michael@0: * back, because it will be faster than our separate blits. michael@0: * Our blit code will be fastest when the src is a DDB and the michael@0: * destination is a DDB.