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> encodeDds(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, "dds payload does not match its size");
13
14 const auto pitch = static_cast<uint32_t>(size.width * (P == Color::RGB565 ? 2 : 4));
15 const auto flags = P == Color::RGB565 ? 0x40u : 0x41u;
16 const auto bits = P == Color::RGB565 ? 16u : 32u;
17 const auto r = P == Color::RGB565 ? 0xf800u : 0x000000ffu;
18 const auto g = P == Color::RGB565 ? 0x07e0u : 0x0000ff00u;
19 const auto b = P == Color::RGB565 ? 0x001fu : 0x00ff0000u;
20 const auto a = P == Color::RGB565 ? 0u : 0xff000000u;
21
22 std::vector<uint8_t> out;
23 for (auto v : {Util::fourccLE('D', 'D', 'S', ' '), 124u, 0x100fu, static_cast<uint32_t>(size.height),
24 static_cast<uint32_t>(size.width), pitch, 0u, 0u}) {
25 Util::appendU32LE(out, v);
26 }
27 for (int i = 0; i < 11; i++) Util::appendU32LE(out, 0);
28 for (auto v : {32u, flags, 0u, bits, r, g, b, a, 0x1000u, 0u, 0u, 0u, 0u}) Util::appendU32LE(out, v);
29 out.insert(out.end(), img.data.begin(), img.data.end());
30
31 return Blob{Format::DDS, P, "image/vnd-ms.dds", {}, std::move(out)};
32}
33
34}
35
36/**
37 * @addtogroup encode
38 * @{
39 */
40template <>
42 return encodeDds<Color::RGB565>(std::move(img));
43}
44/** @} */
45
46/**
47 * @addtogroup encode
48 * @{
49 */
50template <>
52 return encodeDds<Color::RGBA8888>(std::move(img));
53}
54/** @} */
55
56}
Result< Blob > Encode< Format::DDS, Color::RGBA8888 >(Image< Color::RGBA8888 > img)
Definition encode.cpp:51
Result< Blob > Encode< Format::DDS, Color::RGB565 >(Image< Color::RGB565 > img)
Definition encode.cpp:41
#define HAIO_TRY(name, expr)
#define HAIO_FAIL(why, message)
constexpr uint32_t fourccLE(char a, char b, char c, char d)
Definition haio_util.hpp:29
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