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>> decodeDds(const Blob& blob) {
11 if (blob.data.size() < 128 || Util::readU32LE(blob.data, 4) != 124 || Util::readU32LE(blob.data, 76) != 32) {
12 HAIO_FAIL(InvalidInput, "invalid dds header");
13 }
14
15 const Size size{static_cast<int>(Util::readU32LE(blob.data, 16)), static_cast<int>(Util::readU32LE(blob.data, 12))};
16 HAIO_TRY(want, sizeOf(P, size));
17 HAIO_TRY(data, Util::slice(blob.data, 128, want));
18
19 HAIO_TRY(expected, sizeOf(P, size));
20 if (data.size() != expected) HAIO_FAIL(InvalidInput, "invalid dds payload size");
21
22 return Image<P>{size.width, size.height, std::move(data)};
23}
24
25}
26
27/**
28 * @addtogroup decode
29 * @{
30 */
31template <>
33 return decodeDds<Color::RGB565>(blob);
34}
35/** @} */
36
37/**
38 * @addtogroup decode
39 * @{
40 */
41template <>
43 return decodeDds<Color::RGBA8888>(blob);
44}
45/** @} */
46
47}
Result< Image< Color::RGBA8888 > > Decode< Format::DDS, Color::RGBA8888 >(const Blob &blob)
Definition decode.cpp:42
Result< Image< Color::RGB565 > > Decode< Format::DDS, Color::RGB565 >(const Blob &blob)
Definition decode.cpp:32
#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
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