6 #ifndef _WINDDI_ // Defined in ddk/winddi.h
7 PAL_INDEXED
= 0x00000001, // Indexed palette
8 PAL_BITFIELDS
= 0x00000002, // Bit fields used for DIB, DIB section
9 PAL_RGB
= 0x00000004, // Red, green, blue
10 PAL_BGR
= 0x00000008, // Blue, green, red
11 PAL_CMYK
= 0x00000010, // Cyan, magenta, yellow, black
14 PAL_FIXED
= 0x00000200, // Can't be changed
15 PAL_FREE
= 0x00000400,
16 PAL_MANAGED
= 0x00000800,
17 PAL_NOSTATIC
= 0x00001000,
18 PAL_MONOCHROME
= 0x00002000, // Two colors only
19 PAL_BRUSHHACK
= 0x00004000,
20 PAL_DIBSECTION
= 0x00008000, // Used for a DIB section
21 PAL_NOSTATIC256
= 0x00010000,
22 PAL_HT
= 0x00100000, // Halftone palette
23 PAL_RGB16_555
= 0x00200000, // 16-bit RGB in 555 format
24 PAL_RGB16_565
= 0x00400000, // 16-bit RGB in 565 format
25 PAL_GAMMACORRECTION
= 0x00800000, // Correct colors
28 typedef struct _PALETTE
30 /* Header for all gdi objects in the handle table.
31 Do not (re)move this. */
32 BASEOBJECT BaseObject
;
35 XLATEOBJ
*logicalToSystem
;
36 FLONG flFlags
; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR
38 PALETTEENTRY
*IndexedColors
;
46 PALETTEENTRY apalColors
[0];
49 extern PALETTE gpalRGB
, gpalBGR
, gpalRGB555
, gpalRGB565
, *gppalMono
, *gppalDefault
;
50 extern PPALETTE appalSurfaceDefault
[];
52 #define PALETTE_UnlockPalette(pPalette) GDIOBJ_vUnlockObject((POBJ)pPalette)
53 #define PALETTE_ShareLockPalette(hpal) \
54 ((PPALETTE)GDIOBJ_ShareLockObj((HGDIOBJ)hpal, GDI_OBJECT_TYPE_PALETTE))
55 #define PALETTE_ShareUnlockPalette(ppal) \
56 GDIOBJ_vDereferenceObject(&ppal->BaseObject)
61 InitPaletteImpl(VOID
);
68 _In_opt_ PULONG pulColors
,
75 PALETTE_AllocPalWithHandle(
78 _In_opt_ PULONG pulColors
,
85 PALETTE_ValidateFlags(
98 PALETTE_ulGetNearestPaletteIndex(
104 PALETTE_ulGetNearestIndex(
110 PALETTE_ulGetNearestBitFieldsIndex(
116 PALETTE_vGetBitMasks(
122 PALETTE_Cleanup(PVOID ObjectBody
);
126 CalculateShift(ULONG ulMask1
, ULONG ulMask2
)
128 ULONG ulShift1
, ulShift2
;
129 BitScanReverse(&ulShift1
, ulMask1
);
130 BitScanReverse(&ulShift2
, ulMask2
);
131 ulShift2
-= ulShift1
;
132 if ((INT
)ulShift2
< 0) ulShift2
+= 32;
138 PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal
, ULONG ulIndex
)
140 if (ulIndex
>= ppal
->NumColors
) return 0;
141 return RGB(ppal
->IndexedColors
[ulIndex
].peRed
,
142 ppal
->IndexedColors
[ulIndex
].peGreen
,
143 ppal
->IndexedColors
[ulIndex
].peBlue
);
148 PALETTE_vSetRGBColorForIndex(PPALETTE ppal
, ULONG ulIndex
, COLORREF crColor
)
150 if (ulIndex
>= ppal
->NumColors
) return;
151 ppal
->IndexedColors
[ulIndex
].peRed
= GetRValue(crColor
);
152 ppal
->IndexedColors
[ulIndex
].peGreen
= GetGValue(crColor
);
153 ppal
->IndexedColors
[ulIndex
].peBlue
= GetBValue(crColor
);
158 GreCreatePaletteInternal(
159 IN LPLOGPALETTE pLogPal
,