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}) {}
82 [[nodiscard]]
static inline color black()
noexcept;
83 [[nodiscard]]
static inline color silver()
noexcept;
84 [[nodiscard]]
static inline color gray()
noexcept;
85 [[nodiscard]]
static inline color white()
noexcept;
86 [[nodiscard]]
static inline color maroon()
noexcept;
87 [[nodiscard]]
static inline color red()
noexcept;
88 [[nodiscard]]
static inline color purple()
noexcept;
89 [[nodiscard]]
static inline color fuchsia()
noexcept;
90 [[nodiscard]]
static inline color green()
noexcept;
91 [[nodiscard]]
static inline color lime()
noexcept;
92 [[nodiscard]]
static inline color olive()
noexcept;
93 [[nodiscard]]
static inline color yellow()
noexcept;
94 [[nodiscard]]
static inline color navy()
noexcept;
95 [[nodiscard]]
static inline color blue()
noexcept;
96 [[nodiscard]]
static inline color teal()
noexcept;
97 [[nodiscard]]
static inline color aqua()
noexcept;
98 [[nodiscard]]
static inline color indigo()
noexcept;
99 [[nodiscard]]
static inline color orange()
noexcept;
100 [[nodiscard]]
static inline color pink()
noexcept;
101 [[nodiscard]]
static inline color background()
noexcept;
102 [[nodiscard]]
static inline color gray1()
noexcept;
103 [[nodiscard]]
static inline color gray2()
noexcept;
104 [[nodiscard]]
static inline color gray3()
noexcept;
105 [[nodiscard]]
static inline color gray4()
noexcept;
106 [[nodiscard]]
static inline color gray5()
noexcept;
107 [[nodiscard]]
static inline color gray6()
noexcept;
108 [[nodiscard]]
static inline color gray7()
noexcept;
109 [[nodiscard]]
static inline color gray8()
noexcept;
110 [[nodiscard]]
static inline color gray9()
noexcept;
111 [[nodiscard]]
static inline color foreground()
noexcept;
112 [[nodiscard]]
static inline color transparent()
noexcept;
113 [[nodiscard]]
static inline color accent()
noexcept;
115 [[nodiscard]]
size_t hash()
const noexcept
120 [[nodiscard]]
constexpr float16& r()
noexcept
125 [[nodiscard]]
constexpr float16& g()
noexcept
130 [[nodiscard]]
constexpr float16& b()
noexcept
135 [[nodiscard]]
constexpr float16& a()
noexcept
140 [[nodiscard]]
constexpr float16 r()
const noexcept
145 [[nodiscard]]
constexpr float16 g()
const noexcept
150 [[nodiscard]]
constexpr float16 b()
const noexcept
155 [[nodiscard]]
constexpr float16 a()
const noexcept
160 [[nodiscard]]
constexpr bool holds_invariant()
const noexcept
162 return _v.w() >= 0.0 && _v.w() <= 1.0;
165 [[nodiscard]]
constexpr friend bool operator==(
color const& lhs,
color const& rhs)
noexcept
167 return equal(lhs._v, rhs._v);
170 [[nodiscard]]
constexpr friend color operator*(
color const& lhs,
color const& rhs)
noexcept
172 return color{lhs._v * rhs._v};
175 [[nodiscard]]
constexpr friend color composit(
color const& lhs,
color const& rhs)
noexcept
177 return color{composit(lhs._v, rhs._v)};
180 [[nodiscard]]
constexpr friend color desaturate(
color const& rhs)
noexcept
182 hilet rhs_ = f32x4{rhs};
184 hilet Y = 0.2126f * rhs_.r() + 0.7152f * rhs_.g() + 0.0722f * rhs_.b();
186 return color{Y, Y, Y, rhs_.a()};
198 [[nodiscard]]
constexpr friend color
operator*(
matrix3 const& lhs, color
const& rhs)
noexcept
202 get<0>(lhs) *
static_cast<f32x4
>(rhs).xxxx() + get<1>(lhs) *
static_cast<f32x4
>(rhs).yyyy() +
203 get<2>(lhs) *
static_cast<f32x4
>(rhs).zzzz() + get<3>(lhs)};
209 [[nodiscard]]
constexpr friend color operator*(
identity3 const& lhs,
color const& rhs)
noexcept
216 return lhs << std::format(
"rgb({} {} {} {})", rhs.r(), rhs.g(), rhs.b(), rhs.a());
225class named_color_base {
229 hilet lock = std::scoped_lock(_map_mutex);
233 named_color_base(named_color_base
const&) =
delete;
234 named_color_base(named_color_base&&) =
delete;
235 named_color_base& operator=(named_color_base
const&) =
delete;
236 named_color_base& operator=(named_color_base&&) =
delete;
238 hi::color const& operator*()
const noexcept
257 hilet lock = std::scoped_lock(_map_mutex);
258 for (
auto &item: _map) {
259 r.push_back(item.first);
265 [[nodiscard]]
static named_color_base *find(
std::string const& name)
noexcept
267 hilet lock = std::scoped_lock(_map_mutex);
268 hilet it = _map.find(name);
269 if (it != _map.end()) {
283 inline static unfair_mutex_without_deadlock_detector _map_mutex;
289template<fixed_
string Tag>
290class named_color_type :
public named_color_base {
292 named_color_type() noexcept : named_color_base(Tag,
hi::color{}) {}
293 named_color_type(
hi::color color) noexcept : named_color_base(Tag, color) {}
295 named_color_type& operator=(
hi::color color)
noexcept
303template<fixed_
string Tag>
308 return detail::named_color_base::list();
313 if (
auto named_color_ptr = detail::named_color_base::find(name)) {
323template<>
inline auto named_color<
"silver"> = detail::named_color_type<
"silver">{color{192, 192, 192}};
355[[nodiscard]]
inline color color::black() noexcept {
return named_color<
"black">; }
356[[nodiscard]]
inline color color::silver() noexcept {
return named_color<
"silver">; }
357[[nodiscard]]
inline color color::gray() noexcept {
return named_color<
"gray">; }
358[[nodiscard]]
inline color color::white() noexcept {
return named_color<
"white">; }
359[[nodiscard]]
inline color color::maroon() noexcept {
return named_color<
"maroon">; }
360[[nodiscard]]
inline color color::red() noexcept {
return named_color<
"red">; }
361[[nodiscard]]
inline color color::purple() noexcept {
return named_color<
"purple">; }
362[[nodiscard]]
inline color color::fuchsia() noexcept {
return named_color<
"fuchsia">; }
363[[nodiscard]]
inline color color::green() noexcept {
return named_color<
"green">; }
364[[nodiscard]]
inline color color::lime() noexcept {
return named_color<
"lime">; }
365[[nodiscard]]
inline color color::olive() noexcept {
return named_color<
"olive">; }
366[[nodiscard]]
inline color color::yellow() noexcept {
return named_color<
"yellow">; }
367[[nodiscard]]
inline color color::navy() noexcept {
return named_color<
"navy">; }
368[[nodiscard]]
inline color color::blue() noexcept {
return named_color<
"blue">; }
369[[nodiscard]]
inline color color::teal() noexcept {
return named_color<
"teal">; }
370[[nodiscard]]
inline color color::aqua() noexcept {
return named_color<
"aqua">; }
371[[nodiscard]]
inline color color::indigo() noexcept {
return named_color<
"indigo">; }
372[[nodiscard]]
inline color color::orange() noexcept {
return named_color<
"orange">; }
373[[nodiscard]]
inline color color::pink() noexcept {
return named_color<
"pink">; }
374[[nodiscard]]
inline color color::background() noexcept {
return named_color<
"background">; }
375[[nodiscard]]
inline color color::gray1() noexcept {
return named_color<
"gray1">; }
376[[nodiscard]]
inline color color::gray2() noexcept {
return named_color<
"gray2">; }
377[[nodiscard]]
inline color color::gray3() noexcept {
return named_color<
"gray3">; }
378[[nodiscard]]
inline color color::gray4() noexcept {
return named_color<
"gray4">; }
379[[nodiscard]]
inline color color::gray5() noexcept {
return named_color<
"gray5">; }
380[[nodiscard]]
inline color color::gray6() noexcept {
return named_color<
"gray6">; }
381[[nodiscard]]
inline color color::gray7() noexcept {
return named_color<
"gray7">; }
382[[nodiscard]]
inline color color::gray8() noexcept {
return named_color<
"gray8">; }
383[[nodiscard]]
inline color color::gray9() noexcept {
return named_color<
"gray9">; }
384[[nodiscard]]
inline color color::foreground() noexcept {
return named_color<
"foreground">; }
385[[nodiscard]]
inline color color::transparent() noexcept {
return named_color<
"transparent">; }
386[[nodiscard]]
inline color color::accent() noexcept {
return named_color<
"accent">; }
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
geo::identity identity3
2D identity transform.
Definition identity.hpp:84
@ other
The gui_event does not have associated data.
Definition gui_event_variant.hpp:21
geometry/margins.hpp
Definition cache.hpp:11
The HikoGUI API version 1.
Definition cache.hpp:11
geo::matrix< 3 > matrix3
A 3D homogenious transformation matrix.
Definition matrix.hpp:614
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:311
static std::vector< std::string > list() noexcept
List color names.
Definition color.hpp:306
constexpr friend color operator*(matrix3 const &lhs, color const &rhs) noexcept
Transform a color by a color matrix.
Definition color.hpp:198