- attach devinfo->hpalDefault to the pdevobj after enabling it
  - attach this palette to surfaces attached to this pdevobj through EngModifySurface
  - use this palette in several place
Partially fixes icon drawing after mode switch

svn path=/branches/reactos-yarotows/; revision=47137
This commit is contained in:
Jérôme Gardou 2010-05-08 22:10:41 +00:00
parent 3d533cb7a2
commit db93f2d307
10 changed files with 190 additions and 106 deletions

View file

@ -18,8 +18,6 @@ VOID
NTAPI
EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
{
HPALETTE hpal = NULL;
ASSERT(pebo);
ASSERT(pbrush);
ASSERT(pdc);
@ -35,12 +33,20 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
pebo->crCurrentText = pdc->pdcattr->crForegroundClr;
pebo->psurfTrg = pdc->dclevel.pSurface;
// ASSERT(pebo->psurfTrg); // FIXME: some dcs don't have a surface
ASSERT(pebo->psurfTrg);
if (pebo->psurfTrg->hDIBPalette)
{
pebo->ppalSurf = PALETTE_ShareLockPalette(pebo->psurfTrg->hDIBPalette);
}
else if (pebo->psurfTrg->ppal)
{
pebo->ppalSurf = pebo->psurfTrg->ppal;
GDIOBJ_IncrementShareCount(&pebo->ppalSurf->BaseObject);
}
else
pebo->ppalSurf = PALETTE_ShareLockPalette(pdc->ppdev->devinfo.hpalDefault);
if (pebo->psurfTrg)
hpal = pebo->psurfTrg->hDIBPalette;
if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
pebo->ppalSurf = PALETTE_ShareLockPalette(hpal);
if (!pebo->ppalSurf)
pebo->ppalSurf = &gpalRGB;

View file

@ -65,6 +65,12 @@ PDEVOBJ_vRelease(PPDEVOBJ ppdev)
ppdev->pfn.DisableSurface(ppdev->dhpdev);
}
/* Do we have a palette? */
if(ppdev->ppalSurf)
{
PALETTE_ShareUnlockPalette(ppdev->ppalSurf);
}
/* Disable PDEV */
ppdev->pfn.DisablePDEV(ppdev->dhpdev);
@ -133,6 +139,10 @@ PDEVOBJ_bEnablePDEV(
if (ppdev->gdiinfo.ulLogPixelsY == 0)
ppdev->gdiinfo.ulLogPixelsY = 96;
/* Setup Palette */
GDIOBJ_SetOwnership(ppdev->devinfo.hpalDefault, NULL);
ppdev->ppalSurf = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
DPRINT1("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev);
return TRUE;

View file

@ -136,6 +136,12 @@ SURFACE_Cleanup(PVOID ObjectBody)
}
}
/* Free palette */
if(psurf->ppal)
{
PALETTE_ShareUnlockPalette(psurf->ppal);
}
return TRUE;
}
@ -731,6 +737,9 @@ EngAssociateSurface(
/* Hook up specified functions */
psurf->flHooks = flHooks;
/* Get palette */
psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
SURFACE_UnlockSurface(psurf);
return TRUE;
@ -773,6 +782,9 @@ EngModifySurface(
/* Hook up specified functions */
psurf->flHooks = flHooks;
/* Get palette */
psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
SURFACE_UnlockSurface(psurf);
return TRUE;

View file

@ -603,7 +603,6 @@ EXLATEOBJ_vInitXlateFromDCs(
PDC pdcDst)
{
PSURFACE psurfDst, psurfSrc;
HPALETTE hpalSrc, hpalDst;
PPALETTE ppalSrc, ppalDst, ppalDstDc;
DPRINT("Enter EXLATEOBJ_vInitXlateFromDCs\n");
@ -619,18 +618,33 @@ EXLATEOBJ_vInitXlateFromDCs(
return;
}
hpalSrc = psurfSrc->hDIBPalette;
if (!hpalSrc)
hpalSrc = pPrimarySurface->devinfo.hpalDefault;
if (psurfSrc->hDIBPalette)
{
ppalSrc = PALETTE_ShareLockPalette(psurfSrc->hDIBPalette);
}
else if (psurfSrc->ppal)
{
ppalSrc = psurfSrc->ppal;
GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject);
}
else
ppalSrc = PALETTE_ShareLockPalette(pdcSrc->ppdev->devinfo.hpalDefault);
ppalSrc = PALETTE_ShareLockPalette(hpalSrc);
if (!ppalSrc)
if(!ppalSrc)
return;
hpalDst = psurfDst->hDIBPalette;
if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault;
if (psurfDst->hDIBPalette)
{
ppalDst = PALETTE_ShareLockPalette(psurfDst->hDIBPalette);
}
else if (psurfDst->ppal)
{
ppalDst = psurfDst->ppal;
GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
}
else
ppalDst = PALETTE_ShareLockPalette(pdcDst->ppdev->devinfo.hpalDefault);
ppalDst = PALETTE_ShareLockPalette(hpalDst);
if (!ppalDst)
{
PALETTE_ShareUnlockPalette(ppalSrc);
@ -683,7 +697,6 @@ EXLATEOBJ_vInitBrushXlate(
COLORREF crForegroundClr,
COLORREF crBackgroundClr)
{
HPALETTE hpalDst = NULL;
PPALETTE ppalDst, ppalPattern;
SURFACE *psurfPattern;
@ -694,9 +707,18 @@ EXLATEOBJ_vInitBrushXlate(
EXLATEOBJ_vInitTrivial(pexlo);
hpalDst = psurfDst->hDIBPalette;
if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault;
ppalDst = PALETTE_ShareLockPalette(hpalDst);
if (psurfDst->hDIBPalette)
{
ppalDst = PALETTE_ShareLockPalette(psurfDst->hDIBPalette);
}
else if (psurfDst->ppal)
{
ppalDst = psurfDst->ppal;
GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
}
else
ppalDst = PALETTE_ShareLockPalette(pPrimarySurface->devinfo.hpalDefault);
if (!ppalDst)
{
DPRINT1("No ppalDst!\n");

View file

@ -116,7 +116,7 @@ typedef struct _PDEVOBJ
// ULONG TagSig;
struct _LDEVOBJ * pldev;
DHPDEV dhpdev; /* DHPDEV for device. */
PVOID ppalSurf; /* PEPALOBJ/PPALETTE for this device. */
struct _PALETTE* ppalSurf; /* PEPALOBJ/PPALETTE for this device. */
DEVINFO devinfo;
GDIINFO gdiinfo;
PSURFACE pSurface; /* SURFACE for this device. */

View file

@ -328,9 +328,7 @@ NtGdiTransparentBlt(
PGDIOBJ apObj[2];
RECTL rcDest, rcSrc;
SURFACE *BitmapDest, *BitmapSrc = NULL;
HPALETTE SourcePalette = 0, DestPalette = 0;
PPALETTE PalDestGDI, PalSourceGDI;
USHORT PalDestMode, PalSrcMode;
PPALETTE PalSourceGDI;
ULONG TransparentColor = 0;
BOOL Ret = FALSE;
EXLATEOBJ exlo;
@ -396,42 +394,29 @@ NtGdiTransparentBlt(
goto done;
}
DestPalette = BitmapDest->hDIBPalette;
if (!DestPalette) DestPalette = pPrimarySurface->devinfo.hpalDefault;
if (BitmapSrc->hDIBPalette)
PalSourceGDI = PALETTE_ShareLockPalette(BitmapSrc->hDIBPalette);
else if (BitmapSrc->ppal)
{
GDIOBJ_IncrementShareCount(&BitmapSrc->ppal->BaseObject);
PalSourceGDI = BitmapSrc->ppal ;
}
else
PalSourceGDI = PALETTE_ShareLockPalette(pPrimarySurface->devinfo.hpalDefault) ;
SourcePalette = BitmapSrc->hDIBPalette;
if (!SourcePalette) SourcePalette = pPrimarySurface->devinfo.hpalDefault;
if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette)))
if(!PalSourceGDI)
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
goto done;
}
PalSrcMode = PalSourceGDI->Mode;
PALETTE_UnlockPalette(PalSourceGDI);
if(DestPalette != SourcePalette)
{
if (!(PalDestGDI = PALETTE_LockPalette(DestPalette)))
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
goto done;
}
PalDestMode = PalDestGDI->Mode;
PALETTE_UnlockPalette(PalDestGDI);
}
else
{
PalDestMode = PalSrcMode;
PalDestGDI = PalSourceGDI;
}
/* Translate Transparent (RGB) Color to the source palette */
EXLATEOBJ_vInitialize(&exlo, &gpalRGB, PalSourceGDI, 0, 0, 0);
TransparentColor = XLATEOBJ_iXlate(&exlo.xlo, (ULONG)TransColor);
EXLATEOBJ_vCleanup(&exlo);
PALETTE_ShareUnlockPalette(PalSourceGDI);
EXLATEOBJ_vInitialize(&exlo, PalSourceGDI, PalDestGDI, 0, 0, 0);
EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest);
Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
DCDest->rosdc.CombinedClip, &exlo.xlo, &rcDest, &rcSrc,

View file

@ -143,11 +143,23 @@ IntCreateCompatibleBitmap(
{
if (Dc->dctype != DC_TYPE_MEMORY)
{
PSURFACE psurf;
Bmp = IntGdiCreateBitmap(abs(Width),
abs(Height),
Dc->ppdev->gdiinfo.cPlanes,
Dc->ppdev->gdiinfo.cBitsPixel,
NULL);
/* Set palette */
psurf = SURFACE_LockSurface(Bmp);
if(!psurf)
{
DPRINT1("Could not lock surface?\n");
}
else
{
psurf->ppal = PALETTE_ShareLockPalette(Dc->ppdev->devinfo.hpalDefault);
SURFACE_UnlockSurface(psurf);
}
}
else
{
@ -334,7 +346,6 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
BOOL bInRect = FALSE;
SURFACE *psurf;
SURFOBJ *pso;
HPALETTE hpal = 0;
PPALETTE ppal;
EXLATEOBJ exlo;
HBITMAP hBmpTmp;
@ -362,9 +373,15 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
if (psurf)
{
pso = &psurf->SurfObj;
hpal = psurf->hDIBPalette;
if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
ppal = PALETTE_ShareLockPalette(hpal);
if(psurf->hDIBPalette)
ppal = PALETTE_ShareLockPalette(psurf->hDIBPalette);
else if (psurf->ppal)
{
ppal = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppal->BaseObject);
}
else
ppal = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
if (psurf->SurfObj.iBitmapFormat == BMF_1BPP && !psurf->hSecure)
{

View file

@ -230,7 +230,7 @@ IntSetDIBits(
EXLATEOBJ exlo;
PPALETTE ppalDDB, ppalDIB;
//RGBQUAD *lpRGB;
HPALETTE DDB_Palette, DIB_Palette;
HPALETTE DIB_Palette;
ULONG DIB_Palette_Type;
INT DIBWidth;
@ -279,15 +279,17 @@ IntSetDIBits(
// Use hDIBPalette if it exists
if (bitmap->hDIBPalette)
{
DDB_Palette = bitmap->hDIBPalette;
ppalDDB = PALETTE_ShareLockPalette(bitmap->hDIBPalette);
}
else if (bitmap->ppal)
{
ppalDDB = bitmap->ppal;
GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject);
}
else
{
// Destination palette obtained from the hDC
DDB_Palette = DC->ppdev->devinfo.hpalDefault;
}
ppalDDB = PALETTE_ShareLockPalette(DC->ppdev->devinfo.hpalDefault);
ppalDDB = PALETTE_LockPalette(DDB_Palette);
if (NULL == ppalDDB)
{
EngUnlockSurface(SourceSurf);
@ -304,6 +306,7 @@ IntSetDIBits(
EngUnlockSurface(SourceSurf);
EngDeleteSurface((HSURF)SourceBitmap);
SURFACE_UnlockSurface(bitmap);
PALETTE_ShareUnlockPalette(ppalDDB);
SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
return 0;
}
@ -336,7 +339,7 @@ IntSetDIBits(
// Clean up
EXLATEOBJ_vCleanup(&exlo);
PALETTE_UnlockPalette(ppalDIB);
PALETTE_UnlockPalette(ppalDDB);
PALETTE_ShareUnlockPalette(ppalDDB);
PALETTE_FreePaletteByHandle(DIB_Palette);
EngUnlockSurface(SourceSurf);
EngDeleteSurface((HSURF)SourceBitmap);
@ -441,7 +444,7 @@ NtGdiSetDIBitsToDeviceInternal(
SIZEL SourceSize;
EXLATEOBJ exlo;
PPALETTE ppalDDB = NULL, ppalDIB = NULL;
HPALETTE hpalDDB, hpalDIB = NULL;
HPALETTE hpalDIB = NULL;
ULONG DIBPaletteType;
if (!Bits) return 0;
@ -474,15 +477,7 @@ NtGdiSetDIBitsToDeviceInternal(
return 0;
}
/* Use destination palette obtained from the DC by default */
hpalDDB = pDC->ppdev->devinfo.hpalDefault;
/* Try to use hDIBPalette if it exists */
pSurf = pDC->dclevel.pSurface;
if (pSurf && pSurf->hDIBPalette)
{
hpalDDB = pSurf->hDIBPalette;
}
pDestSurf = pSurf ? &pSurf->SurfObj : NULL;
@ -528,7 +523,18 @@ NtGdiSetDIBitsToDeviceInternal(
}
/* Obtain destination palette */
ppalDDB = PALETTE_LockPalette(hpalDDB);
if (pSurf && pSurf->hDIBPalette)
{
ppalDDB = PALETTE_ShareLockPalette(pSurf->hDIBPalette);
}
else if (pSurf && pSurf->ppal)
{
ppalDDB = pSurf->ppal;
GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject);
}
else
ppalDDB = PALETTE_ShareLockPalette(pDC->ppdev->devinfo.hpalDefault);
if (!ppalDDB)
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
@ -547,7 +553,7 @@ NtGdiSetDIBitsToDeviceInternal(
/* Lock the DIB palette */
ppalDIB = PALETTE_LockPalette(hpalDIB);
if (!ppalDDB)
if (!ppalDIB)
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
Status = STATUS_UNSUCCESSFUL;
@ -558,7 +564,7 @@ NtGdiSetDIBitsToDeviceInternal(
EXLATEOBJ_vInitialize(&exlo, ppalDIB, ppalDDB, 0, 0, 0);
/* Copy the bits */
DPRINT("BitsToDev with dstsurf=(%d|%d) (%d|%d), src=(%d|%d) w=%d h=%d\n",
DPRINT("BitsToDev with dstsurf=(%d|%d) (%d|%d), src=(%d|%d) w=%d h=%d\n",
rcDest.left, rcDest.top, rcDest.right, rcDest.bottom,
ptSource.x, ptSource.y, SourceSize.cx, SourceSize.cy);
Status = IntEngBitBlt(pDestSurf,
@ -583,7 +589,7 @@ Exit:
}
if (ppalDIB) PALETTE_UnlockPalette(ppalDIB);
if (ppalDDB) PALETTE_UnlockPalette(ppalDDB);
if (ppalDDB) PALETTE_ShareUnlockPalette(ppalDDB);
if (pSourceSurf) EngUnlockSurface(pSourceSurf);
if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap);
@ -611,7 +617,6 @@ NtGdiGetDIBitsInternal(
PDC Dc;
SURFACE *psurf = NULL;
HBITMAP hDestBitmap = NULL;
HPALETTE hSourcePalette = NULL;
HPALETTE hDestPalette = NULL;
PPALETTE ppalSrc = NULL;
PPALETTE ppalDst = NULL;
@ -636,7 +641,7 @@ NtGdiGetDIBitsInternal(
_SEH2_TRY
{
ProbeForRead(&Info->bmiHeader.biSize, sizeof(DWORD), 1);
ProbeForWrite(Info, Info->bmiHeader.biSize, 1); // Comp for Core.
if (ChkBits) ProbeForWrite(ChkBits, MaxBits, 1);
}
@ -658,19 +663,31 @@ NtGdiGetDIBitsInternal(
DC_UnlockDc(Dc);
return 0;
}
DC_UnlockDc(Dc);
/* Get a pointer to the source bitmap object */
psurf = SURFACE_LockSurface(hBitmap);
if (psurf == NULL)
return 0;
hSourcePalette = psurf->hDIBPalette;
if (!hSourcePalette)
{
hSourcePalette = pPrimarySurface->devinfo.hpalDefault;
DC_UnlockDc(Dc);
return 0;
}
if (psurf->hDIBPalette)
{
ppalSrc = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{
ppalSrc = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject);
}
else
ppalSrc = PALETTE_ShareLockPalette(Dc->ppdev->devinfo.hpalDefault);
DC_UnlockDc(Dc);
ASSERT(ppalSrc != NULL);
ColorPtr = ((PBYTE)Info + Info->bmiHeader.biSize);
rgbQuads = (RGBQUAD *)ColorPtr;
@ -680,16 +697,12 @@ NtGdiGetDIBitsInternal(
Info->bmiHeader.biBitCount != 15 && Info->bmiHeader.biBitCount != 16) ||
!ChkBits)
{
hDestPalette = hSourcePalette;
ppalDst = ppalSrc;
bPaletteMatch = TRUE;
}
else
hDestPalette = BuildDIBPalette(Info, (PINT)&DestPaletteType); //hDestPalette = Dc->DevInfo->hpalDefault;
ppalSrc = PALETTE_LockPalette(hSourcePalette);
/* FIXME - ppalSrc can be NULL!!! Don't assert here! */
ASSERT(ppalSrc);
if (!bPaletteMatch)
{
ppalDst = PALETTE_LockPalette(hDestPalette);
@ -697,10 +710,6 @@ NtGdiGetDIBitsInternal(
DPRINT("ppalDst : %p\n", ppalDst);
ASSERT(ppalDst);
}
else
{
ppalDst = ppalSrc;
}
/* Copy palette. */
/* FIXME: This is largely incomplete. ATM no Core!*/
@ -970,7 +979,7 @@ NtGdiGetDIBitsInternal(
}
}
cleanup:
PALETTE_UnlockPalette(ppalSrc);
PALETTE_ShareUnlockPalette(ppalSrc);
if (hDestBitmap != NULL)
EngDeleteSurface((HSURF)hDestBitmap);

View file

@ -872,7 +872,6 @@ IntGdiGradientFill(
POINTL DitherOrg;
ULONG i;
BOOL Ret;
HPALETTE hDestPalette;
ASSERT(dc);
ASSERT(pVertex);
@ -936,10 +935,19 @@ IntGdiGradientFill(
/* FIXME - psurf can be NULL!!! Don't assert but handle this case gracefully! */
ASSERT(psurf);
hDestPalette = psurf->hDIBPalette;
if (!hDestPalette) hDestPalette = pPrimarySurface->devinfo.hpalDefault;
if (psurf->hDIBPalette)
{
PalDestGDI = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{
PalDestGDI = psurf->ppal;
GDIOBJ_IncrementShareCount(&PalDestGDI->BaseObject);
}
else
// Destination palette obtained from the hDC
PalDestGDI = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
PalDestGDI = PALETTE_LockPalette(hDestPalette);
EXLATEOBJ_vInitialize(&exlo, &gpalRGB, PalDestGDI, 0, 0, 0);
Ret = IntEngGradientFill(&psurf->SurfObj,
@ -956,7 +964,7 @@ IntGdiGradientFill(
EXLATEOBJ_vCleanup(&exlo);
if (PalDestGDI)
PALETTE_UnlockPalette(PalDestGDI);
PALETTE_ShareUnlockPalette(PalDestGDI);
return Ret;
}
@ -1089,7 +1097,6 @@ NtGdiExtFloodFill(
PDC dc;
PDC_ATTR pdcattr;
SURFACE *psurf = NULL;
HPALETTE hpal;
PPALETTE ppal;
EXLATEOBJ exlo;
BOOL Ret = FALSE;
@ -1135,9 +1142,18 @@ NtGdiExtFloodFill(
goto cleanup;
}
hpal = dc->dclevel.pSurface->hDIBPalette;
if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
ppal = PALETTE_ShareLockPalette(hpal);
if (psurf->hDIBPalette)
{
ppal = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{
ppal = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppal->BaseObject);
}
else
// Destination palette obtained from the hDC
ppal = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
EXLATEOBJ_vInitialize(&exlo, &gpalRGB, ppal, 0, 0xffffff, 0);

View file

@ -3168,7 +3168,6 @@ GreExtTextOutW(
BOOLEAN Render;
POINT Start;
BOOL DoBreak = FALSE;
HPALETTE hDestPalette;
PPALETTE ppalDst;
USHORT DxShift;
@ -3440,14 +3439,22 @@ GreExtTextOutW(
SurfObj = &psurf->SurfObj ;
/* Create the xlateobj */
hDestPalette = psurf->hDIBPalette;
if (!hDestPalette) hDestPalette = pPrimarySurface->devinfo.hpalDefault;
//if (!hDestPalette) hDestPalette = StockObjects[DEFAULT_PALETTE];//pPrimarySurface->devinfo.hpalDefault;
ppalDst = PALETTE_LockPalette(hDestPalette);
if (psurf->hDIBPalette)
{
ppalDst = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{
ppalDst = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
}
else
// Destination palette obtained from the hDC
ppalDst = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
ASSERT(ppalDst);
EXLATEOBJ_vInitialize(&exloRGB2Dst, &gpalRGB, ppalDst, 0, 0, 0);
EXLATEOBJ_vInitialize(&exloDst2RGB, ppalDst, &gpalRGB, 0, 0, 0);
PALETTE_UnlockPalette(ppalDst);
PALETTE_ShareUnlockPalette(ppalDst);
if ((fuOptions & ETO_OPAQUE) && (dc->pdcattr->ulDirty_ & DIRTY_BACKGROUND))
DC_vUpdateBackgroundBrush(dc) ;