mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
- Update the EBRUSHOBJ independent of changing the brush/pen handle in DC_vUpdateFill/LineBrush
- Mark the brushes as dirty after change of surface, palette and DIB colot table - Update the EBURHOBJs on demand in IntGdiPolygon and IntRectangle - Fixes bug 4340 See issue #4340 for more details. svn path=/trunk/; revision=40381
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user