#pragma once #include #ifdef USE_SDL3 #include #else #include #endif namespace devilution { /** * @brief Lookup table for the average of two colors in `logical_palette`. */ extern uint8_t paletteTransparencyLookup[256][256]; /** * @brief Generates `paletteTransparencyLookup` table. * * This is based of the same technique found in Quake2. * * To mimic 50% transparency we figure out what colors in the existing palette are the best match for the combination of any 2 colors. * We save this into a lookup table for use during rendering. * * @param skipFrom Do not use colors between this index and skipTo * @param skipTo Do not use colors between skipFrom and this index */ void GenerateBlendedLookupTable(const SDL_Color *palette, int skipFrom = -1, int skipTo = -1); /** * @brief Updates the transparency lookup table for a single color. */ void UpdateBlendedLookupTableSingleColor(const SDL_Color *palette, unsigned i); #if DEVILUTIONX_PALETTE_TRANSPARENCY_BLACK_16_LUT /** * A lookup table from black for a pair of colors in `logical_palette`. * * For a pair of colors i and j, the index `i | (j << 8)` contains * `paletteTransparencyLookup[0][i] | (paletteTransparencyLookup[0][j] << 8)`. * * On big-endian platforms, the indices are encoded as `j | (i << 8)`, while the * value order remains the same. */ extern uint16_t paletteTransparencyLookupBlack16[65536]; void UpdateTransparencyLookupBlack16(unsigned from, unsigned to); #endif } // namespace devilution