gdi32: Keep track of the background colour.

oldstable
Huw Davies 2011-05-06 11:21:13 +01:00 committed by Alexandre Julliard
parent 4c859de0a8
commit 572e0f01df
2 changed files with 47 additions and 2 deletions

View File

@ -142,6 +142,46 @@ static HBITMAP CDECL dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
return next->funcs->pSelectBitmap( next, bitmap );
}
/***********************************************************************
* dibdrv_SetBkColor
*/
static COLORREF CDECL dibdrv_SetBkColor( PHYSDEV dev, COLORREF color )
{
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkColor );
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
pdev->bkgnd_color = pdev->dib.funcs->colorref_to_pixel( &pdev->dib, color );
if( GetBkMode(dev->hdc) == OPAQUE )
calc_and_xor_masks( GetROP2(dev->hdc), pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor );
else
{
pdev->bkgnd_and = ~0u;
pdev->bkgnd_xor = 0;
}
return next->funcs->pSetBkColor( next, color );
}
/***********************************************************************
* dibdrv_SetBkMode
*/
static INT CDECL dibdrv_SetBkMode( PHYSDEV dev, INT mode )
{
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkMode );
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
if( mode == OPAQUE )
calc_and_xor_masks( GetROP2(dev->hdc), pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor );
else
{
pdev->bkgnd_and = ~0u;
pdev->bkgnd_xor = 0;
}
return next->funcs->pSetBkMode( next, mode );
}
/***********************************************************************
* dibdrv_SetDeviceClipping
*/
@ -165,6 +205,8 @@ static INT CDECL dibdrv_SetROP2( PHYSDEV dev, INT rop )
calc_and_xor_masks(rop, pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
update_brush_rop(pdev, rop);
if( GetBkMode(dev->hdc) == OPAQUE )
calc_and_xor_masks(rop, pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor);
return next->funcs->pSetROP2( next, rop );
}
@ -254,8 +296,8 @@ const DC_FUNCTIONS dib_driver =
dibdrv_SelectPen, /* pSelectPen */
NULL, /* pSetArcDirection */
NULL, /* pSetBitmapBits */
NULL, /* pSetBkColor */
NULL, /* pSetBkMode */
dibdrv_SetBkColor, /* pSetBkColor */
dibdrv_SetBkMode, /* pSetBkMode */
dibdrv_SetDCBrushColor, /* pSetDCBrushColor */
dibdrv_SetDCPenColor, /* pSetDCPenColor */
NULL, /* pSetDIBColorTable */

View File

@ -108,6 +108,9 @@ typedef struct dibdrv_physdev
UINT brush_style;
DWORD brush_color, brush_and, brush_xor;
BOOL (* brush_rects)(struct dibdrv_physdev *pdev, int num, RECT *rects);
/* background */
DWORD bkgnd_color, bkgnd_and, bkgnd_xor;
} dibdrv_physdev;
#define DEFER_FORMAT 1