diff --git a/graphics/x11drv/bitblt.c b/graphics/x11drv/bitblt.c index fc146d768f1..922d02366d7 100644 --- a/graphics/x11drv/bitblt.c +++ b/graphics/x11drv/bitblt.c @@ -1043,9 +1043,10 @@ static BOOL32 BITBLT_GetVisRectangles( DC *dcDst, INT32 xDst, INT32 yDst, SetRect32( &rect, xSrc, ySrc, xSrc + widthSrc, ySrc + heightSrc ); if (widthSrc < 0) SWAP_INT32( &rect.left, &rect.right ); if (heightSrc < 0) SWAP_INT32( &rect.top, &rect.bottom ); - /* Apparently the clip region is only for output, so use hVisRgn here */ - GetRgnBox32( dcSrc->w.hVisRgn, &clipRect ); - if (!IntersectRect32( visRectSrc, &rect, &clipRect )) return FALSE; + /* Apparently the clipping and visible regions are only for output, + so just check against totalExtent here to avoid BadMatch errors */ + if (!IntersectRect32( visRectSrc, &rect, &dcSrc->w.totalExtent )) + return FALSE; /* Intersect the rectangles */ diff --git a/graphics/x11drv/bitmap.c b/graphics/x11drv/bitmap.c index d9aa9816e8f..96694579dee 100644 --- a/graphics/x11drv/bitmap.c +++ b/graphics/x11drv/bitmap.c @@ -54,6 +54,11 @@ HBITMAP32 X11DRV_BITMAP_SelectObject( DC * dc, HBITMAP32 hbitmap, if (!(dc->w.flags & DC_MEMORY)) return 0; + dc->w.totalExtent.left = 0; + dc->w.totalExtent.top = 0; + dc->w.totalExtent.right = bmp->bitmap.bmWidth; + dc->w.totalExtent.bottom = bmp->bitmap.bmHeight; + if (dc->w.hVisRgn) SetRectRgn32( dc->w.hVisRgn, 0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight ); diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c index 89c29361938..5b2ad9e6309 100644 --- a/graphics/x11drv/init.c +++ b/graphics/x11drv/init.c @@ -178,8 +178,13 @@ static BOOL32 X11DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, physDev->drawable = bmp->pixmap; physDev->gc = TSXCreateGC( display, physDev->drawable, 0, NULL ); dc->w.bitsPerPixel = bmp->bitmap.bmBitsPixel; - dc->w.hVisRgn = CreateRectRgn32( 0, 0, bmp->bitmap.bmWidth, - bmp->bitmap.bmHeight ); + + dc->w.totalExtent.left = 0; + dc->w.totalExtent.top = 0; + dc->w.totalExtent.right = bmp->bitmap.bmWidth; + dc->w.totalExtent.bottom = bmp->bitmap.bmHeight; + dc->w.hVisRgn = CreateRectRgnIndirect32( &dc->w.totalExtent ); + GDI_HEAP_UNLOCK( dc->w.hBitmap ); } else @@ -187,7 +192,12 @@ static BOOL32 X11DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, physDev->drawable = rootWindow; physDev->gc = TSXCreateGC( display, physDev->drawable, 0, NULL ); dc->w.bitsPerPixel = screenDepth; - dc->w.hVisRgn = CreateRectRgn32( 0, 0, screenWidth, screenHeight); + + dc->w.totalExtent.left = 0; + dc->w.totalExtent.top = 0; + dc->w.totalExtent.right = screenWidth; + dc->w.totalExtent.bottom = screenHeight; + dc->w.hVisRgn = CreateRectRgnIndirect32( &dc->w.totalExtent ); } if (!dc->w.hVisRgn) diff --git a/include/gdi.h b/include/gdi.h index 073ffec721f..09e1a83a75e 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -122,6 +122,7 @@ typedef struct short breakExtra; /* breakTotalExtra / breakCount */ short breakRem; /* breakTotalExtra % breakCount */ + RECT32 totalExtent; BYTE bitsPerPixel; INT32 MapMode; diff --git a/objects/dc.c b/objects/dc.c index 230f50291c5..ad75904f532 100644 --- a/objects/dc.c +++ b/objects/dc.c @@ -528,6 +528,7 @@ HDC16 WINAPI GetDCState( HDC16 hdc ) newdc->w.hFirstBitmap = dc->w.hFirstBitmap; newdc->w.hDevice = dc->w.hDevice; newdc->w.hPalette = dc->w.hPalette; + newdc->w.totalExtent = dc->w.totalExtent; newdc->w.bitsPerPixel = dc->w.bitsPerPixel; newdc->w.ROPmode = dc->w.ROPmode; newdc->w.polyFillMode = dc->w.polyFillMode; @@ -613,6 +614,7 @@ void WINAPI SetDCState( HDC16 hdc, HDC16 hdcs ) dc->w.devCaps = dcs->w.devCaps; dc->w.hFirstBitmap = dcs->w.hFirstBitmap; dc->w.hDevice = dcs->w.hDevice; + dc->w.totalExtent = dcs->w.totalExtent; dc->w.ROPmode = dcs->w.ROPmode; dc->w.polyFillMode = dcs->w.polyFillMode; dc->w.stretchBltMode = dcs->w.stretchBltMode;