gdi32: Overlapping rectangles are not allowed in GdiAlphaBlend.

This commit is contained in:
Alexandre Julliard 2011-10-14 18:22:50 +02:00
parent 6fd9d77426
commit b7a15ae7fa
2 changed files with 27 additions and 0 deletions

View File

@ -774,6 +774,14 @@ BOOL WINAPI GdiAlphaBlend(HDC hdcDst, int xDst, int yDst, int widthDst, int heig
SetLastError( ERROR_INVALID_PARAMETER );
ret = FALSE;
}
else if (dcSrc == dcDst && src.x + src.width > dst.x && src.x < dst.x + dst.width &&
src.y + src.height > dst.y && src.y < dst.y + dst.height)
{
WARN( "Overlapping coords: (%d,%d), %dx%d and (%d,%d), %dx%d\n",
src.x, src.y, src.width, src.height, dst.x, dst.y, dst.width, dst.height );
SetLastError( ERROR_INVALID_PARAMETER );
ret = FALSE;
}
else if (!ret) ret = dst_dev->funcs->pAlphaBlend( dst_dev, &dst, src_dev, &src, blendFunction );
release_dc_ptr( dcDst );

View File

@ -3279,6 +3279,25 @@ static void test_GdiAlphaBlend(void)
ok( !ret, "GdiAlphaBlend succeeded\n" );
ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
/* overlapping source and dest not allowed */
SetLastError(0xdeadbeef);
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcDst, 19, 19, 20, 20, blend);
ok( !ret, "GdiAlphaBlend succeeded\n" );
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
SetLastError(0xdeadbeef);
ret = pGdiAlphaBlend(hdcDst, 20, 20, 20, 20, hdcDst, 1, 1, 20, 20, blend);
ok( !ret, "GdiAlphaBlend succeeded\n" );
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
SetLastError(0xdeadbeef);
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcDst, 20, 10, 20, 20, blend);
ok( ret, "GdiAlphaBlend succeeded\n" );
SetLastError(0xdeadbeef);
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcDst, 10, 20, 20, 20, blend);
ok( ret, "GdiAlphaBlend succeeded\n" );
/* AC_SRC_ALPHA requires 32-bpp BI_RGB format */
blend.AlphaFormat = AC_SRC_ALPHA;