Haio 0.2.X
Homebrew Asset IO/CDN
Loading...
Searching...
No Matches
decode.cpp
Go to the documentation of this file.
1#include <haio_codec.hpp>
2#include <haio_convert.hpp>
3#include <haio_util.hpp>
4
5namespace Haio::Codecs {
6namespace {
7
8/** one body for every colour the container can hold; the caller names which */
9template <Color P>
10Result<Image<P>> decodeKtx(const Blob& blob) {
11 if (blob.data.size() < 68) HAIO_FAIL(InvalidInput, "invalid ktx header");
12 if (Util::readU32LE(blob.data, 12) != 0x04030201) HAIO_FAIL(InvalidInput, "unsupported ktx endianness");
13 if (Util::readU32LE(blob.data, 44) || Util::readU32LE(blob.data, 48)
14 || Util::readU32LE(blob.data, 52) != 1 || Util::readU32LE(blob.data, 56) > 1) {
15 HAIO_FAIL(InvalidInput, "unsupported ktx texture shape");
16 }
17
18 const Size size{static_cast<int>(Util::readU32LE(blob.data, 36)), static_cast<int>(Util::readU32LE(blob.data, 40))};
19 const auto dataOff = static_cast<size_t>(64) + Util::readU32LE(blob.data, 60);
20 if (!Util::hasBytes(blob.data, dataOff, 4)) HAIO_FAIL(InvalidInput, "truncated ktx container");
21
22 HAIO_TRY(data, Util::slice(blob.data, dataOff + 4, Util::readU32LE(blob.data, dataOff)));
23
24 HAIO_TRY(expected, sizeOf(P, size));
25 if (data.size() != expected) HAIO_FAIL(InvalidInput, "invalid ktx payload size");
26
27 return Image<P>{size.width, size.height, std::move(data)};
28}
29
30}
31
32/**
33 * @addtogroup decode
34 * @{
35 */
36template <>
38 return decodeKtx<Color::ETC1>(blob);
39}
40/** @} */
41
42/**
43 * @addtogroup decode
44 * @{
45 */
46template <>
48 return decodeKtx<Color::RGB565>(blob);
49}
50/** @} */
51
52/**
53 * @addtogroup decode
54 * @{
55 */
56template <>
58 return decodeKtx<Color::RGBA8888>(blob);
59}
60/** @} */
61
62}
Result< Image< Color::ETC1 > > Decode< Format::KTX, Color::ETC1 >(const Blob &blob)
Definition decode.cpp:37
Result< Image< Color::RGB565 > > Decode< Format::KTX, Color::RGB565 >(const Blob &blob)
Definition decode.cpp:47
Result< Image< Color::RGBA8888 > > Decode< Format::KTX, Color::RGBA8888 >(const Blob &blob)
Definition decode.cpp:57
#define HAIO_TRY(name, expr)
#define HAIO_FAIL(why, message)
Result< std::vector< uint8_t > > slice(Bytes data, size_t off, size_t len)
Definition bytes.cpp:42
bool hasBytes(Bytes data, size_t off, size_t len)
Definition bytes.cpp:5
uint32_t readU32LE(Bytes data, size_t off)
Definition bytes.cpp:21
std::vector< uint8_t > data
std::expected< T, Error > Result
Result< size_t > sizeOf(Color color, Size size)
Definition sizes.cpp:6