Haio 0.2.X
Homebrew Asset IO/CDN
Loading...
Searching...
No Matches
encode.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
8template <Color P>
9Result<Blob> encodeKtx2(Image<P> img) {
10 const Size size{img.width, img.height};
11 HAIO_TRY(expected, sizeOf(P, size));
12 if (img.data.size() != expected) HAIO_FAIL(InvalidInput, "ktx2 payload does not match its size");
13
14 HAIO_TRY(profile, Util::GPU::profileFor(P, size));
15 std::vector<uint8_t> out = {0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a};
16 for (auto v : {profile.vkFormat, Util::GPU::typeSize(profile), static_cast<uint32_t>(size.width),
17 static_cast<uint32_t>(size.height), 0u, 0u, 1u, 1u, 0u, 0u, 0u, 0u, 0u}) {
18 Util::appendU32LE(out, v);
19 }
20 Util::appendU64LE(out, 0);
21 Util::appendU64LE(out, 0);
22 Util::appendU64LE(out, 104);
23 Util::appendU64LE(out, img.data.size());
24 Util::appendU64LE(out, img.data.size());
25 out.insert(out.end(), img.data.begin(), img.data.end());
26
27 return Blob{Format::KTX2, P, "image/ktx2", {}, std::move(out)};
28}
29
30}
31
32/**
33 * @addtogroup encode
34 * @{
35 */
36template <>
38 return encodeKtx2<Color::ETC1>(std::move(img));
39}
40/** @} */
41
42/**
43 * @addtogroup encode
44 * @{
45 */
46template <>
48 return encodeKtx2<Color::RGB565>(std::move(img));
49}
50/** @} */
51
52/**
53 * @addtogroup encode
54 * @{
55 */
56template <>
58 return encodeKtx2<Color::RGBA8888>(std::move(img));
59}
60/** @} */
61
62}
Result< Blob > Encode< Format::KTX2, Color::ETC1 >(Image< Color::ETC1 > img)
Definition encode.cpp:37
Result< Blob > Encode< Format::KTX2, Color::RGBA8888 >(Image< Color::RGBA8888 > img)
Definition encode.cpp:57
Result< Blob > Encode< Format::KTX2, Color::RGB565 >(Image< Color::RGB565 > img)
Definition encode.cpp:47
#define HAIO_TRY(name, expr)
#define HAIO_FAIL(why, message)
Result< Profile > profileFor(Color color, Size size)
Definition gpu.cpp:20
uint32_t typeSize(const Profile &profile)
Definition gpu.cpp:34
void appendU64LE(std::vector< uint8_t > &out, uint64_t value)
Definition bytes.cpp:16
void appendU32LE(std::vector< uint8_t > &out, uint32_t value)
Definition bytes.cpp:9
std::expected< T, Error > Result
Result< size_t > sizeOf(Color color, Size size)
Definition sizes.cpp:6
std::vector< uint8_t > data