From c1d03118e17a7f16281e2e0ddbb9d6d63eaa07b5 Mon Sep 17 00:00:00 2001 From: Sergey Khodych Date: Tue, 4 Nov 2008 19:59:34 +0200 Subject: BitBlt returns TRUE when drawing outside of clipping or visible region (with test). --- dlls/gdi32/tests/bitmap.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ dlls/winex11.drv/bitblt.c | 4 ++- 2 files changed, 49 insertions(+), 1 deletions(-) diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c index 7607667..fd2c823 100644 --- a/dlls/gdi32/tests/bitmap.c +++ b/dlls/gdi32/tests/bitmap.c @@ -2189,6 +2189,51 @@ void test_GdiAlphaBlend() } +void test_clipping() +{ + HBITMAP bmpDst; + HBITMAP oldDst; + HBITMAP bmpSrc; + HBITMAP oldSrc; + HRGN hRgn; + LPVOID bits; + BOOL result; + + HDC hdcDst = CreateCompatibleDC( NULL ); + HDC hdcSrc = CreateCompatibleDC( NULL ); + + BITMAPINFO bmpinfo={{0}}; + bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmpinfo.bmiHeader.biWidth = 100; + bmpinfo.bmiHeader.biHeight = 100; + bmpinfo.bmiHeader.biPlanes = 1; + bmpinfo.bmiHeader.biBitCount = GetDeviceCaps( hdcDst, BITSPIXEL ); + bmpinfo.bmiHeader.biCompression = BI_RGB; + + bmpDst = CreateDIBSection( hdcDst, &bmpinfo, DIB_RGB_COLORS, &bits, NULL, 0 ); + ok(bmpDst != NULL, "Couldn't create destination bitmap\n"); + oldDst = (HBITMAP)SelectObject( hdcDst, bmpDst ); + + bmpSrc = CreateDIBSection( hdcSrc, &bmpinfo, DIB_RGB_COLORS, &bits, NULL, 0 ); + ok(bmpSrc != NULL, "Couldn't create source bitmap\n"); + oldSrc = (HBITMAP)SelectObject( hdcSrc, bmpSrc ); + + result = BitBlt( hdcDst, 0, 0, 100, 100, hdcSrc, 100, 100, SRCCOPY ); + ok(result, "BitBlt failed\n"); + + hRgn = CreateRectRgn( 0,0,0,0 ); + SelectClipRgn( hdcDst, hRgn ); + + result = BitBlt( hdcDst, 0, 0, 100, 100, hdcSrc, 0, 0, SRCCOPY ); + ok(result, "BitBlt failed\n"); + + DeleteObject( bmpDst ); + DeleteObject( bmpSrc ); + DeleteObject( hRgn ); + DeleteDC( hdcDst ); + DeleteDC( hdcSrc ); +} + START_TEST(bitmap) { HMODULE hdll; @@ -2214,4 +2259,5 @@ START_TEST(bitmap) test_GdiAlphaBlend(); test_bitmapinfoheadersize(); test_get16dibits(); + test_clipping(); } diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index c740b10..b02b9e4 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -1685,8 +1685,10 @@ BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst, /* Perform basic clipping */ if (!BITBLT_GetVisRectangles( physDevDst, xDst, yDst, width, height, physDevSrc, xSrc, ySrc, width, height, - &visRectSrc, &visRectDst )) + &visRectSrc, &visRectDst )){ + result = TRUE; goto END; + } xSrc = visRectSrc.left; ySrc = visRectSrc.top; -- 1.5.3.3