Alexandre Julliard : gdi32: Overlapping rectangles are not allowed in GdiAlphaBlend.
Alexandre Julliard
julliard at winehq.org
Fri Oct 14 14:14:49 CDT 2011
Module: wine
Branch: master
Commit: b7a15ae7faa0541bbaf55074413e4c176ed4f852
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7a15ae7faa0541bbaf55074413e4c176ed4f852
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Oct 14 18:22:50 2011 +0200
gdi32: Overlapping rectangles are not allowed in GdiAlphaBlend.
---
dlls/gdi32/bitblt.c | 8 ++++++++
dlls/gdi32/tests/bitmap.c | 19 +++++++++++++++++++
2 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index e03a5c1..eee6fa2 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -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 );
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index e069fa8..32fabb8 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -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;
More information about the wine-cvs
mailing list