- 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:
Timo Kreuzer
2009-04-05 23:51:27 +00:00
parent 07a533fe02
commit 421f167b4e
3 changed files with 50 additions and 42 deletions
@@ -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;