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