- Get rid of hDIBPalette in SURFACE structure
This allows more code cleanness

svn path=/branches/reactos-yarotows/; revision=47190
This commit is contained in:
Jérôme Gardou 2010-05-12 22:56:24 +00:00
parent 38a2853dc1
commit 421a63ff44
10 changed files with 45 additions and 86 deletions

View file

@ -35,11 +35,7 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
pebo->psurfTrg = pdc->dclevel.pSurface; pebo->psurfTrg = pdc->dclevel.pSurface;
ASSERT(pebo->psurfTrg); ASSERT(pebo->psurfTrg);
if (pebo->psurfTrg->hDIBPalette) if (pebo->psurfTrg->ppal)
{
pebo->ppalSurf = PALETTE_ShareLockPalette(pebo->psurfTrg->hDIBPalette);
}
else if (pebo->psurfTrg->ppal)
{ {
pebo->ppalSurf = pebo->psurfTrg->ppal; pebo->ppalSurf = pebo->psurfTrg->ppal;
GDIOBJ_IncrementShareCount(&pebo->ppalSurf->BaseObject); GDIOBJ_IncrementShareCount(&pebo->ppalSurf->BaseObject);

View file

@ -130,10 +130,6 @@ SURFACE_Cleanup(PVOID ObjectBody)
ExFreePool(psurf->SurfObj.pvBits); ExFreePool(psurf->SurfObj.pvBits);
} }
if (psurf->hDIBPalette != NULL)
{
GreDeleteObject(psurf->hDIBPalette);
}
} }
/* Free palette */ /* Free palette */

View file

