From 827eb9705d8d0dda670d6eec247b4d5c49139ea6 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Tue, 19 Sep 2023 08:53:24 +0100 Subject: [PATCH] dun_render: Add `DunTileColorMap` for baked light Refs #6631 --- Source/engine/render/dun_render.cpp | 25 +++++++++++++++++++++++++ Source/engine/render/dun_render.hpp | 12 ++++++++++++ 2 files changed, 37 insertions(+) diff --git a/Source/engine/render/dun_render.cpp b/Source/engine/render/dun_render.cpp index 56b50c1e9..23cdd925c 100644 --- a/Source/engine/render/dun_render.cpp +++ b/Source/engine/render/dun_render.cpp @@ -1207,4 +1207,29 @@ void world_draw_black_tile(const Surface &out, int sx, int sy) } } +void DunTileColorMap(std::span src, TileType tileType, + const uint8_t *tbl, uint8_t *dst) +{ + if (tileType == TileType::TransparentSquare) { + const uint8_t *srcPtr = src.data(); + for (auto i = 0; i < Height; ++i) { + for (uint_fast8_t drawWidth = Width; drawWidth > 0;) { + auto v = static_cast(*srcPtr++); + if (v > 0) { + drawWidth -= v; + while (v-- > 0) { + *dst++ = tbl[*srcPtr++]; + } + } else { + drawWidth += v; + } + } + } + } else { + for (const uint8_t pix : src) { + *dst++ = tbl[pix]; + } + } +} + } // namespace devilution diff --git a/Source/engine/render/dun_render.hpp b/Source/engine/render/dun_render.hpp index d61c35145..59a4b2d47 100644 --- a/Source/engine/render/dun_render.hpp +++ b/Source/engine/render/dun_render.hpp @@ -6,6 +6,7 @@ #pragma once #include +#include #include @@ -275,4 +276,15 @@ void RenderTile(const Surface &out, Point position, */ void world_draw_black_tile(const Surface &out, int sx, int sy); +/** + * @brief Applies a color map to a dungeon tile. + * + * @param src Dungeon CEL data. + * @param tileType Dungeon CEL type. + * @param tbl Palette mapping. + * @param dst Output dungeon CEL data. + */ +void DunTileColorMap(std::span src, TileType tileType, + const uint8_t *tbl, uint8_t *dst); + } // namespace devilution