HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
srgb_abgr8_pack.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "sfloat_rgba16.hpp"
8#include "../color/sRGB.hpp"
9#include <algorithm>
10
11namespace hi::inline v1 {
12
14 uint32_t v;
15
16public:
17 constexpr srgb_abgr8_pack() = default;
18 constexpr srgb_abgr8_pack(srgb_abgr8_pack const &rhs) noexcept = default;
19 constexpr srgb_abgr8_pack(srgb_abgr8_pack &&rhs) noexcept = default;
20 constexpr srgb_abgr8_pack &operator=(srgb_abgr8_pack const &rhs) noexcept = default;
21 constexpr srgb_abgr8_pack &operator=(srgb_abgr8_pack &&rhs) noexcept = default;
22
23 constexpr srgb_abgr8_pack(uint32_t const &rhs) noexcept : v(rhs) {}
24 constexpr srgb_abgr8_pack &operator=(uint32_t const &rhs) noexcept
25 {
26 v = rhs;
27 return *this;
28 }
29 constexpr operator uint32_t() noexcept
30 {
31 return v;
32 }
33
34 constexpr srgb_abgr8_pack(sfloat_rgba16 const &rhs) noexcept
35 {
36 hilet &rhs_v = rhs.get();
37
38 hilet r = sRGB_linear16_to_gamma8(rhs_v[0].get());
39 hilet g = sRGB_linear16_to_gamma8(rhs_v[1].get());
40 hilet b = sRGB_linear16_to_gamma8(rhs_v[2].get());
41 hilet a = static_cast<uint8_t>(std::clamp(rhs_v[3] * 255.0f, 0.0f, 255.0f));
42 v = (static_cast<uint32_t>(a) << 24) | (static_cast<uint32_t>(b) << 16) | (static_cast<uint32_t>(g) << 8) |
43 static_cast<uint32_t>(r);
44 }
45
46 constexpr srgb_abgr8_pack &operator=(sfloat_rgba16 const &rhs) noexcept
47 {
48 hilet &rhs_v = rhs.get();
49
50 hilet r = sRGB_linear16_to_gamma8(rhs_v[0]);
51 hilet g = sRGB_linear16_to_gamma8(rhs_v[1]);
52 hilet b = sRGB_linear16_to_gamma8(rhs_v[2]);
53 hilet a = static_cast<uint8_t>(std::clamp(rhs_v[3] * 255.0f, 0.0f, 255.0f));
54 v = (static_cast<uint32_t>(a) << 24) | (static_cast<uint32_t>(b) << 16) | (static_cast<uint32_t>(g) << 8) |
55 static_cast<uint32_t>(r);
56 return *this;
57 }
58
59 [[nodiscard]] constexpr friend bool operator==(srgb_abgr8_pack const &lhs, srgb_abgr8_pack const &rhs) noexcept = default;
60
61 [[nodiscard]] constexpr friend srgb_abgr8_pack makeTransparent(srgb_abgr8_pack const &rhs) noexcept
62 {
63 return {rhs.v & 0x00ffffff};
64 }
65};
66
67inline void fill(pixel_map<srgb_abgr8_pack> &dst, pixel_map<sfloat_rgba16> const &src) noexcept
68{
69 hi_assert(dst.width >= src.width);
70 hi_assert(dst.height >= src.height);
71
72 for (auto rowNr = 0; rowNr < src.height; rowNr++) {
73 hilet srcRow = src.at(rowNr);
74 auto dstRow = dst.at(rowNr);
75 for (auto columnNr = 0; columnNr < src.width; columnNr++) {
76 dstRow[columnNr] = srcRow[columnNr];
77 }
78 }
79}
80
81} // namespace hi::inline v1
#define hilet
Invariant should be the default for variables.
Definition required.hpp:23
A 2D canvas of pixels.
Definition pixel_map.hpp:102
Definition sfloat_rgba16.hpp:19
Definition srgb_abgr8_pack.hpp:13