winex11: Use the brush information passed in SelectBrush for pattern brushes.
This commit is contained in:
parent
0a189ffaf0
commit
265068974d
|
@ -209,15 +209,21 @@ static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color )
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* BRUSH_SelectPatternBrush
|
* BRUSH_SelectPatternBrush
|
||||||
*/
|
*/
|
||||||
static BOOL BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
|
static void BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, X_PHYSBITMAP *physBitmap )
|
||||||
{
|
{
|
||||||
BITMAP bitmap;
|
BITMAP bitmap;
|
||||||
X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( hbitmap );
|
|
||||||
|
|
||||||
if (!physBitmap || !GetObjectW( hbitmap, sizeof(bitmap), &bitmap )) return FALSE;
|
GetObjectW( hbitmap, sizeof(bitmap), &bitmap );
|
||||||
|
|
||||||
X11DRV_DIB_Lock( physBitmap, DIB_Status_GdiMod );
|
X11DRV_DIB_Lock( physBitmap, DIB_Status_GdiMod );
|
||||||
|
|
||||||
|
if (physDev->brush.pixmap)
|
||||||
|
{
|
||||||
|
wine_tsx11_lock();
|
||||||
|
XFreePixmap( gdi_display, physDev->brush.pixmap );
|
||||||
|
wine_tsx11_unlock();
|
||||||
|
}
|
||||||
|
|
||||||
if ((physDev->depth == 1) && (physBitmap->depth != 1))
|
if ((physDev->depth == 1) && (physBitmap->depth != 1))
|
||||||
{
|
{
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
|
@ -247,33 +253,26 @@ static BOOL BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
|
||||||
physDev->brush.fillStyle = FillOpaqueStippled;
|
physDev->brush.fillStyle = FillOpaqueStippled;
|
||||||
physDev->brush.pixel = -1; /* Special case (see DC_SetupGCForBrush) */
|
physDev->brush.pixel = -1; /* Special case (see DC_SetupGCForBrush) */
|
||||||
}
|
}
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* create a bitmap appropriate for the given DIB pattern brush */
|
||||||
/***********************************************************************
|
HBITMAP create_brush_bitmap( X11DRV_PDEVICE *physDev, const BITMAPINFO *info, void *bits, UINT usage )
|
||||||
* BRUSH_SelectDIBPatternBrush
|
|
||||||
*/
|
|
||||||
static BOOL BRUSH_SelectDIBPatternBrush( X11DRV_PDEVICE *physDev, const BITMAPINFO *info )
|
|
||||||
{
|
{
|
||||||
BOOL ret;
|
|
||||||
HDC memdc;
|
HDC memdc;
|
||||||
HBITMAP bitmap = CreateDIBitmap( physDev->dev.hdc, &info->bmiHeader, CBM_INIT,
|
int bpp = screen_bpp;
|
||||||
(LPBYTE)info + bitmap_info_size( info, DIB_RGB_COLORS ),
|
HBITMAP bitmap;
|
||||||
info, DIB_RGB_COLORS );
|
|
||||||
|
if (physDev->depth == 1 || info->bmiHeader.biBitCount == 1) bpp = 1;
|
||||||
|
bitmap = CreateBitmap( info->bmiHeader.biWidth, abs(info->bmiHeader.biHeight), 1, bpp, NULL );
|
||||||
|
if (!bitmap) return 0;
|
||||||
|
|
||||||
/* make sure it's owned by x11drv */
|
/* make sure it's owned by x11drv */
|
||||||
memdc = CreateCompatibleDC( physDev->dev.hdc );
|
memdc = CreateCompatibleDC( physDev->dev.hdc );
|
||||||
SelectObject( memdc, bitmap );
|
SelectObject( memdc, bitmap );
|
||||||
DeleteDC( memdc );
|
DeleteDC( memdc );
|
||||||
|
|
||||||
if ((ret = BRUSH_SelectPatternBrush( physDev, bitmap )))
|
SetDIBits( physDev->dev.hdc, bitmap, 0, abs(info->bmiHeader.biHeight), bits, info, usage );
|
||||||
{
|
return bitmap;
|
||||||
X_PHYSBITMAP *physBitmap = X11DRV_get_phys_bitmap( bitmap );
|
|
||||||
physBitmap->pixmap = 0; /* so it doesn't get freed */
|
|
||||||
}
|
|
||||||
DeleteObject( bitmap );
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -286,6 +285,24 @@ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
|
||||||
X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
|
X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
|
||||||
LOGBRUSH logbrush;
|
LOGBRUSH logbrush;
|
||||||
|
|
||||||
|
if (bitmap || info) /* pattern brush */
|
||||||
|
{
|
||||||
|
X_PHYSBITMAP *physbitmap;
|
||||||
|
BOOL delete_bitmap = FALSE;
|
||||||
|
|
||||||
|
if (!bitmap || !(physbitmap = X11DRV_get_phys_bitmap( bitmap )))
|
||||||
|
{
|
||||||
|
if (!(bitmap = create_brush_bitmap( physDev, info, bits, usage ))) return 0;
|
||||||
|
physbitmap = X11DRV_get_phys_bitmap( bitmap );
|
||||||
|
delete_bitmap = TRUE;
|
||||||
|
}
|
||||||
|
BRUSH_SelectPatternBrush( physDev, bitmap, physbitmap );
|
||||||
|
TRACE("BS_PATTERN\n");
|
||||||
|
physDev->brush.style = BS_PATTERN;
|
||||||
|
if (delete_bitmap) DeleteObject( bitmap );
|
||||||
|
return hbrush;
|
||||||
|
}
|
||||||
|
|
||||||
if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0;
|
if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0;
|
||||||
|
|
||||||
TRACE("hdc=%p hbrush=%p\n", dev->hdc, hbrush);
|
TRACE("hdc=%p hbrush=%p\n", dev->hdc, hbrush);
|
||||||
|
@ -321,16 +338,6 @@ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
physDev->brush.fillStyle = FillStippled;
|
physDev->brush.fillStyle = FillStippled;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_PATTERN:
|
|
||||||
TRACE("BS_PATTERN\n");
|
|
||||||
if (!BRUSH_SelectPatternBrush( physDev, (HBITMAP)logbrush.lbHatch )) return 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BS_DIBPATTERN:
|
|
||||||
TRACE("BS_DIBPATTERN\n");
|
|
||||||
if (!BRUSH_SelectDIBPatternBrush( physDev, (BITMAPINFO *)logbrush.lbHatch )) return 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return hbrush;
|
return hbrush;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue