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)
This commit is contained in:
Vladimir Vukicevic 2006-02-17 23:24:06 -08:00 committed by Vladimir Vukicevic
parent 0852cd4492
commit 68ed40b6da

View file

@ -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);
}