11#include "../SIMD/module.hpp"
12#include "../geometry/module.hpp"
13#include "../utility/module.hpp"
14#include "../concurrency/module.hpp"
18namespace hi {
inline namespace v1 {
46 constexpr color()
noexcept =
default;
47 constexpr color(
color const&)
noexcept =
default;
49 constexpr color& operator=(
color const&)
noexcept =
default;
50 constexpr color& operator=(
color&&)
noexcept =
default;
52 [[nodiscard]]
constexpr explicit color(f16x4
const&
other) noexcept : _v(
other)
57 [[nodiscard]]
constexpr explicit color(f32x4
const&
other) noexcept :
color(
static_cast<f16x4
>(
other)) {}
59 [[nodiscard]]
constexpr explicit operator f16x4()
const noexcept
64 [[nodiscard]]
constexpr explicit operator f32x4()
const noexcept
66 return static_cast<f32x4
>(_v);
69 [[nodiscard]]
constexpr color(
float r,
float g,
float b,
float a = 1.0f) noexcept :
color(f32x4{r, g, b, a}) {}
78 [[nodiscard]]
static inline color black()
noexcept;
79 [[nodiscard]]
static inline color silver()
noexcept;
80 [[nodiscard]]
static inline color gray()
noexcept;
81 [[nodiscard]]
static inline color white()
noexcept;
82 [[nodiscard]]
static inline color maroon()
noexcept;
83 [[nodiscard]]
static inline color red()
noexcept;
84 [[nodiscard]]
static inline color purple()
noexcept;
85 [[nodiscard]]
static inline color fuchsia()
noexcept;
86 [[nodiscard]]
static inline color green()
noexcept;
87 [[nodiscard]]
static inline color lime()
noexcept;
88 [[nodiscard]]
static inline color olive()
noexcept;
89 [[nodiscard]]
static inline color yellow()
noexcept;
90 [[nodiscard]]
static inline color navy()
noexcept;
91 [[nodiscard]]
static inline color blue()
noexcept;
92 [[nodiscard]]
static inline color teal()
noexcept;
93 [[nodiscard]]
static inline color aqua()
noexcept;
94 [[nodiscard]]
static inline color indigo()
noexcept;
95 [[nodiscard]]
static inline color orange()
noexcept;
96 [[nodiscard]]
static inline color pink()
noexcept;
97 [[nodiscard]]
static inline color background()
noexcept;
98 [[nodiscard]]
static inline color gray1()
noexcept;
99 [[nodiscard]]
static inline color gray2()
noexcept;
100 [[nodiscard]]
static inline color gray3()
noexcept;
101 [[nodiscard]]
static inline color gray4()
noexcept;
102 [[nodiscard]]
static inline color gray5()
noexcept;
103 [[nodiscard]]
static inline color gray6()
noexcept;
104 [[nodiscard]]
static inline color gray7()
noexcept;
105 [[nodiscard]]
static inline color gray8()
noexcept;
106 [[nodiscard]]
static inline color gray9()
noexcept;
107 [[nodiscard]]
static inline color foreground()
noexcept;
108 [[nodiscard]]
static inline color transparent()
noexcept;
110 [[nodiscard]]
size_t hash()
const noexcept
115 [[nodiscard]]
constexpr float16& r()
noexcept
120 [[nodiscard]]
constexpr float16& g()
noexcept
125 [[nodiscard]]
constexpr float16& b()
noexcept
130 [[nodiscard]]
constexpr float16& a()
noexcept
135 [[nodiscard]]
constexpr float16 r()
const noexcept
140 [[nodiscard]]
constexpr float16 g()
const noexcept
145 [[nodiscard]]
constexpr float16 b()
const noexcept
150 [[nodiscard]]
constexpr float16 a()
const noexcept
155 [[nodiscard]]
constexpr bool holds_invariant()
const noexcept
157 return _v.w() >= 0.0 && _v.w() <= 1.0;
160 [[nodiscard]]
constexpr friend bool operator==(
color const& lhs,
color const& rhs)
noexcept
162 return equal(lhs._v, rhs._v);
165 [[nodiscard]]
constexpr friend color operator*(
color const& lhs,
color const& rhs)
noexcept
167 return color{lhs._v * rhs._v};
170 [[nodiscard]]
constexpr friend color composit(
color const& lhs,
color const& rhs)
noexcept
172 return color{composit(lhs._v, rhs._v)};
175 [[nodiscard]]
constexpr friend color desaturate(
color const& rhs)
noexcept
177 hilet rhs_ = f32x4{rhs};
179 hilet Y = 0.2126f * rhs_.r() + 0.7152f * rhs_.g() + 0.0722f * rhs_.b();
181 return color{Y, Y, Y, rhs_.a()};
197 get<0>(lhs) *
static_cast<f32x4
>(rhs).xxxx() + get<1>(lhs) *
static_cast<f32x4
>(rhs).yyyy() +
198 get<2>(lhs) *
static_cast<f32x4
>(rhs).zzzz() + get<3>(lhs)};
204 [[nodiscard]]
constexpr friend color operator*(
identity3 const& lhs,
color const& rhs)
noexcept
211 return lhs << std::format(
"rgb({} {} {} {})", rhs.r(), rhs.g(), rhs.b(), rhs.a());
224 hilet lock = std::scoped_lock(_map_mutex);
233 hi::color const& operator*()
const noexcept
250 hilet lock = std::scoped_lock(_map_mutex);
251 hilet it = _map.find(name);
252 if (it != _map.end()) {
267template<fixed_
string Tag>
281template<fixed_
string Tag>
286 if (
auto named_color_ptr = detail::named_color_base::find(name)) {
296template<>
inline auto named_color<
"silver"> = detail::named_color_type<
"silver">{color{192, 192, 192}};
297template<>
inline auto named_color<
"gray"> = detail::named_color_type<
"gray">{color{128, 128, 128}};
298template<>
inline auto named_color<
"white"> = detail::named_color_type<
"white">{color{255, 255, 255}};
299template<>
inline auto named_color<
"maroon"> = detail::named_color_type<
"maroon">{color{128, 0, 0}};
300template<>
inline auto named_color<
"red"> = detail::named_color_type<
"red">{color{255, 0, 0}};
301template<>
inline auto named_color<
"purple"> = detail::named_color_type<
"purple">{color{128, 0, 128}};
302template<>
inline auto named_color<
"fuchsia"> = detail::named_color_type<
"fuchsia">{color{255, 0, 255}};
303template<>
inline auto named_color<
"green"> = detail::named_color_type<
"green">{color{0, 128, 0}};
304template<>
inline auto named_color<
"lime"> = detail::named_color_type<
"lime">{color{0, 255, 0}};
305template<>
inline auto named_color<
"olive"> = detail::named_color_type<
"olive">{color{128, 128, 0}};
306template<>
inline auto named_color<
"yellow"> = detail::named_color_type<
"yellow">{color{255, 255, 0}};
307template<>
inline auto named_color<
"navy"> = detail::named_color_type<
"navy">{color{0, 0, 128}};
308template<>
inline auto named_color<
"blue"> = detail::named_color_type<
"blue">{color{0, 0, 255}};
309template<>
inline auto named_color<
"teal"> = detail::named_color_type<
"teal">{color{0, 128, 128}};
310template<>
inline auto named_color<
"aqua"> = detail::named_color_type<
"aqua">{color{0, 255, 255}};
311template<>
inline auto named_color<
"indigo"> = detail::named_color_type<
"indigo">{color{75, 0, 130}};
312template<>
inline auto named_color<
"orange"> = detail::named_color_type<
"orange">{color{255, 165, 0}};
313template<>
inline auto named_color<
"pink"> = detail::named_color_type<
"pink">{color{255, 192, 203}};
314template<>
inline auto named_color<
"background"> = detail::named_color_type<
"background">{color{0, 0, 0}};
315template<>
inline auto named_color<
"gray1"> = detail::named_color_type<
"gray1">{color{26, 26, 26}};
316template<>
inline auto named_color<
"gray2"> = detail::named_color_type<
"gray2">{color{51, 51, 51}};
317template<>
inline auto named_color<
"gray3"> = detail::named_color_type<
"gray3">{color{77, 77, 77}};
318template<>
inline auto named_color<
"gray4"> = detail::named_color_type<
"gray4">{color{102, 102, 102}};
319template<>
inline auto named_color<
"gray5"> = detail::named_color_type<
"gray5">{color{127, 127, 127}};
320template<>
inline auto named_color<
"gray6"> = detail::named_color_type<
"gray6">{color{153, 153, 153}};
321template<>
inline auto named_color<
"gray7"> = detail::named_color_type<
"gray7">{color{179, 179, 179}};
322template<>
inline auto named_color<
"gray8"> = detail::named_color_type<
"gray8">{color{204, 204, 204}};
323template<>
inline auto named_color<
"gray9"> = detail::named_color_type<
"gray9">{color{229, 229, 229}};
324template<>
inline auto named_color<
"foreground"> = detail::named_color_type<
"foreground">{color{255, 255, 255}};
325template<>
inline auto named_color<
"transparent"> = detail::named_color_type<
"transparent">{color{0, 0, 0, 0}};
327[[nodiscard]]
inline color color::black() noexcept {
return named_color<
"black">; }
328[[nodiscard]]
inline color color::silver() noexcept {
return named_color<
"silver">; }
329[[nodiscard]]
inline color color::gray() noexcept {
return named_color<
"gray">; }
330[[nodiscard]]
inline color color::white() noexcept {
return named_color<
"white">; }
331[[nodiscard]]
inline color color::maroon() noexcept {
return named_color<
"maroon">; }
332[[nodiscard]]
inline color color::red() noexcept {
return named_color<
"red">; }
333[[nodiscard]]
inline color color::purple() noexcept {
return named_color<
"purple">; }
334[[nodiscard]]
inline color color::fuchsia() noexcept {
return named_color<
"fuchsia">; }
335[[nodiscard]]
inline color color::green() noexcept {
return named_color<
"green">; }
336[[nodiscard]]
inline color color::lime() noexcept {
return named_color<
"lime">; }
337[[nodiscard]]
inline color color::olive() noexcept {
return named_color<
"olive">; }
338[[nodiscard]]
inline color color::yellow() noexcept {
return named_color<
"yellow">; }
339[[nodiscard]]
inline color color::navy() noexcept {
return named_color<
"navy">; }
340[[nodiscard]]
inline color color::blue() noexcept {
return named_color<
"blue">; }
341[[nodiscard]]
inline color color::teal() noexcept {
return named_color<
"teal">; }
342[[nodiscard]]
inline color color::aqua() noexcept {
return named_color<
"aqua">; }
343[[nodiscard]]
inline color color::indigo() noexcept {
return named_color<
"indigo">; }
344[[nodiscard]]
inline color color::orange() noexcept {
return named_color<
"orange">; }
345[[nodiscard]]
inline color color::pink() noexcept {
return named_color<
"pink">; }
346[[nodiscard]]
inline color color::background() noexcept {
return named_color<
"background">; }
347[[nodiscard]]
inline color color::gray1() noexcept {
return named_color<
"gray1">; }
348[[nodiscard]]
inline color color::gray2() noexcept {
return named_color<
"gray2">; }
349[[nodiscard]]
inline color color::gray3() noexcept {
return named_color<
"gray3">; }
350[[nodiscard]]
inline color color::gray4() noexcept {
return named_color<
"gray4">; }
351[[nodiscard]]
inline color color::gray5() noexcept {
return named_color<
"gray5">; }
352[[nodiscard]]
inline color color::gray6() noexcept {
return named_color<
"gray6">; }
353[[nodiscard]]
inline color color::gray7() noexcept {
return named_color<
"gray7">; }
354[[nodiscard]]
inline color color::gray8() noexcept {
return named_color<
"gray8">; }
355[[nodiscard]]
inline color color::gray9() noexcept {
return named_color<
"gray9">; }
356[[nodiscard]]
inline color color::foreground() noexcept {
return named_color<
"foreground">; }
357[[nodiscard]]
inline color color::transparent() noexcept {
return named_color<
"transparent">; }
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
@ other
The gui_event does not have associated data.
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
This is a RGBA floating point color.
Definition color.hpp:44
static color * find(std::string const &name) noexcept
Find a color by name.
Definition color.hpp:284
constexpr friend color operator*(matrix3 const &lhs, color const &rhs) noexcept
Transform a color by a color matrix.
Definition color.hpp:193
Identity transform.
Definition identity.hpp:20
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix.hpp:33