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 tt {
12
14 uint32_t v;
15
16public:
17 srgb_abgr8_pack() = default;
18 srgb_abgr8_pack(srgb_abgr8_pack const &rhs) noexcept = default;
19 srgb_abgr8_pack(srgb_abgr8_pack &&rhs) noexcept = default;
20 srgb_abgr8_pack &operator=(srgb_abgr8_pack const &rhs) noexcept = default;
21 srgb_abgr8_pack &operator=(srgb_abgr8_pack &&rhs) noexcept = default;
22
23 srgb_abgr8_pack(uint32_t const &rhs) noexcept : v(rhs) {}
24 srgb_abgr8_pack &operator=(uint32_t const &rhs) noexcept { v = rhs; return *this; }
25 operator uint32_t () noexcept { return v; }
26
27 srgb_abgr8_pack(sfloat_rgba16 const &rhs) noexcept {
28 ttlet &rhs_v = rhs.get();
29
30 ttlet r = sRGB_linear16_to_gamma8(rhs_v[0].get());
31 ttlet g = sRGB_linear16_to_gamma8(rhs_v[1].get());
32 ttlet b = sRGB_linear16_to_gamma8(rhs_v[2].get());
33 ttlet a = static_cast<uint8_t>(std::clamp(rhs_v[3] * 255.0f, 0.0f, 255.0f));
34 v = (static_cast<uint32_t>(a) << 24) |
35 (static_cast<uint32_t>(b) << 16) |
36 (static_cast<uint32_t>(g) << 8) |
37 static_cast<uint32_t>(r);
38 }
39
40 srgb_abgr8_pack &operator=(sfloat_rgba16 const &rhs) noexcept {
41 ttlet &rhs_v = rhs.get();
42
43 ttlet r = sRGB_linear16_to_gamma8(rhs_v[0]);
44 ttlet g = sRGB_linear16_to_gamma8(rhs_v[1]);
45 ttlet b = sRGB_linear16_to_gamma8(rhs_v[2]);
46 ttlet a = static_cast<uint8_t>(std::clamp(rhs_v[3] * 255.0f, 0.0f, 255.0f));
47 v = (static_cast<uint32_t>(a) << 24) |
48 (static_cast<uint32_t>(b) << 16) |
49 (static_cast<uint32_t>(g) << 8) |
50 static_cast<uint32_t>(r);
51 return *this;
52 }
53
54 [[nodiscard]] friend bool operator==(srgb_abgr8_pack const &lhs, srgb_abgr8_pack const &rhs) noexcept {
55 return lhs.v == rhs.v;
56 }
57 [[nodiscard]] friend bool operator!=(srgb_abgr8_pack const &lhs, srgb_abgr8_pack const &rhs) noexcept {
58 return !(lhs == rhs);
59 }
60
61 [[nodiscard]] friend srgb_abgr8_pack makeTransparent(srgb_abgr8_pack const &rhs) noexcept {
62 return {rhs.v & 0x00ffffff};
63 }
64};
65
66
67
68inline void fill(pixel_map<srgb_abgr8_pack>& dst, pixel_map<sfloat_rgba16> const& src) noexcept
69{
70 tt_assert(dst.width >= src.width);
71 tt_assert(dst.height >= src.height);
72
73 for (auto rowNr = 0; rowNr < src.height; rowNr++) {
74 ttlet srcRow = src.at(rowNr);
75 auto dstRow = dst.at(rowNr);
76 for (auto columnNr = 0; columnNr < src.width; columnNr++) {
77 dstRow[columnNr] = srcRow[columnNr];
78 }
79 }
80}
81
82
83}
A 2D canvas of pixels.
Definition pixel_map.hpp:101
Definition sfloat_rgba16.hpp:19
Definition srgb_abgr8_pack.hpp:13