PALETTE_Init函数是用来创建系统调色板。具体实现如下:
#001 HPALETTE FASTCALL PALETTE_Init(VOID)
#002 {
#003 int i;
#004 HPALETTE hpalette;
#005 PLOGPALETTE palPtr;
#006 #ifndef NO_MAPPING
#007 PALOBJ *palObj;
#008 #endif
#009
创建系统20种缺省的颜色。
#010 // create default palette (20 system colors)
分配20种颜色的调色板占用的内存空间。
#011 palPtr = ExAllocatePoolWithTag(PagedPool,
#012 sizeof(LOGPALETTE) +
#013 (NB_RESERVED_COLORS * sizeof(PALETTEENTRY)),
#014 TAG_PALETTE);
如果分配内存失败,就返回失败。
#015 if (!palPtr) return FALSE;
#016
设置调色板的版本号。
#017 palPtr->palVersion = 0x300;
设置调色板的颜色个数,这里设置为系统缺省值为20个。
#018 palPtr->palNumEntries = NB_RESERVED_COLORS;
初始化系统调色板。
#019 for (i=0; i<NB_RESERVED_COLORS; i++)
#020 {
#021 palPtr->palPalEntry[i].peRed = g_sysPalTemplate[i].peRed;
#022 palPtr->palPalEntry[i].peGreen = g_sysPalTemplate[i].peGreen;
#023 palPtr->palPalEntry[i].peBlue = g_sysPalTemplate[i].peBlue;
#024 palPtr->palPalEntry[i].peFlags = 0;
#025 }
#026
调用函数NtGdiCreatePaletteInternal创建系统调色板。
#027 hpalette = NtGdiCreatePaletteInternal(palPtr,NB_RESERVED_COLORS);
#028 ExFreePoolWithTag(palPtr,TAG_PALETTE);
#029
#030 #ifndef NO_MAPPING
#031 palObj = (PALOBJ*)PALETTE_LockPalette(hpalette);
#032 if (palObj)
#033 {
#034 if (!(palObj->mapping = ExAllocatePool(PagedPool,sizeof(int) * 20)))
#035 {
#036 DbgPrint("Win32k: Can not create palette mapping -- out of memory!");
#037 return FALSE;
#038 }
#039 PALETTE_UnlockPalette(palObj);
#040 }
#041 #endif
#042
#043 /* palette_size = visual->map_entries; */
#044
设置RGB/BGR/单色的调色板。
#045 gpalRGB.Mode = PAL_RGB;
#046 gpalRGB.RedMask = RGB(0xFF,0x00,0x00);
#047 gpalRGB.GreenMask = RGB(0x00,0xFF,0x00);
#048 gpalRGB.BlueMask = RGB(0x00,0xFF);
#049
#050 gpalBGR.Mode = PAL_BGR;
#051 gpalBGR.RedMask = RGB(0x00,0xFF);
#052 gpalBGR.GreenMask = RGB(0x00,0x00);
#053 gpalBGR.BlueMask = RGB(0xFF,0x00);
#054
#055 memset(&gpalMono,sizeof(PALETTE));
#056 gpalMono.Mode = PAL_MONOCHROME;
#057
#058 return hpalette;
#059}
原文链接:https://www.f2er.com/react/308324.html