gdi32: Update pixel colours when the colour table changes.
This commit is contained in:
parent
78ab293d3f
commit
c5f41f89f3
|
@ -357,6 +357,37 @@ static void CDECL dibdrv_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip
|
||||||
return next->funcs->pSetDeviceClipping( next, vis_rgn, clip_rgn);
|
return next->funcs->pSetDeviceClipping( next, vis_rgn, clip_rgn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_masks( dibdrv_physdev *pdev, INT rop )
|
||||||
|
{
|
||||||
|
calc_and_xor_masks( rop, pdev->pen_color, &pdev->pen_and, &pdev->pen_xor );
|
||||||
|
update_brush_rop( pdev, rop );
|
||||||
|
if( GetBkMode( pdev->dev.hdc ) == OPAQUE )
|
||||||
|
calc_and_xor_masks( rop, pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* dibdrv_SetDIBColorTable
|
||||||
|
*/
|
||||||
|
static UINT CDECL dibdrv_SetDIBColorTable( PHYSDEV dev, UINT pos, UINT count, const RGBQUAD *colors )
|
||||||
|
{
|
||||||
|
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetDIBColorTable );
|
||||||
|
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
|
||||||
|
TRACE("(%p, %d, %d, %p)\n", dev, pos, count, colors);
|
||||||
|
|
||||||
|
if( pdev->dib.color_table && pos < pdev->dib.color_table_size )
|
||||||
|
{
|
||||||
|
if( pos + count > pdev->dib.color_table_size ) count = pdev->dib.color_table_size - pos;
|
||||||
|
memcpy( pdev->dib.color_table + pos, colors, count * sizeof(RGBQUAD) );
|
||||||
|
|
||||||
|
pdev->pen_color = pdev->dib.funcs->colorref_to_pixel( &pdev->dib, pdev->pen_colorref );
|
||||||
|
pdev->brush_color = pdev->dib.funcs->colorref_to_pixel( &pdev->dib, pdev->brush_colorref );
|
||||||
|
pdev->bkgnd_color = pdev->dib.funcs->colorref_to_pixel( &pdev->dib, GetBkColor( dev->hdc ) );
|
||||||
|
|
||||||
|
update_masks( pdev, GetROP2( dev->hdc ) );
|
||||||
|
}
|
||||||
|
return next->funcs->pSetDIBColorTable( next, pos, count, colors );
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* dibdrv_SetROP2
|
* dibdrv_SetROP2
|
||||||
*/
|
*/
|
||||||
|
@ -365,10 +396,7 @@ static INT CDECL dibdrv_SetROP2( PHYSDEV dev, INT rop )
|
||||||
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetROP2 );
|
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetROP2 );
|
||||||
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
|
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
|
||||||
|
|
||||||
calc_and_xor_masks(rop, pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
|
update_masks( pdev, rop );
|
||||||
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 );
|
return next->funcs->pSetROP2( next, rop );
|
||||||
}
|
}
|
||||||
|
@ -462,7 +490,7 @@ const DC_FUNCTIONS dib_driver =
|
||||||
dibdrv_SetBkMode, /* pSetBkMode */
|
dibdrv_SetBkMode, /* pSetBkMode */
|
||||||
dibdrv_SetDCBrushColor, /* pSetDCBrushColor */
|
dibdrv_SetDCBrushColor, /* pSetDCBrushColor */
|
||||||
dibdrv_SetDCPenColor, /* pSetDCPenColor */
|
dibdrv_SetDCPenColor, /* pSetDCPenColor */
|
||||||
NULL, /* pSetDIBColorTable */
|
dibdrv_SetDIBColorTable, /* pSetDIBColorTable */
|
||||||
NULL, /* pSetDIBits */
|
NULL, /* pSetDIBits */
|
||||||
NULL, /* pSetDIBitsToDevice */
|
NULL, /* pSetDIBitsToDevice */
|
||||||
dibdrv_SetDeviceClipping, /* pSetDeviceClipping */
|
dibdrv_SetDeviceClipping, /* pSetDeviceClipping */
|
||||||
|
|
|
@ -868,6 +868,7 @@ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen )
|
||||||
if (hpen == GetStockObject( DC_PEN ))
|
if (hpen == GetStockObject( DC_PEN ))
|
||||||
logpen.lopnColor = GetDCPenColor( dev->hdc );
|
logpen.lopnColor = GetDCPenColor( dev->hdc );
|
||||||
|
|
||||||
|
pdev->pen_colorref = logpen.lopnColor;
|
||||||
pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logpen.lopnColor);
|
pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logpen.lopnColor);
|
||||||
calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
|
calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
|
||||||
|
|
||||||
|
@ -919,6 +920,7 @@ COLORREF CDECL dibdrv_SetDCPenColor( PHYSDEV dev, COLORREF color )
|
||||||
|
|
||||||
if (GetCurrentObject(dev->hdc, OBJ_PEN) == GetStockObject( DC_PEN ))
|
if (GetCurrentObject(dev->hdc, OBJ_PEN) == GetStockObject( DC_PEN ))
|
||||||
{
|
{
|
||||||
|
pdev->pen_colorref = color;
|
||||||
pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, color);
|
pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, color);
|
||||||
calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
|
calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
|
||||||
}
|
}
|
||||||
|
@ -1102,6 +1104,7 @@ HBRUSH CDECL dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush )
|
||||||
switch(logbrush.lbStyle)
|
switch(logbrush.lbStyle)
|
||||||
{
|
{
|
||||||
case BS_SOLID:
|
case BS_SOLID:
|
||||||
|
pdev->brush_colorref = logbrush.lbColor;
|
||||||
pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logbrush.lbColor);
|
pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logbrush.lbColor);
|
||||||
calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
|
calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
|
||||||
pdev->brush_rects = solid_brush;
|
pdev->brush_rects = solid_brush;
|
||||||
|
@ -1152,6 +1155,7 @@ COLORREF CDECL dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color )
|
||||||
|
|
||||||
if (GetCurrentObject(dev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH ))
|
if (GetCurrentObject(dev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH ))
|
||||||
{
|
{
|
||||||
|
pdev->brush_colorref = color;
|
||||||
pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, color);
|
pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, color);
|
||||||
calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
|
calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,6 +118,7 @@ typedef struct dibdrv_physdev
|
||||||
DWORD defer;
|
DWORD defer;
|
||||||
|
|
||||||
/* pen */
|
/* pen */
|
||||||
|
COLORREF pen_colorref;
|
||||||
DWORD pen_color, pen_and, pen_xor;
|
DWORD pen_color, pen_and, pen_xor;
|
||||||
dash_pattern pen_pattern;
|
dash_pattern pen_pattern;
|
||||||
dash_pos dash_pos;
|
dash_pos dash_pos;
|
||||||
|
@ -126,6 +127,7 @@ typedef struct dibdrv_physdev
|
||||||
/* brush */
|
/* brush */
|
||||||
UINT brush_style;
|
UINT brush_style;
|
||||||
INT brush_rop; /* PatBlt, for example, can override the DC's rop2 */
|
INT brush_rop; /* PatBlt, for example, can override the DC's rop2 */
|
||||||
|
COLORREF brush_colorref;
|
||||||
DWORD brush_color, brush_and, brush_xor;
|
DWORD brush_color, brush_and, brush_xor;
|
||||||
dib_info brush_dib;
|
dib_info brush_dib;
|
||||||
void *brush_and_bits, *brush_xor_bits;
|
void *brush_and_bits, *brush_xor_bits;
|
||||||
|
|
Loading…
Reference in New Issue