73 std::vector<std::uint8_t>
decode(std::span<const std::byte> src,
bool compressed,
bool fixEdges)
const {
74 std::vector<std::uint8_t> map;
87 void encode(std::span<const std::uint8_t> map,
bool compressed, std::vector<std::byte>& out)
const {
97 void decode4Bit(std::span<const std::byte> src, std::vector<std::uint8_t>& out)
const {
99 for (std::size_t i = 0; i <
Alpha4BitBytes && i < src.size(); ++i) {
100 const auto b = std::to_integer<std::uint8_t>(src[i]);
101 out[2 * i] =
static_cast<std::uint8_t
>((b & 0x0F) * 0x11);
102 out[2 * i + 1] =
static_cast<std::uint8_t
>((b >> 4) * 0x11);
109 void decode8Bit(std::span<const std::byte> src, std::vector<std::uint8_t>& out)
const {
111 for (std::size_t i = 0; i <
AlphaTexels && i < src.size(); ++i) out[i] = std::to_integer<std::uint8_t>(src[i]);
118 void decodeRle(std::span<const std::byte> src, std::vector<std::uint8_t>& out)
const {
122 while (out.size() <
AlphaTexels && p < src.size()) {
123 const auto control = std::to_integer<std::uint8_t>(src[p++]);
124 const std::size_t count = control & 0x7F;
127 if (p >= src.size())
break;
128 const auto value = std::to_integer<std::uint8_t>(src[p++]);
129 for (std::size_t k = 0; k < count && out.size() <
AlphaTexels; ++k) out.push_back(value);
133 for (std::size_t k = 0; k < count && out.size() <
AlphaTexels && p < src.size(); ++k) out.push_back(
134 std::to_integer<std::uint8_t>(src[p++]));
143 void encode4Bit(std::span<const std::uint8_t> map, std::vector<std::byte>& out)
const {
145 const auto lo =
static_cast<std::uint8_t
>(map[2 * i] >> 4);
146 const auto hi =
static_cast<std::uint8_t
>(map[2 * i + 1] >> 4);
147 out.push_back(
static_cast<std::byte
>(lo | (hi << 4)));
154 void encode8Bit(std::span<const std::uint8_t> map, std::vector<std::byte>& out)
const {
155 for (std::uint8_t v : map) out.push_back(
static_cast<std::byte
>(v));
164 void encodeRle(std::span<const std::uint8_t> map, std::vector<std::byte>& out)
const {
165 for (std::size_t row = 0; row <
AlphaDim; ++row) {
166 const std::uint8_t* r = map.data() + row *
AlphaDim;
168 std::size_t copyStart =
AlphaDim + 1;
169 const auto flushCopy = [&](std::size_t end) {
171 out.push_back(
static_cast<std::byte
>(end - copyStart));
173 for (std::size_t k = copyStart; k < end; ++k) out.push_back(
static_cast<std::byte
>(r[k]));
178 while (i + run <
AlphaDim && r[i + run] == r[i]) ++run;
181 out.push_back(
static_cast<std::byte
>(0x80 | run));
182 out.push_back(
static_cast<std::byte
>(r[i]));
186 if (copyStart >
AlphaDim) copyStart = i;
210 std::vector<std::uint8_t>
decode(std::span<const std::byte> src,
bool fixEdges)
const {
212 for (std::size_t i = 0; i <
AlphaTexels && i / 8 < src.size(); ++i) {
213 const auto b = std::to_integer<std::uint8_t>(src[i / 8]);
214 map[i] = (b >> (i % 8)) & 1;
223 void encode(std::span<const std::uint8_t> map, std::vector<std::byte>& out)
const {
224 for (std::size_t
byte = 0;
byte <
ShadowBytes; ++byte) {
225 std::uint8_t packed = 0;
226 for (std::size_t bit = 0; bit < 8; ++bit)
227 if (map[
byte * 8 + bit] & 1) packed |=
static_cast<std::uint8_t
>(1 << bit);
228 out.push_back(
static_cast<std::byte
>(packed));
ADT version grids, layout pivots and the alpha-format context.