1 #pragma once 2 3 #ifdef _MSC_VER 4 #pragma warning(disable:4200) // zero-sized array in struct/union 5 #endif // _MSC_VER 6 7 // Palette mode flags 8 enum _PALFLAGS 9 { 10 #ifndef _WINDDI_ // Defined in ddk/winddi.h 11 PAL_INDEXED = 0x00000001, // Indexed palette 12 PAL_BITFIELDS = 0x00000002, // Bit fields used for DIB, DIB section 13 PAL_RGB = 0x00000004, // Red, green, blue 14 PAL_BGR = 0x00000008, // Blue, green, red 15 PAL_CMYK = 0x00000010, // Cyan, magenta, yellow, black 16 #endif 17 PAL_DC = 0x00000100, 18 PAL_FIXED = 0x00000200, // Can't be changed 19 PAL_FREE = 0x00000400, 20 PAL_MANAGED = 0x00000800, 21 PAL_NOSTATIC = 0x00001000, 22 PAL_MONOCHROME = 0x00002000, // Two colors only 23 PAL_BRUSHHACK = 0x00004000, 24 PAL_DIBSECTION = 0x00008000, // Used for a DIB section 25 PAL_NOSTATIC256 = 0x00010000, 26 PAL_HT = 0x00100000, // Halftone palette 27 PAL_RGB16_555 = 0x00200000, // 16-bit RGB in 555 format 28 PAL_RGB16_565 = 0x00400000, // 16-bit RGB in 565 format 29 PAL_GAMMACORRECTION = 0x00800000, // Correct colors 30 }; 31 32 typedef struct _PALETTE 33 { 34 /* Header for all gdi objects in the handle table. 35 Do not (re)move this. */ 36 BASEOBJECT BaseObject; 37 38 PALOBJ PalObj; 39 XLATEOBJ *logicalToSystem; 40 FLONG flFlags; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR 41 ULONG NumColors; 42 PALETTEENTRY *IndexedColors; 43 ULONG RedMask; 44 ULONG GreenMask; 45 ULONG BlueMask; 46 ULONG ulRedShift; 47 ULONG ulGreenShift; 48 ULONG ulBlueShift; 49 HDEV hPDev; 50 PALETTEENTRY apalColors[0]; 51 } PALETTE, *PPALETTE; 52 53 extern PALETTE gpalRGB, gpalBGR, gpalRGB555, gpalRGB565, *gppalMono, *gppalDefault; 54 extern PPALETTE appalSurfaceDefault[]; 55 56 #define PALETTE_UnlockPalette(pPalette) GDIOBJ_vUnlockObject((POBJ)pPalette) 57 #define PALETTE_ShareLockPalette(hpal) \ 58 ((PPALETTE)GDIOBJ_ShareLockObj((HGDIOBJ)hpal, GDI_OBJECT_TYPE_PALETTE)) 59 #define PALETTE_ShareUnlockPalette(ppal) \ 60 GDIOBJ_vDereferenceObject(&ppal->BaseObject) 61 62 CODE_SEG("INIT") 63 NTSTATUS 64 NTAPI 65 InitPaletteImpl(VOID); 66 67 PPALETTE 68 NTAPI 69 PALETTE_AllocPalette( 70 _In_ ULONG iMode, 71 _In_ ULONG cColors, 72 _In_opt_ const PALETTEENTRY* pEntries, 73 _In_ FLONG flRed, 74 _In_ FLONG flGreen, 75 _In_ FLONG flBlue); 76 77 PPALETTE 78 NTAPI 79 PALETTE_AllocPalWithHandle( 80 _In_ ULONG iMode, 81 _In_ ULONG cColors, 82 _In_opt_ const PALETTEENTRY* pEntries, 83 _In_ FLONG flRed, 84 _In_ FLONG flGreen, 85 _In_ FLONG flBlue); 86 87 VOID 88 FASTCALL 89 PALETTE_ValidateFlags( 90 PALETTEENTRY* lpPalE, 91 INT size); 92 93 INT 94 FASTCALL 95 PALETTE_GetObject( 96 PPALETTE pGdiObject, 97 INT cbCount, 98 LPLOGBRUSH lpBuffer); 99 100 ULONG 101 NTAPI 102 PALETTE_ulGetNearestPaletteIndex( 103 PPALETTE ppal, 104 ULONG iColor); 105 106 ULONG 107 NTAPI 108 PALETTE_ulGetNearestIndex( 109 PPALETTE ppal, 110 ULONG iColor); 111 112 ULONG 113 NTAPI 114 PALETTE_ulGetNearestBitFieldsIndex( 115 PPALETTE ppal, 116 ULONG ulColor); 117 118 VOID 119 NTAPI 120 PALETTE_vGetBitMasks( 121 PPALETTE ppal, 122 PULONG pulColors); 123 124 VOID 125 NTAPI 126 PALETTE_vCleanup(PVOID ObjectBody); 127 128 FORCEINLINE 129 ULONG 130 CalculateShift(ULONG ulMask1, ULONG ulMask2) 131 { 132 ULONG ulShift1, ulShift2; 133 BitScanReverse(&ulShift1, ulMask1); 134 BitScanReverse(&ulShift2, ulMask2); 135 ulShift2 -= ulShift1; 136 if ((INT)ulShift2 < 0) ulShift2 += 32; 137 return ulShift2; 138 } 139 140 FORCEINLINE 141 ULONG 142 PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex) 143 { 144 if (ulIndex >= ppal->NumColors) return 0; 145 return RGB(ppal->IndexedColors[ulIndex].peRed, 146 ppal->IndexedColors[ulIndex].peGreen, 147 ppal->IndexedColors[ulIndex].peBlue); 148 } 149 150 FORCEINLINE 151 VOID 152 PALETTE_vSetRGBColorForIndex(PPALETTE ppal, ULONG ulIndex, COLORREF crColor) 153 { 154 if (ulIndex >= ppal->NumColors) return; 155 ppal->IndexedColors[ulIndex].peRed = GetRValue(crColor); 156 ppal->IndexedColors[ulIndex].peGreen = GetGValue(crColor); 157 ppal->IndexedColors[ulIndex].peBlue = GetBValue(crColor); 158 } 159 160 HPALETTE 161 NTAPI 162 GreCreatePaletteInternal( 163 IN LPLOGPALETTE pLogPal, 164 IN UINT cEntries); 165 166