ULONG NTAPI PALETTE_ulGetNearestIndex(PALETTE* ppal, ULONG ulColor) { if (ppal->flFlags & PAL_INDEXED) // use fl & PALINDEXED return PALETTE_ulGetNearestPaletteIndex(ppal, ulColor); else return PALETTE_ulGetNearestBitFieldsIndex(ppal, ulColor); }
UINT APIENTRY NtGdiGetNearestPaletteIndex( HPALETTE hpal, COLORREF crColor) { PPALETTE ppal = PALETTE_ShareLockPalette(hpal); UINT index = 0; if (ppal) { if (ppal->flFlags & PAL_INDEXED) { /* Return closest match for the given RGB color */ index = PALETTE_ulGetNearestPaletteIndex(ppal, crColor); } // else SetLastError ? PALETTE_ShareUnlockPalette(ppal); } return index; }
COLORREF APIENTRY NtGdiGetNearestColor(HDC hDC, COLORREF Color) { COLORREF nearest = CLR_INVALID; PDC dc; PPALETTE palGDI; LONG RBits, GBits, BBits; dc = DC_LockDc(hDC); if (NULL != dc) { HPALETTE hpal = dc->dclevel.hpal; palGDI = PALETTE_ShareLockPalette(hpal); if (!palGDI) { DC_UnlockDc(dc); return nearest; } if (palGDI->flFlags & PAL_INDEXED) { ULONG index; index = PALETTE_ulGetNearestPaletteIndex(palGDI, Color); nearest = PALETTE_ulGetRGBColorFromIndex(palGDI, index); } else if (palGDI->flFlags & PAL_RGB || palGDI->flFlags & PAL_BGR) { nearest = Color; } else if (palGDI->flFlags & PAL_BITFIELDS) { RBits = 8 - GetNumberOfBits(palGDI->RedMask); GBits = 8 - GetNumberOfBits(palGDI->GreenMask); BBits = 8 - GetNumberOfBits(palGDI->BlueMask); nearest = RGB( (GetRValue(Color) >> RBits) << RBits, (GetGValue(Color) >> GBits) << GBits, (GetBValue(Color) >> BBits) << BBits); }