reactos操作系统实现(196)
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} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |