From 68ed40b6da242816a43cd68cc2c7feb779cf0acf Mon Sep 17 00:00:00 2001 From: Vladimir Vukicevic Date: Fri, 17 Feb 2006 23:24:06 -0800 Subject: [PATCH] Win32: Fix up src coords before calling AlphaBlend/BitBlt to avoid invalid calls Fixes up src coords and width/height before calling AlphaBlend/BitBlt; it's an error to try to use a region that extents outside of the source surface as a source DC. Doesn't repair the extra region relative to the operator -- e.g. regions outside of an ARGB source surface with SOURCE operator should be cleared to fully transparent black in the destination. (cherry picked from bc19c5b64b0e38e9d20045907d7b47d79f6afc60 commit) --- src/cairo-win32-surface.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) 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); }