Rename PALETTE_AllocPalette2 to PALETTE_AllocPalette, allocate PALETTE and color array in one allocation, improve code

svn path=/trunk/; revision=56514
This commit is contained in:
Timo Kreuzer 2012-05-05 17:29:34 +00:00
parent 80a53d624f
commit f067d3a67c
2 changed files with 61 additions and 52 deletions

View file

@ -145,62 +145,81 @@ VOID FASTCALL PALETTE_ValidateFlags(PALETTEENTRY* lpPalE, INT size)
lpPalE[i].peFlags = PC_SYS_USED | (lpPalE[i].peFlags & 0x07); lpPalE[i].peFlags = PC_SYS_USED | (lpPalE[i].peFlags & 0x07);
} }
PPALETTE PPALETTE
NTAPI NTAPI
PALETTE_AllocPalette2(ULONG Mode, PALETTE_AllocPalette(
ULONG NumColors, _In_ ULONG iMode,
ULONG *Colors, _In_ ULONG cColors,
ULONG Red, _In_ PULONG pulColors,
ULONG Green, _In_ FLONG flRed,
ULONG Blue) _In_ FLONG flGreen,
_In_ FLONG flBlue)
{ {
PPALETTE PalGDI; PPALETTE ppal;
ULONG fl = 0, cjSize = sizeof(PALETTE);
PalGDI = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE, /* Check if the palette has entries */
sizeof(PALETTE), if (iMode == PAL_INDEXED)
BASEFLAG_LOOKASIDE); {
if (!PalGDI) /* Check color count */
if ((cColors == 0) || (cColors > 1024)) return NULL;
/* Allocate enough space for the palete entries */
cjSize += cColors * sizeof(PALETTEENTRY);
}
else
{
/* There are no palette entries */
cColors = 0;
/* We can use the lookaside list */
fl |= BASEFLAG_LOOKASIDE;
}
/* Allocate the object (without a handle!) */
ppal = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE, cjSize, fl);
if (!ppal)
{ {
DPRINT1("Could not allocate a palette.\n");
return NULL; return NULL;
} }
PalGDI->flFlags = Mode; /* Set mode, color count and entry pointer */
ppal->flFlags = iMode;
ppal->NumColors = cColors;
ppal->IndexedColors = ppal->apalColors;
if (NumColors > 0) /* Check what kind of palette this is */
if (iMode & PAL_INDEXED)
{ {
PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool, /* Check if we got a color array */
sizeof(PALETTEENTRY) * NumColors, if (pulColors)
TAG_PALETTE);
if (NULL == PalGDI->IndexedColors)
{ {
GDIOBJ_vDeleteObject(&PalGDI->BaseObject); /* Copy the entries */
return NULL; RtlCopyMemory(ppal->IndexedColors,
pulColors,
cColors * sizeof(ULONG));
} }
if (Colors) RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors); }
else if (iMode & PAL_BITFIELDS)
{
/* Copy the color masks */
ppal->RedMask = flRed;
ppal->GreenMask = flGreen;
ppal->BlueMask = flBlue;
/* Check what masks we have and set optimization flags */
if ((flRed == 0x7c00) && (flGreen == 0x3E0) && (flBlue == 0x1F))
ppal->flFlags |= PAL_RGB16_555;
else if ((flRed == 0xF800) && (flGreen == 0x7E0) && (flBlue == 0x1F))
ppal->flFlags |= PAL_RGB16_565;
else if ((flRed == 0xFF0000) && (flGreen == 0xFF00) && (flBlue == 0xFF))
ppal->flFlags |= PAL_BGR;
else if ((flRed == 0xFF) && (flGreen == 0xFF00) && (flBlue == 0xFF0000))
ppal->flFlags |= PAL_RGB;
} }
if (Mode & PAL_INDEXED) return ppal;
{
PalGDI->NumColors = NumColors;
}
else if (Mode & PAL_BITFIELDS)
{
PalGDI->RedMask = Red;
PalGDI->GreenMask = Green;
PalGDI->BlueMask = Blue;
if (Red == 0x7c00 && Green == 0x3E0 && Blue == 0x1F)
PalGDI->flFlags |= PAL_RGB16_555;
else if (Red == 0xF800 && Green == 0x7E0 && Blue == 0x1F)
PalGDI->flFlags |= PAL_RGB16_565;
else if (Red == 0xFF0000 && Green == 0xFF00 && Blue == 0xFF)
PalGDI->flFlags |= PAL_BGR;
else if (Red == 0xFF && Green == 0xFF00 && Blue == 0xFF0000)
PalGDI->flFlags |= PAL_RGB;
}
return PalGDI;
} }
PPALETTE PPALETTE
@ -216,7 +235,7 @@ PALETTE_AllocPalWithHandle(
PPALETTE ppal; PPALETTE ppal;
/* Allocate the palette without a handle */ /* Allocate the palette without a handle */
ppal = PALETTE_AllocPalette2(iMode, cColors, pulColors, flRed, flGreen, flBlue); ppal = PALETTE_AllocPalette(iMode, cColors, pulColors, flRed, flGreen, flBlue);
if (!ppal) return NULL; if (!ppal) return NULL;
/* Insert the palette into the handle table */ /* Insert the palette into the handle table */
@ -384,7 +403,7 @@ EngCreatePalette(
PPALETTE ppal; PPALETTE ppal;
HPALETTE hpal; HPALETTE hpal;
ppal = PALETTE_AllocPalette2(iMode, cColors, pulColors, flRed, flGreen, flBlue); ppal = PALETTE_AllocPalette(iMode, cColors, pulColors, flRed, flGreen, flBlue);
if (!ppal) return NULL; if (!ppal) return NULL;
hpal = GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_PUBLIC); hpal = GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_PUBLIC);

View file

@ -59,7 +59,7 @@ InitPaletteImpl(VOID);
PPALETTE PPALETTE
NTAPI NTAPI
PALETTE_AllocPalette2( PALETTE_AllocPalette(
_In_ ULONG iMode, _In_ ULONG iMode,
_In_ ULONG cColors, _In_ ULONG cColors,
_In_ PULONG pulColors, _In_ PULONG pulColors,
@ -146,13 +146,3 @@ GreCreatePaletteInternal(
IN LPLOGPALETTE pLogPal, IN LPLOGPALETTE pLogPal,
IN UINT cEntries); IN UINT cEntries);
////
HPALETTE
FASTCALL
PALETTE_AllocPalette(ULONG Mode,
ULONG NumColors,
ULONG *Colors,
ULONG Red,
ULONG Green,
ULONG Blue);