diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c index eb0456d2a..57f5aa508 100644 --- a/src/cairo-win32-surface.c +++ b/src/cairo-win32-surface.c @@ -643,6 +643,33 @@ _cairo_win32_surface_composite (cairo_operator_t op, if (!integer_transform) return CAIRO_INT_STATUS_UNSUPPORTED; + /* Fix up src coordinates; the src coords and size must be within the + * bounds of the source surface. + * XXX the region not covered should be appropriately rendered! + * - for OVER/SOURCE with RGB24 source -> opaque black + * - for SOURCE with ARGB32 source -> 100% transparent black + */ + src_x += itx; + src_y += ity; + + if (src_x < 0) { + width += src_x; + dst_x -= src_x; + src_x = 0; + } + + if (src_y < 0) { + height += src_y; + dst_y -= src_y; + src_y = 0; + } + + if (src_x + width > src->extents.width) + width = src->extents.width - src_x; + + if (src_y + height > src->extents.height) + height = src->extents.height - src_y; + if (alpha == 255 && src->format == dst->format && (op == CAIRO_OPERATOR_SOURCE || @@ -652,7 +679,7 @@ _cairo_win32_surface_composite (cairo_operator_t op, dst_x, dst_y, width, height, src->dc, - src_x + itx, src_y + ity, + src_x, src_y, SRCCOPY)) return _cairo_win32_print_gdi_error ("_cairo_win32_surface_composite"); @@ -664,7 +691,7 @@ _cairo_win32_surface_composite (cairo_operator_t op, op == CAIRO_OPERATOR_OVER) { return _composite_alpha_blend (dst, src, alpha, - src_x + itx, src_y + ity, + src_x, src_y, dst_x, dst_y, width, height); }