static PPALETTE FixupDIBBrushPalette( _In_ PPALETTE ppalDIB, _In_ PPALETTE ppalDC) { PPALETTE ppalNew; ULONG i, iPalIndex, crColor; /* Allocate a new palette */ ppalNew = PALETTE_AllocPalette(PAL_INDEXED, ppalDIB->NumColors, NULL, 0, 0, 0); if (ppalNew == NULL) { ERR("Failed to allcate palette for brush\n"); return NULL; } /* Loop all colors */ for (i = 0; i < ppalDIB->NumColors; i++) { /* Get the RGB color, which is the index into the DC palette */ iPalIndex = PALETTE_ulGetRGBColorFromIndex(ppalDIB, i); /* Roll over when index is too big */ iPalIndex %= ppalDC->NumColors; /* Set the indexed DC color as the new color */ crColor = PALETTE_ulGetRGBColorFromIndex(ppalDC, iPalIndex); PALETTE_vSetRGBColorForIndex(ppalNew, i, crColor); } /* Return the new palette */ return ppalNew; }
// 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; }