diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index 52a6b8c1c7b..7d8a20ca91c 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -85,11 +85,8 @@ DC_vUpdateFillBrush(PDC pdc) BRUSH_ShareUnlockBrush(pdc->dclevel.pbrFill); pdc->dclevel.pbrFill = pbrFill; - /* ROS HACK, should use surf xlate */ - IntUpdateBrushXlate(pdc, &pdc->rosdc.XlateBrush, pbrFill); - - /* Update eboFill, realizing it, if needed */ - EBRUSHOBJ_vUpdate(&pdc->eboFill, pbrFill, pdc->rosdc.XlateBrush); + /* Mark eboFill as dirty */ + pdcattr->ulDirty_ |= DIRTY_FILL; } else { @@ -98,12 +95,24 @@ DC_vUpdateFillBrush(PDC pdc) } } - /* ROS HACK, should use surf xlate */ - pxlo = pdc->rosdc.XlateBrush; + /* Check if the EBRUSHOBJ needs update */ + if (pdcattr->ulDirty_ & DIRTY_FILL) + { + pbrFill = pdc->dclevel.pbrFill; + + /* ROS HACK, should use surf xlate */ + IntUpdateBrushXlate(pdc, &pdc->rosdc.XlateBrush, pbrFill); + + /* Update eboFill, realizing it, if needed */ + EBRUSHOBJ_vUpdate(&pdc->eboFill, pbrFill, pdc->rosdc.XlateBrush); + } /* Check for DC brush */ if (pdcattr->hbrush == StockObjects[DC_BRUSH]) { + /* ROS HACK, should use surf xlate */ + pxlo = pdc->rosdc.XlateBrush; + /* Update the eboFill's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboFill, pdcattr->crPenClr, pxlo); } @@ -131,11 +140,8 @@ DC_vUpdateLineBrush(PDC pdc) BRUSH_ShareUnlockBrush(pdc->dclevel.pbrLine); pdc->dclevel.pbrLine = pbrLine; - /* ROS HACK, should use surf xlate */ - IntUpdateBrushXlate(pdc, &pdc->rosdc.XlatePen, pbrLine); - - /* Update eboLine, realizing it, if needed */ - EBRUSHOBJ_vUpdate(&pdc->eboLine, pbrLine, pdc->rosdc.XlatePen); + /* Mark eboLine as dirty */ + pdcattr->ulDirty_ |= DIRTY_LINE; } else { @@ -144,12 +150,24 @@ DC_vUpdateLineBrush(PDC pdc) } } - /* ROS HACK, should use surf xlate */ - pxlo = pdc->rosdc.XlatePen; + /* Check if the EBRUSHOBJ needs update */ + if (pdcattr->ulDirty_ & DIRTY_LINE) + { + pbrLine = pdc->dclevel.pbrLine; + + /* ROS HACK, should use surf xlate */ + IntUpdateBrushXlate(pdc, &pdc->rosdc.XlatePen, pbrLine); + + /* Update eboLine, realizing it, if needed */ + EBRUSHOBJ_vUpdate(&pdc->eboLine, pbrLine, pdc->rosdc.XlatePen); + } /* Check for DC pen */ if (pdcattr->hpen == StockObjects[DC_PEN]) { + /* ROS HACK, should use surf xlate */ + pxlo = pdc->rosdc.XlatePen; + /* Update the eboLine's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboLine, pdcattr->crPenClr, pxlo); } @@ -250,13 +268,13 @@ GdiSelectPalette( if ((pdc->rosdc.bitsPerPixel <= 8 && ppal->Mode == PAL_INDEXED) || (pdc->rosdc.bitsPerPixel > 8 && ppal->Mode != PAL_INDEXED)) { + /* Get old palette, set new one */ oldPal = pdc->dclevel.hpal; pdc->dclevel.hpal = hpal; - } - else if (pdc->rosdc.bitsPerPixel > 8 && ppal->Mode == PAL_INDEXED) - { - oldPal = pdc->dclevel.hpal; - pdc->dclevel.hpal = hpal; + + /* Mark the brushes invalid */ + pdc->pdcattr->ulDirty_ |= DIRTY_FILL | DIRTY_LINE | + DIRTY_BACKGROUND | DIRTY_TEXT; } PALETTE_UnlockPalette(ppal); @@ -382,7 +400,6 @@ NtGdiSelectBitmap( HBITMAP hOrgBmp; PSURFACE psurfBmp, psurfOld; HRGN hVisRgn; - PBRUSH pbrush; if (hDC == NULL || hBmp == NULL) return NULL; @@ -443,20 +460,8 @@ NtGdiSelectBitmap( /* Release the exclusive lock */ SURFACE_UnlockSurface(psurfBmp); - /* Regenerate the XLATEOBJs. (hack!) */ - pbrush = BRUSH_LockBrush(pdcattr->hbrush); - if (pbrush) - { - IntUpdateBrushXlate(pDC, &pDC->rosdc.XlateBrush, pbrush); - BRUSH_UnlockBrush(pbrush); - } - - pbrush = PEN_LockPen(pdcattr->hpen); - if (pbrush) - { - IntUpdateBrushXlate(pDC, &pDC->rosdc.XlatePen, pbrush); - PEN_UnlockPen(pbrush); - } + /* Mark the brushes invalid */ + pdcattr->ulDirty_ |= DIRTY_FILL | DIRTY_LINE; DC_UnlockDc(pDC); diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index 8112553cf54..52ac0822d3b 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -129,6 +129,9 @@ IntSetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, CONST RGBQUAD *Color else Entries = 0; + /* Mark the brushes invalid */ + dc->pdcattr->ulDirty_ |= DIRTY_FILL|DIRTY_LINE|DIRTY_BACKGROUND|DIRTY_TEXT; + SURFACE_UnlockSurface(psurf); DC_UnlockDc(dc); diff --git a/reactos/subsystems/win32/win32k/objects/fillshap.c b/reactos/subsystems/win32/win32k/objects/fillshap.c index b53b1946842..0722acf9a48 100644 --- a/reactos/subsystems/win32/win32k/objects/fillshap.c +++ b/reactos/subsystems/win32/win32k/objects/fillshap.c @@ -87,11 +87,11 @@ IntGdiPolygon(PDC dc, DestRect.bottom = max(DestRect.bottom, Points[CurrentPoint].y); } - if (pdcattr->ulDirty_ & DC_BRUSH_DIRTY) - IntGdiSelectBrush(dc,pdcattr->hbrush); + if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) + DC_vUpdateFillBrush(dc); - if (pdcattr->ulDirty_ & DC_PEN_DIRTY) - IntGdiSelectPen(dc,pdcattr->hpen); + if (pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY)) + DC_vUpdateLineBrush(dc); /* Special locking order to avoid lock-ups */ pbrFill = dc->dclevel.pbrFill; @@ -568,11 +568,11 @@ IntRectangle(PDC dc, DestRect.bottom--; } - if (pdcattr->ulDirty_ & DC_BRUSH_DIRTY) - IntGdiSelectBrush(dc,pdcattr->hbrush); + if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) + DC_vUpdateFillBrush(dc); - if (pdcattr->ulDirty_ & DC_PEN_DIRTY) - IntGdiSelectPen(dc,pdcattr->hpen); + if (pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY)) + DC_vUpdateLineBrush(dc); pbrFill = dc->dclevel.pbrFill; pbrLine = dc->dclevel.pbrLine;