-#ifndef _WIN32K_PALETTE_H
-#define _WIN32K_PALETTE_H
+#pragma once
-#define NO_MAPPING
+#include <include/dc.h>
#define PALETTE_FIXED 0x0001 /* read-only colormap - have to use XAllocColor (if not virtual) */
#define PALETTE_VIRTUAL 0x0002 /* no mapping needed - pixel == pixel color */
#define PAL_RGB16_565 0x00400000 // 16-bit RGB in 565 format
#define PAL_GAMMACORRECTION 0x00800000 // Correct colors
-typedef struct {
- int shift;
- int scale;
- int max;
-} ColorShifts;
-typedef struct _PALGDI {
-// HGDIOBJ hHmgr;
-// PVOID pvEntry;
-// ULONG lucExcLock;
-// ULONG Tid;
+typedef struct _PALETTE
+{
+ /* Header for all gdi objects in the handle table.
+ Do not (re)move this. */
+ BASEOBJECT BaseObject;
PALOBJ PalObj;
XLATEOBJ *logicalToSystem;
ULONG RedMask;
ULONG GreenMask;
ULONG BlueMask;
+ ULONG ulRedShift;
+ ULONG ulGreenShift;
+ ULONG ulBlueShift;
HDEV hPDev;
-} PALGDI, *PPALGDI;
+} PALETTE, *PPALETTE;
+
+extern PALETTE gpalRGB, gpalBGR, gpalMono;
+
HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode,
ULONG NumColors,
ULONG Blue);
HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors,
CONST RGBQUAD *Colors);
-#define PALETTE_FreePalette(hPalette) GDIOBJ_FreeObj(GdiHandleTable, (HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)
-#define PALETTE_LockPalette(hPalette) ((PPALGDI)GDIOBJ_LockObj(GdiHandleTable, (HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE))
-#define PALETTE_UnlockPalette(pPalette) GDIOBJ_UnlockObjByPtr(GdiHandleTable, pPalette)
+#define PALETTE_FreePalette(pPalette) GDIOBJ_FreeObj((POBJ)pPalette, GDIObjType_PAL_TYPE)
+#define PALETTE_FreePaletteByHandle(hPalette) GDIOBJ_FreeObjByHandle((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)
+#define PALETTE_LockPalette(hPalette) ((PPALETTE)GDIOBJ_LockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE))
+#define PALETTE_UnlockPalette(pPalette) GDIOBJ_UnlockObjByPtr((POBJ)pPalette)
+
+#define PALETTE_ShareLockPalette(hpal) \
+ ((PPALETTE)GDIOBJ_ShareLockObj((HGDIOBJ)hpal, GDI_OBJECT_TYPE_PALETTE))
+#define PALETTE_ShareUnlockPalette(ppal) \
+ GDIOBJ_ShareUnlockObjByPtr(&ppal->BaseObject)
+
BOOL INTERNAL_CALL PALETTE_Cleanup(PVOID ObjectBody);
HPALETTE FASTCALL PALETTE_Init (VOID);
VOID FASTCALL PALETTE_ValidateFlags (PALETTEENTRY* lpPalE, INT size);
-#ifndef NO_MAPPING
-INT STDCALL PALETTE_SetMapping(PALOBJ* palPtr, UINT uStart, UINT uNum, BOOL mapOnly);
-#endif
INT FASTCALL PALETTE_ToPhysical (PDC dc, COLORREF color);
-INT FASTCALL PALETTE_GetObject(PPALGDI pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer);
+INT FASTCALL PALETTE_GetObject(PPALETTE pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer);
+ULONG NTAPI PALETTE_ulGetNearestPaletteIndex(PALETTE* ppal, ULONG iColor);
+ULONG NTAPI PALETTE_ulGetNearestIndex(PALETTE* ppal, ULONG iColor);
+VOID NTAPI PALETTE_vGetBitMasks(PPALETTE ppal, PULONG pulColors);
PPALETTEENTRY FASTCALL ReturnSystemPalette (VOID);
+HPALETTE FASTCALL GdiSelectPalette(HDC, HPALETTE, BOOL);
+
+ULONG
+FORCEINLINE
+CalculateShift(ULONG ulMask1, ULONG ulMask2)
+{
+ ULONG ulShift1, ulShift2;
+ BitScanReverse(&ulShift1, ulMask1);
+ BitScanReverse(&ulShift2, ulMask2);
+ ulShift2 -= ulShift1;
+ if ((INT)ulShift2 < 0) ulShift2 += 32;
+ return ulShift2;
+}
-#endif /* _WIN32K_PALETTE_H */
+FORCEINLINE
+ULONG
+PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex)
+{
+ return RGB(ppal->IndexedColors[ulIndex].peRed,
+ ppal->IndexedColors[ulIndex].peGreen,
+ ppal->IndexedColors[ulIndex].peBlue);
+}