diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 9e971775b4e..5273b293da6 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -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 */ diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index d61e4c8ec13..695eff0fcca 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -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