diff --git a/Source/utils/palette_blending.cpp b/Source/utils/palette_blending.cpp index 3c176b5a3..748b5f521 100644 --- a/Source/utils/palette_blending.cpp +++ b/Source/utils/palette_blending.cpp @@ -59,7 +59,7 @@ void SetPaletteTransparencyLookupBlack16(unsigned i, unsigned j) void GenerateBlendedLookupTable(SDL_Color palette[256], int skipFrom, int skipTo) { - const PaletteKdTree kdTree { palette }; + const PaletteKdTree kdTree { palette, skipFrom, skipTo }; for (unsigned i = 0; i < 256; i++) { paletteTransparencyLookup[i][i] = i; unsigned j = 0; diff --git a/Source/utils/palette_kd_tree.hpp b/Source/utils/palette_kd_tree.hpp index 933f69e3d..c0c3fa1b5 100644 --- a/Source/utils/palette_kd_tree.hpp +++ b/Source/utils/palette_kd_tree.hpp @@ -99,11 +99,18 @@ private: using RGB = std::array; public: - explicit PaletteKdTree(const SDL_Color palette[256]) + /** + * @brief Constructs a PaletteKdTree + * + * The palette is used as points in the tree. + * Colors between skipFrom and skipTo (inclusive) are skipped. + */ + explicit PaletteKdTree(const SDL_Color palette[256], int skipFrom, int skipTo) : palette_(palette) { - populatePivots(); - for (unsigned i = 0; i < 256; ++i) { + populatePivots(skipFrom, skipTo); + for (int i = 0; i < 256; ++i) { + if (i >= skipFrom && i <= skipTo) continue; tree_.leafForColor(palette[i]).values.emplace_back(i); } } @@ -166,26 +173,27 @@ private: } template - void populatePivotsForTargetDepth() + void populatePivotsForTargetDepth(int skipFrom, int skipTo) { constexpr size_t NumSubdivisions = 1U << TargetDepth; std::array, NumSubdivisions> subdivisions; const std::span, NumSubdivisions> subdivisionsSpan { subdivisions }; - for (unsigned i = 0; i < 256; ++i) { + for (int i = 0; i < 256; ++i) { + if (i >= skipFrom && i <= skipTo) continue; maybeAddToSubdivisionForMedian(tree_, i, subdivisionsSpan); } setPivotsRecursively(tree_, subdivisionsSpan); } template - void populatePivotsImpl(std::integer_sequence intSeq) // NOLINT(misc-unused-parameters) + void populatePivotsImpl(int skipFrom, int skipTo, std::index_sequence intSeq) // NOLINT(misc-unused-parameters) { - (populatePivotsForTargetDepth(), ...); + (populatePivotsForTargetDepth(skipFrom, skipTo), ...); } - void populatePivots() + void populatePivots(int skipFrom, int skipTo) { - populatePivotsImpl(std::make_integer_sequence {}); + populatePivotsImpl(skipFrom, skipTo, std::make_index_sequence {}); } template