HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode, ULONG NumColors, ULONG *Colors, ULONG Red, ULONG Green, ULONG Blue) { PPALETTE ppal; HPALETTE hpal; ppal = PALETTE_AllocPalette2(Mode, NumColors, Colors, Red, Green, Blue); if (!ppal) return NULL; hpal = GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_POWNED); if (!hpal) { DPRINT1("Could not insert palette into handle table.\n"); GDIOBJ_vFreeObject(&ppal->BaseObject); return NULL; } PALETTE_UnlockPalette(ppal); return hpal; }
/* * @implemented */ HPALETTE APIENTRY EngCreatePalette( ULONG iMode, ULONG cColors, ULONG *pulColors, ULONG flRed, ULONG flGreen, ULONG flBlue) { PPALETTE ppal; HPALETTE hpal; ppal = PALETTE_AllocPalette2(iMode, cColors, pulColors, flRed, flGreen, flBlue); if (!ppal) return NULL; hpal = GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_PUBLIC); if (!hpal) { DPRINT1("Could not insert palette into handle table.\n"); GDIOBJ_vFreeObject(&ppal->BaseObject); return NULL; } PALETTE_UnlockPalette(ppal); return hpal; }
HPALETTE NTAPI GreCreatePaletteInternal( IN LPLOGPALETTE pLogPal, IN UINT cEntries) { HPALETTE hpal = NULL; PPALETTE ppal; pLogPal->palNumEntries = cEntries; ppal = PALETTE_AllocPalWithHandle(PAL_INDEXED, cEntries, pLogPal->palPalEntry, 0, 0, 0); if (ppal != NULL) { PALETTE_ValidateFlags(ppal->IndexedColors, ppal->NumColors); hpal = ppal->BaseObject.hHmgr; PALETTE_UnlockPalette(ppal); } return hpal; }
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; }
/* * @implemented */ HPALETTE APIENTRY NtGdiCreatePaletteInternal( IN LPLOGPALETTE plogpalUser, IN UINT cEntries) { HPALETTE hpal = NULL; PPALETTE ppal; ULONG i, cjSize; ppal = PALETTE_AllocPalWithHandle(PAL_INDEXED, cEntries, NULL, 0, 0, 0); if (ppal == NULL) { return NULL; } cjSize = FIELD_OFFSET(LOGPALETTE, palPalEntry[cEntries]); _SEH2_TRY { ProbeForRead(plogpalUser, cjSize, 1); for (i = 0; i < cEntries; i++) { ppal->IndexedColors[i] = plogpalUser->palPalEntry[i]; } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { GDIOBJ_vDeleteObject(&ppal->BaseObject); _SEH2_YIELD(return NULL); } _SEH2_END; PALETTE_ValidateFlags(ppal->IndexedColors, cEntries); hpal = ppal->BaseObject.hHmgr; PALETTE_UnlockPalette(ppal); return hpal; }
// Create the system palette INIT_FUNCTION NTSTATUS NTAPI InitPaletteImpl() { // Create default palette (20 system colors) gppalDefault = PALETTE_AllocPalWithHandle(PAL_INDEXED, 20, g_sysPalTemplate, 0, 0, 0); GDIOBJ_vReferenceObjectByPointer(&gppalDefault->BaseObject); PALETTE_UnlockPalette(gppalDefault); /* palette_size = visual->map_entries; */ gpalRGB.flFlags = PAL_RGB; gpalRGB.RedMask = RGB(0xFF, 0x00, 0x00); gpalRGB.GreenMask = RGB(0x00, 0xFF, 0x00); gpalRGB.BlueMask = RGB(0x00, 0x00, 0xFF); gpalRGB.BaseObject.ulShareCount = 1; gpalRGB.BaseObject.BaseFlags = 0 ; gpalBGR.flFlags = PAL_BGR; gpalBGR.RedMask = RGB(0x00, 0x00, 0xFF); gpalBGR.GreenMask = RGB(0x00, 0xFF, 0x00); gpalBGR.BlueMask = RGB(0xFF, 0x00, 0x00); gpalBGR.BaseObject.ulShareCount = 1; gpalBGR.BaseObject.BaseFlags = 0 ; gpalRGB555.flFlags = PAL_RGB16_555 | PAL_BITFIELDS; gpalRGB555.RedMask = 0x7C00; gpalRGB555.GreenMask = 0x3E0; gpalRGB555.BlueMask = 0x1F; gpalRGB555.BaseObject.ulShareCount = 1; gpalRGB555.BaseObject.BaseFlags = 0 ; gpalRGB565.flFlags = PAL_RGB16_565 | PAL_BITFIELDS; gpalRGB565.RedMask = 0xF800; gpalRGB565.GreenMask = 0x7E0; gpalRGB565.BlueMask = 0x1F; gpalRGB565.BaseObject.ulShareCount = 1; gpalRGB565.BaseObject.BaseFlags = 0 ; gppalMono = PALETTE_AllocPalette(PAL_MONOCHROME|PAL_INDEXED, 2, NULL, 0, 0, 0); PALETTE_vSetRGBColorForIndex(gppalMono, 0, 0x000000); PALETTE_vSetRGBColorForIndex(gppalMono, 1, 0xffffff); /* Initialize default surface palettes */ appalSurfaceDefault[BMF_1BPP] = gppalMono; appalSurfaceDefault[BMF_4BPP] = gppalDefault; appalSurfaceDefault[BMF_8BPP] = gppalDefault; appalSurfaceDefault[BMF_16BPP] = &gpalRGB565; appalSurfaceDefault[BMF_24BPP] = &gpalBGR; appalSurfaceDefault[BMF_32BPP] = &gpalBGR; appalSurfaceDefault[BMF_4RLE] = gppalDefault; appalSurfaceDefault[BMF_8RLE] = gppalDefault; appalSurfaceDefault[BMF_JPEG] = &gpalRGB; appalSurfaceDefault[BMF_PNG] = &gpalRGB; return STATUS_SUCCESS; }
HPALETTE APIENTRY NtGdiCreateHalftonePalette(HDC hDC) { int i, r, g, b; PALETTEENTRY PalEntries[256]; PPALETTE ppal; PDC pdc; HPALETTE hpal = NULL; pdc = DC_LockDc(hDC); if (!pdc) { EngSetLastError(ERROR_INVALID_HANDLE); return NULL; } RtlZeroMemory(PalEntries, sizeof(PalEntries)); /* First and last ten entries are default ones */ for (i = 0; i < 10; i++) { PalEntries[i].peRed = g_sysPalTemplate[i].peRed; PalEntries[i].peGreen = g_sysPalTemplate[i].peGreen; PalEntries[i].peBlue = g_sysPalTemplate[i].peBlue; PalEntries[246 + i].peRed = g_sysPalTemplate[10 + i].peRed; PalEntries[246 + i].peGreen = g_sysPalTemplate[10 + i].peGreen; PalEntries[246 + i].peBlue = g_sysPalTemplate[10 + i].peBlue; } ppal = PALETTE_ShareLockPalette(pdc->dclevel.hpal); if (ppal && (ppal->flFlags & PAL_INDEXED)) { /* FIXME: optimize the palette for the current palette */ UNIMPLEMENTED } else { for (r = 0; r < 6; r++) { for (g = 0; g < 6; g++) { for (b = 0; b < 6; b++) { i = r + g*6 + b*36 + 10; PalEntries[i].peRed = r * 51; PalEntries[i].peGreen = g * 51; PalEntries[i].peBlue = b * 51; } } } for (i = 216; i < 246; i++) { int v = (i - 216) << 3; PalEntries[i].peRed = v; PalEntries[i].peGreen = v; PalEntries[i].peBlue = v; } } if (ppal) PALETTE_ShareUnlockPalette(ppal); DC_UnlockDc(pdc); ppal = PALETTE_AllocPalWithHandle(PAL_INDEXED, 256, PalEntries, 0, 0, 0); if (ppal) { hpal = ppal->BaseObject.hHmgr; PALETTE_UnlockPalette(ppal); } return hpal; }