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