@ -618,11 +618,7 @@ EXLATEOBJ_vInitXlateFromDCs(
return; return;
} }
if (psurfSrc->hDIBPalette) if (psurfSrc->ppal)
{
ppalSrc = PALETTE_ShareLockPalette(psurfSrc->hDIBPalette);
}
else if (psurfSrc->ppal)
{ {
ppalSrc = psurfSrc->ppal; ppalSrc = psurfSrc->ppal;
GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject); GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject);
@ -633,11 +629,7 @@ EXLATEOBJ_vInitXlateFromDCs(
if(!ppalSrc) if(!ppalSrc)
return; return;
if (psurfDst->hDIBPalette) if (psurfDst->ppal)
{
ppalDst = PALETTE_ShareLockPalette(psurfDst->hDIBPalette);
}
else if (psurfDst->ppal)
{ {
ppalDst = psurfDst->ppal; ppalDst = psurfDst->ppal;
GDIOBJ_IncrementShareCount(&ppalDst->BaseObject); GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
@ -697,7 +689,7 @@ EXLATEOBJ_vInitBrushXlate(
COLORREF crForegroundClr, COLORREF crForegroundClr,
COLORREF crBackgroundClr) COLORREF crBackgroundClr)
{ {
PPALETTE ppalDst, ppalPattern; PPALETTE ppalDst;
SURFACE *psurfPattern; SURFACE *psurfPattern;
ASSERT(pexlo); ASSERT(pexlo);
@ -707,11 +699,7 @@ EXLATEOBJ_vInitBrushXlate(
EXLATEOBJ_vInitTrivial(pexlo); EXLATEOBJ_vInitTrivial(pexlo);
if (psurfDst->hDIBPalette) if (psurfDst->ppal)
{
ppalDst = PALETTE_ShareLockPalette(psurfDst->hDIBPalette);
}
else if (psurfDst->ppal)
{ {
ppalDst = psurfDst->ppal; ppalDst = psurfDst->ppal;
GDIOBJ_IncrementShareCount(&ppalDst->BaseObject); GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
@ -766,11 +754,9 @@ EXLATEOBJ_vInitBrushXlate(
else else
{ {
/* Default: use the patterns' palette */ /* Default: use the patterns' palette */
ppalPattern = PALETTE_LockPalette(psurfPattern->hDIBPalette); if (psurfPattern->ppal)
if (ppalPattern)
{ {
EXLATEOBJ_vInitialize(pexlo, &gpalRGB, ppalDst, 0, 0, 0); EXLATEOBJ_vInitialize(pexlo, psurfPattern->ppal, ppalDst, 0, 0, 0);
PALETTE_UnlockPalette(ppalPattern);
} }
} }

View file

@ -37,7 +37,6 @@ typedef struct _SURFACE
DWORD dwOffset; DWORD dwOffset;
/* reactos specific */ /* reactos specific */
HPALETTE hDIBPalette;
DWORD dsBitfields[3]; // hack, should probably use palette instead DWORD dsBitfields[3]; // hack, should probably use palette instead
DWORD biClrUsed; DWORD biClrUsed;
DWORD biClrImportant; DWORD biClrImportant;

View file

@ -394,9 +394,7 @@ NtGdiTransparentBlt(
goto done; goto done;
} }
if (BitmapSrc->hDIBPalette) if (BitmapSrc->ppal)
PalSourceGDI = PALETTE_ShareLockPalette(BitmapSrc->hDIBPalette);
else if (BitmapSrc->ppal)
{ {
GDIOBJ_IncrementShareCount(&BitmapSrc->ppal->BaseObject); GDIOBJ_IncrementShareCount(&BitmapSrc->ppal->BaseObject);
PalSourceGDI = BitmapSrc->ppal ; PalSourceGDI = BitmapSrc->ppal ;

View file

@ -219,15 +219,17 @@ IntCreateCompatibleBitmap(
{ {
/* Copy the color table */ /* Copy the color table */
UINT Index; UINT Index;
PPALETTE PalGDI = PALETTE_LockPalette(psurf->hDIBPalette); PPALETTE PalGDI;
if (!PalGDI) if (!psurf->ppal)
{ {
ExFreePoolWithTag(bi, TAG_TEMP); ExFreePoolWithTag(bi, TAG_TEMP);
SetLastWin32Error(ERROR_INVALID_HANDLE); SetLastWin32Error(ERROR_INVALID_HANDLE);
return 0; return 0;
} }
PalGDI = PALETTE_LockPalette(psurf->ppal->BaseObject.hHmgr);
for (Index = 0; for (Index = 0;
Index < 256 && Index < PalGDI->NumColors; Index < 256 && Index < PalGDI->NumColors;
Index++) Index++)
@ -363,9 +365,7 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
if (psurf) if (psurf)
{ {
pso = &psurf->SurfObj; pso = &psurf->SurfObj;
if(psurf->hDIBPalette) if (psurf->ppal)
ppal = PALETTE_ShareLockPalette(psurf->hDIBPalette);
else if (psurf->ppal)
{ {
ppal = psurf->ppal; ppal = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppal->BaseObject); GDIOBJ_IncrementShareCount(&ppal->BaseObject);
@ -881,9 +881,7 @@ BITMAP_CopyBitmap(HBITMAP hBitmap)
ExFreePoolWithTag(buf,TAG_BITMAP); ExFreePoolWithTag(buf,TAG_BITMAP);
resBitmap->flFlags = Bitmap->flFlags; resBitmap->flFlags = Bitmap->flFlags;
/* Copy palette */ /* Copy palette */
if(Bitmap->hDIBPalette) if (Bitmap->ppal)
resBitmap->ppal = PALETTE_ShareLockPalette(Bitmap->hDIBPalette);
else if (Bitmap->ppal)
{ {
resBitmap->ppal = Bitmap->ppal ; resBitmap->ppal = Bitmap->ppal ;
GDIOBJ_IncrementShareCount(&Bitmap->ppal->BaseObject); GDIOBJ_IncrementShareCount(&Bitmap->ppal->BaseObject);

View file

@ -1,9 +1,9 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS win32 subsystem * PROJECT: ReactOS win32 subsystem
* PURPOSE: Functions for brushes * PURPOSE: Functions for brushes
* FILE: subsystem/win32/win32k/objects/brush.c * FILE: subsystem/win32/win32k/objects/brush.c
* PROGRAMER: * PROGRAMER:
*/ */
#include <win32k.h> #include <win32k.h>
@ -19,7 +19,7 @@ typedef struct _GDI_OBJ_ATTR_FREELIST
DWORD nEntries; DWORD nEntries;
PVOID AttrList[GDIOBJATTRFREE]; PVOID AttrList[GDIOBJATTRFREE];
} GDI_OBJ_ATTR_FREELIST, *PGDI_OBJ_ATTR_FREELIST; } GDI_OBJ_ATTR_FREELIST, *PGDI_OBJ_ATTR_FREELIST;
typedef struct _GDI_OBJ_ATTR_ENTRY typedef struct _GDI_OBJ_ATTR_ENTRY
{ {
RGN_ATTR Attr[GDIOBJATTRFREE]; RGN_ATTR Attr[GDIOBJATTRFREE];
@ -46,7 +46,7 @@ AllocateObjectAttr(VOID)
PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList; PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList;
PGDI_OBJ_ATTR_ENTRY pGdiObjAttrEntry; PGDI_OBJ_ATTR_ENTRY pGdiObjAttrEntry;
int i; int i;
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
if (pti->pgdiBrushAttr) if (pti->pgdiBrushAttr)
{ {
@ -127,9 +127,9 @@ FreeObjectAttr(PVOID pAttr)
PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList; PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList;
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
if (!pti) return; if (!pti) return;
if (!pti->pgdiBrushAttr) if (!pti->pgdiBrushAttr)
{ // If it is null, just cache it for the next time. { // If it is null, just cache it for the next time.
pti->pgdiBrushAttr = pAttr; pti->pgdiBrushAttr = pAttr;
@ -382,6 +382,7 @@ IntGdiCreateDIBBrush(
UINT PaletteEntryCount; UINT PaletteEntryCount;
PSURFACE psurfPattern; PSURFACE psurfPattern;
INT PaletteType; INT PaletteType;
HPALETTE hpal ;
if (BitmapInfo->bmiHeader.biSize < sizeof(BITMAPINFOHEADER)) if (BitmapInfo->bmiHeader.biSize < sizeof(BITMAPINFOHEADER))
{ {
@ -417,7 +418,10 @@ IntGdiCreateDIBBrush(
psurfPattern = SURFACE_LockSurface(hPattern); psurfPattern = SURFACE_LockSurface(hPattern);
ASSERT(psurfPattern != NULL); ASSERT(psurfPattern != NULL);
psurfPattern->hDIBPalette = BuildDIBPalette(BitmapInfo, &PaletteType); hpal = BuildDIBPalette(BitmapInfo, &PaletteType);
psurfPattern->ppal = PALETTE_ShareLockPalette(hpal);
/* Lazy delete palette, it will be freed when its shared reference is zeroed */
GreDeleteObject(hpal);
SURFACE_UnlockSurface(psurfPattern); SURFACE_UnlockSurface(psurfPattern);
pbrush = BRUSH_AllocBrushWithHandle(); pbrush = BRUSH_AllocBrushWithHandle();

View file

@ -109,14 +109,15 @@ IntSetDIBColorTable(
if (StartIndex + Entries > (1 << biBitCount)) if (StartIndex + Entries > (1 << biBitCount))
Entries = (1 << biBitCount) - StartIndex; Entries = (1 << biBitCount) - StartIndex;
PalGDI = PALETTE_LockPalette(psurf->hDIBPalette); if (psurf->ppal == NULL)
if (PalGDI == NULL)
{ {
DC_UnlockDc(dc); DC_UnlockDc(dc);
SetLastWin32Error(ERROR_INVALID_HANDLE); SetLastWin32Error(ERROR_INVALID_HANDLE);
return 0; return 0;
} }
PalGDI = PALETTE_LockPalette(psurf->ppal->BaseObject.hHmgr);
for (Index = StartIndex; for (Index = StartIndex;
Index < StartIndex + Entries && Index < PalGDI->NumColors; Index < StartIndex + Entries && Index < PalGDI->NumColors;
Index++) Index++)
@ -181,14 +182,15 @@ IntGetDIBColorTable(
if (StartIndex + Entries > (1 << biBitCount)) if (StartIndex + Entries > (1 << biBitCount))
Entries = (1 << biBitCount) - StartIndex; Entries = (1 << biBitCount) - StartIndex;
PalGDI = PALETTE_LockPalette(psurf->hDIBPalette); if (psurf->ppal == NULL)
if (PalGDI == NULL)
{ {
DC_UnlockDc(dc); DC_UnlockDc(dc);
SetLastWin32Error(ERROR_INVALID_HANDLE); SetLastWin32Error(ERROR_INVALID_HANDLE);
return 0; return 0;
} }
PalGDI = PALETTE_LockPalette(psurf->ppal->BaseObject.hHmgr);
for (Index = StartIndex; for (Index = StartIndex;
Index < StartIndex + Entries && Index < PalGDI->NumColors; Index < StartIndex + Entries && Index < PalGDI->NumColors;
Index++) Index++)
@ -276,12 +278,7 @@ IntSetDIBits(
return 0; return 0;
} }
// Use hDIBPalette if it exists if (bitmap->ppal)
if (bitmap->hDIBPalette)
{
ppalDDB = PALETTE_ShareLockPalette(bitmap->hDIBPalette);
}
else if (bitmap->ppal)
{ {
ppalDDB = bitmap->ppal; ppalDDB = bitmap->ppal;
GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject); GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject);
@ -523,11 +520,7 @@ NtGdiSetDIBitsToDeviceInternal(
} }
/* Obtain destination palette */ /* Obtain destination palette */
if (pSurf && pSurf->hDIBPalette) if (pSurf && pSurf->ppal)
{
ppalDDB = PALETTE_ShareLockPalette(pSurf->hDIBPalette);
}
else if (pSurf && pSurf->ppal)
{ {
ppalDDB = pSurf->ppal; ppalDDB = pSurf->ppal;
GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject); GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject);
@ -672,11 +665,7 @@ NtGdiGetDIBitsInternal(
return 0; return 0;
} }
if (psurf->hDIBPalette) if (psurf->ppal)
{
ppalSrc = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{ {
ppalSrc = psurf->ppal; ppalSrc = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject); GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject);
@ -1357,6 +1346,7 @@ DIB_CreateDIBSection(
SURFACE *bmp = NULL; SURFACE *bmp = NULL;
void *mapBits = NULL; void *mapBits = NULL;
PDC_ATTR pdcattr; PDC_ATTR pdcattr;
HPALETTE hpal ;
// Fill BITMAP32 structure with DIB data // Fill BITMAP32 structure with DIB data
BITMAPINFOHEADER *bi = &bmi->bmiHeader; BITMAPINFOHEADER *bi = &bmi->bmiHeader;
@ -1525,7 +1515,7 @@ DIB_CreateDIBSection(
ExFreePoolWithTag(lpRGB, TAG_COLORMAP); ExFreePoolWithTag(lpRGB, TAG_COLORMAP);
} }
SetLastWin32Error(ERROR_INVALID_HANDLE); SetLastWin32Error(ERROR_INVALID_HANDLE);
GreDeleteObject(bmp); GreDeleteObject(res);
return NULL; return NULL;
} }
@ -1554,16 +1544,20 @@ DIB_CreateDIBSection(
if (bi->biClrUsed != 0) if (bi->biClrUsed != 0)
{ {
bmp->hDIBPalette = PALETTE_AllocPaletteIndexedRGB(ColorCount, lpRGB); hpal = PALETTE_AllocPaletteIndexedRGB(ColorCount, lpRGB);
} }
else else
{ {
bmp->hDIBPalette = PALETTE_AllocPalette(PAL_BITFIELDS, 0, NULL, hpal = PALETTE_AllocPalette(PAL_BITFIELDS, 0, NULL,
dsBitfields[0], dsBitfields[0],
dsBitfields[1], dsBitfields[1],
dsBitfields[2]); dsBitfields[2]);
} }
bmp->ppal = PALETTE_ShareLockPalette(hpal);
/* Lazy delete hpal, it will be freed at surface release */
GreDeleteObject(hpal);
// Clean up in case of errors // Clean up in case of errors
if (!res || !bmp || !bm.bmBits) if (!res || !bmp || !bm.bmBits)
{ {

View file

@ -935,11 +935,7 @@ IntGdiGradientFill(
/* FIXME - psurf can be NULL!!! Don't assert but handle this case gracefully! */ /* FIXME - psurf can be NULL!!! Don't assert but handle this case gracefully! */
ASSERT(psurf); ASSERT(psurf);
if (psurf->hDIBPalette) if (psurf->ppal)
{
PalDestGDI = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{ {
PalDestGDI = psurf->ppal; PalDestGDI = psurf->ppal;
GDIOBJ_IncrementShareCount(&PalDestGDI->BaseObject); GDIOBJ_IncrementShareCount(&PalDestGDI->BaseObject);
@ -1142,11 +1138,7 @@ NtGdiExtFloodFill(
goto cleanup; goto cleanup;
} }
if (psurf->hDIBPalette) if (psurf->ppal)
{
ppal = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{ {
ppal = psurf->ppal; ppal = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppal->BaseObject); GDIOBJ_IncrementShareCount(&ppal->BaseObject);

View file

@ -3439,11 +3439,7 @@ GreExtTextOutW(
SurfObj = &psurf->SurfObj ; SurfObj = &psurf->SurfObj ;
/* Create the xlateobj */ /* Create the xlateobj */
if (psurf->hDIBPalette) if (psurf->ppal)
{
ppalDst = PALETTE_ShareLockPalette(psurf->hDIBPalette);
}
else if (psurf->ppal)
{ {
ppalDst = psurf->ppal; ppalDst = psurf->ppal;
GDIOBJ_IncrementShareCount(&ppalDst->BaseObject); GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);