Module: wine Branch: master Commit: d7ed2457b0c5a873f4ee2273b168e4b163839d16 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7ed2457b0c5a873f4ee2273b1...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Sep 7 22:54:49 2011 +0200
winex11: Make sure the bitmap of the brush pattern is owned by x11drv before getting its pixmap.
---
dlls/winex11.drv/brush.c | 43 +++++++++++++++++++++++++++++-------------- 1 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/dlls/winex11.drv/brush.c b/dlls/winex11.drv/brush.c index 6909d52..e16380a 100644 --- a/dlls/winex11.drv/brush.c +++ b/dlls/winex11.drv/brush.c @@ -252,14 +252,40 @@ static BOOL BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
/*********************************************************************** + * BRUSH_SelectDIBPatternBrush + */ +static BOOL BRUSH_SelectDIBPatternBrush( X11DRV_PDEVICE *physDev, HGLOBAL mem ) +{ + BOOL ret; + HDC memdc; + BITMAPINFO *info = GlobalLock( mem ); + HBITMAP bitmap = CreateDIBitmap( physDev->dev.hdc, &info->bmiHeader, CBM_INIT, + (LPBYTE)info + bitmap_info_size( info, DIB_RGB_COLORS ), + info, DIB_RGB_COLORS ); + + /* make sure it's owned by x11drv */ + memdc = CreateCompatibleDC( physDev->dev.hdc ); + SelectObject( memdc, bitmap ); + DeleteDC( memdc ); + + if ((ret = BRUSH_SelectPatternBrush( physDev, bitmap ))) + { + X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( bitmap ); + physBitmap->pixmap = 0; /* so it doesn't get freed */ + } + DeleteObject( bitmap ); + GlobalUnlock( mem ); + return ret; +} + + +/*********************************************************************** * SelectBrush (X11DRV.@) */ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush ) { X11DRV_PDEVICE *physDev = get_x11drv_dev( dev ); LOGBRUSH logbrush; - HBITMAP hBitmap; - BITMAPINFO * bmpInfo;
if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0;
@@ -304,18 +330,7 @@ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush )
case BS_DIBPATTERN: TRACE("BS_DIBPATTERN\n"); - if ((bmpInfo = GlobalLock( (HGLOBAL)logbrush.lbHatch ))) - { - int size = bitmap_info_size( bmpInfo, logbrush.lbColor ); - hBitmap = CreateDIBitmap( dev->hdc, &bmpInfo->bmiHeader, - CBM_INIT, ((char *)bmpInfo) + size, - bmpInfo, - (WORD)logbrush.lbColor ); - BRUSH_SelectPatternBrush( physDev, hBitmap ); - DeleteObject( hBitmap ); - GlobalUnlock( (HGLOBAL)logbrush.lbHatch ); - } - + if (!BRUSH_SelectDIBPatternBrush( physDev, (HGLOBAL)logbrush.lbHatch )) return 0; break; } return hbrush;