PDC NTAPI DC_AllocDcWithHandle() { PDC pdc; pdc = (PDC)GDIOBJ_AllocateObject(GDIObjType_DC_TYPE, sizeof(DC), BASEFLAG_LOOKASIDE); if (!pdc) { DPRINT1("Could not allocate a DC.\n"); return NULL; } if (!GDIOBJ_hInsertObject(&pdc->BaseObject, GDI_OBJ_HMGR_POWNED)) { DPRINT1("Could not insert DC into handle table.\n"); GDIOBJ_vFreeObject(&pdc->BaseObject); return NULL; } pdc->pdcattr = &pdc->dcattr; return pdc; }
PPALETTE NTAPI PALETTE_AllocPalette2(ULONG Mode, ULONG NumColors, ULONG *Colors, ULONG Red, ULONG Green, ULONG Blue) { PPALETTE PalGDI; PalGDI = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE, sizeof(PALETTE), BASEFLAG_LOOKASIDE); if (!PalGDI) { DPRINT1("Could not allocate a palette.\n"); return NULL; } PalGDI->Self = PalGDI->BaseObject.hHmgr; PalGDI->flFlags = Mode; if (NULL != Colors) { PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool, sizeof(PALETTEENTRY) * NumColors, TAG_PALETTE); if (NULL == PalGDI->IndexedColors) { GDIOBJ_vDeleteObject(&PalGDI->BaseObject); return NULL; } RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors); } if (Mode & PAL_INDEXED) { 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; }
HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, CONST RGBQUAD *Colors) { HPALETTE NewPalette; PPALETTE PalGDI; UINT i; PalGDI = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE, sizeof(PALETTE), BASEFLAG_LOOKASIDE); if (!PalGDI) { DPRINT1("Could not allocate a palette.\n"); return NULL; } if (!GDIOBJ_hInsertObject(&PalGDI->BaseObject, GDI_OBJ_HMGR_POWNED)) { DPRINT1("Could not insert palette into handle table.\n"); GDIOBJ_vFreeObject(&PalGDI->BaseObject); return NULL; } NewPalette = PalGDI->BaseObject.hHmgr; PalGDI->Self = NewPalette; PalGDI->flFlags = PAL_INDEXED; PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool, sizeof(PALETTEENTRY) * NumColors, TAG_PALETTE); if (NULL == PalGDI->IndexedColors) { GDIOBJ_vDeleteObject(&PalGDI->BaseObject); return NULL; } for (i = 0; i < NumColors; i++) { PalGDI->IndexedColors[i].peRed = Colors[i].rgbRed; PalGDI->IndexedColors[i].peGreen = Colors[i].rgbGreen; PalGDI->IndexedColors[i].peBlue = Colors[i].rgbBlue; PalGDI->IndexedColors[i].peFlags = 0; } PalGDI->NumColors = NumColors; PALETTE_UnlockPalette(PalGDI); return NewPalette; }
PPALETTE NTAPI PALETTE_AllocPalette( _In_ ULONG iMode, _In_ ULONG cColors, _In_opt_ const PALETTEENTRY* pEntries, _In_ FLONG flRed, _In_ FLONG flGreen, _In_ FLONG flBlue) { PPALETTE ppal; ULONG fl = 0, cjSize = sizeof(PALETTE); /* Check if the palette has entries */ if (iMode & PAL_INDEXED) { /* 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) { return NULL; } /* Set mode, color count and entry pointer */ ppal->flFlags = iMode; ppal->NumColors = cColors; ppal->IndexedColors = ppal->apalColors; /* Check what kind of palette this is */ if (iMode & PAL_INDEXED) { /* Check if we got a color array */ if (pEntries) { /* Copy the entries */ RtlCopyMemory(ppal->IndexedColors, pEntries, cColors * sizeof(pEntries[0])); } } 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; } return ppal; }