mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-02-18 06:00:47 +01:00
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:
parent
0852cd4492
commit
68ed40b6da
1 changed files with 29 additions and 2 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue