4 #pragma warning(disable:4200) // zero-sized array in struct/union
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
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
32 typedef struct _PALETTE
34 /* Header for all gdi objects in the handle table.
35 Do not (re)move this. */
36 BASEOBJECT BaseObject
;
39 XLATEOBJ
*logicalToSystem
;
40 FLONG flFlags
; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR
42 PALETTEENTRY
*IndexedColors
;
50 PALETTEENTRY apalColors
[0];
53 extern PALETTE gpalRGB
, gpalBGR
, gpalRGB555
, gpalRGB565
, *gppalMono
, *gppalDefault
;
54 extern PPALETTE appalSurfaceDefault
[];
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)
65 InitPaletteImpl(VOID
);
72 _In_opt_
const PALETTEENTRY
* pEntries
,
79 PALETTE_AllocPalWithHandle(
82 _In_opt_
const PALETTEENTRY
* pEntries
,
89 PALETTE_ValidateFlags(
102 PALETTE_ulGetNearestPaletteIndex(
108 PALETTE_ulGetNearestIndex(
114 PALETTE_ulGetNearestBitFieldsIndex(
120 PALETTE_vGetBitMasks(
126 PALETTE_vCleanup(PVOID ObjectBody
);
130 CalculateShift(ULONG ulMask1
, ULONG ulMask2
)
132 ULONG ulShift1
, ulShift2
;
133 BitScanReverse(&ulShift1
, ulMask1
);
134 BitScanReverse(&ulShift2
, ulMask2
);
135 ulShift2
-= ulShift1
;
136 if ((INT
)ulShift2
< 0) ulShift2
+= 32;
142 PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal
, ULONG ulIndex
)
144 if (ulIndex
>= ppal
->NumColors
) return 0;
145 return RGB(ppal
->IndexedColors
[ulIndex
].peRed
,
146 ppal
->IndexedColors
[ulIndex
].peGreen
,
147 ppal
->IndexedColors
[ulIndex
].peBlue
);
152 PALETTE_vSetRGBColorForIndex(PPALETTE ppal
, ULONG ulIndex
, COLORREF crColor
)
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
);
162 GreCreatePaletteInternal(
163 IN LPLOGPALETTE pLogPal
,