diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 8bff54a175..7f12076c4e 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -2186,7 +2186,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, return false; } - const HDC hdcSrc = GetHdcOf(*implSrc); + HDC hdcSrc = GetHdcOf(*implSrc); // if either the source or destination has alpha channel, we must use // AlphaBlt() as other function don't handle it correctly @@ -2243,6 +2243,16 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, return false; } + // Most of the operations involve the source or the pattern, but a few of + // them (and only those few, no other are possible) only use destination + // HDC. For them we must not give a valid source HDC to MaskBlt() as it + // still uses it, somehow, and the result is garbage. + if ( dwRop == BLACKNESS || dwRop == WHITENESS || + dwRop == DSTINVERT || dwRop == DSTCOPY ) + { + hdcSrc = NULL; + } + bool success = false; if (useMask)