11#include "../geometry/geometry.hpp"
12#include "../utility/utility.hpp"
13#include "../macros.hpp"
14#include <hikocpu/hikocpu.hpp>
20hi_export_module(hikogui.color : color_intf);
22hi_export
namespace hi {
51 constexpr color()
noexcept =
default;
52 constexpr color(
color const&)
noexcept =
default;
54 constexpr color& operator=(
color const&)
noexcept =
default;
55 constexpr color& operator=(
color&&)
noexcept =
default;
57 [[nodiscard]]
constexpr explicit color(f16x4
const&
other) noexcept : _v(
other)
59 hi_axiom(holds_invariant());
62 [[nodiscard]]
constexpr explicit color(f32x4
const&
other) noexcept :
color(
static_cast<f16x4
>(
other)) {}
64 [[nodiscard]]
constexpr explicit operator f16x4()
const noexcept
69 [[nodiscard]]
constexpr explicit operator f32x4()
const noexcept
71 return static_cast<f32x4
>(_v);
74 [[nodiscard]]
constexpr color(
float r,
float g,
float b,
float a = 1.0f) noexcept :
color(f32x4{r, g, b, a}) {}
87 [[nodiscard]]
static inline color black()
noexcept;
88 [[nodiscard]]
static inline color silver()
noexcept;
89 [[nodiscard]]
static inline color gray()
noexcept;
90 [[nodiscard]]
static inline color white()
noexcept;
91 [[nodiscard]]
static inline color maroon()
noexcept;
92 [[nodiscard]]
static inline color red()
noexcept;
93 [[nodiscard]]
static inline color purple()
noexcept;
94 [[nodiscard]]
static inline color fuchsia()
noexcept;
95 [[nodiscard]]
static inline color green()
noexcept;
96 [[nodiscard]]
static inline color lime()
noexcept;
97 [[nodiscard]]
static inline color olive()
noexcept;
98 [[nodiscard]]
static inline color yellow()
noexcept;
99 [[nodiscard]]
static inline color navy()
noexcept;
100 [[nodiscard]]
static inline color blue()
noexcept;
101 [[nodiscard]]
static inline color teal()
noexcept;
102 [[nodiscard]]
static inline color aqua()
noexcept;
103 [[nodiscard]]
static inline color indigo()
noexcept;
104 [[nodiscard]]
static inline color orange()
noexcept;
105 [[nodiscard]]
static inline color pink()
noexcept;
106 [[nodiscard]]
static inline color gray0()
noexcept;
107 [[nodiscard]]
static inline color gray1()
noexcept;
108 [[nodiscard]]
static inline color gray2()
noexcept;
109 [[nodiscard]]
static inline color gray3()
noexcept;
110 [[nodiscard]]
static inline color gray4()
noexcept;
111 [[nodiscard]]
static inline color gray5()
noexcept;
112 [[nodiscard]]
static inline color gray6()
noexcept;
113 [[nodiscard]]
static inline color gray7()
noexcept;
114 [[nodiscard]]
static inline color gray8()
noexcept;
115 [[nodiscard]]
static inline color gray9()
noexcept;
116 [[nodiscard]]
static inline color gray10()
noexcept;
117 [[nodiscard]]
static inline color transparent()
noexcept;
119 [[nodiscard]]
size_t hash()
const noexcept
124 [[nodiscard]]
constexpr half& r()
noexcept
129 [[nodiscard]]
constexpr half& g()
noexcept
134 [[nodiscard]]
constexpr half& b()
noexcept
139 [[nodiscard]]
constexpr half& a()
noexcept
144 [[nodiscard]]
constexpr half r()
const noexcept
149 [[nodiscard]]
constexpr half g()
const noexcept
154 [[nodiscard]]
constexpr half b()
const noexcept
159 [[nodiscard]]
constexpr half a()
const noexcept
164 [[nodiscard]]
constexpr bool holds_invariant()
const noexcept
166 return _v.w() >= 0.0 && _v.w() <= 1.0;
169 [[nodiscard]]
constexpr friend bool operator==(
color const& lhs,
color const& rhs)
noexcept
171 return equal(lhs._v, rhs._v);
176 return color{lhs._v * rhs._v};
188 [[nodiscard]]
constexpr friend color
operator*(
matrix3 const& lhs, color
const& rhs)
noexcept
190 hi_axiom(rhs.holds_invariant());
192 auto const rhs_ =
static_cast<f32x4
>(rhs);
194 auto r = color{get<0>(lhs) * rhs_.xxxx() + get<1>(lhs) * rhs_.yyyy() + get<2>(lhs) * rhs_.zzzz() + get<3>(lhs)};
202 return lhs << std::format(
"rgb({} {} {} {})", rhs.r(), rhs.g(), rhs.b(), rhs.a());
211class named_color_base {
215 auto const lock = std::scoped_lock(_map_mutex);
219 named_color_base(named_color_base
const&) =
delete;
220 named_color_base(named_color_base&&) =
delete;
221 named_color_base& operator=(named_color_base
const&) =
delete;
222 named_color_base& operator=(named_color_base&&) =
delete;
224 hi::color const& operator*()
const noexcept
243 auto const lock = std::scoped_lock(_map_mutex);
244 for (
auto& item : _map) {
245 r.push_back(item.first);
251 [[nodiscard]]
static named_color_base* find(
std::string const& name)
noexcept
253 auto const lock = std::scoped_lock(_map_mutex);
254 auto const it = _map.find(name);
255 if (it != _map.end()) {
275template<fixed_
string Tag>
276class named_color_type :
public named_color_base {
278 named_color_type() noexcept : named_color_base(Tag,
hi::color{}) {}
279 named_color_type(
hi::color color) noexcept : named_color_base(Tag, color) {}
281 named_color_type& operator=(
hi::color color)
noexcept
290template<fixed_
string Tag>
295 return detail::named_color_base::list();
300 if (
auto named_color_ptr = detail::named_color_base::find(name)) {
310template<>
inline auto named_color<
"silver"> = detail::named_color_type<
"silver">{
color{192, 192, 192}};
341[[nodiscard]]
inline color color::black() noexcept {
return named_color<
"black">; }
342[[nodiscard]]
inline color color::silver() noexcept {
return named_color<
"silver">; }
343[[nodiscard]]
inline color color::gray() noexcept {
return named_color<
"gray5">; }
344[[nodiscard]]
inline color color::white() noexcept {
return named_color<
"white">; }
345[[nodiscard]]
inline color color::maroon() noexcept {
return named_color<
"maroon">; }
346[[nodiscard]]
inline color color::red() noexcept {
return named_color<
"red">; }
347[[nodiscard]]
inline color color::purple() noexcept {
return named_color<
"purple">; }
348[[nodiscard]]
inline color color::fuchsia() noexcept {
return named_color<
"fuchsia">; }
349[[nodiscard]]
inline color color::green() noexcept {
return named_color<
"green">; }
350[[nodiscard]]
inline color color::lime() noexcept {
return named_color<
"lime">; }
351[[nodiscard]]
inline color color::olive() noexcept {
return named_color<
"olive">; }
352[[nodiscard]]
inline color color::yellow() noexcept {
return named_color<
"yellow">; }
353[[nodiscard]]
inline color color::navy() noexcept {
return named_color<
"navy">; }
354[[nodiscard]]
inline color color::blue() noexcept {
return named_color<
"blue">; }
355[[nodiscard]]
inline color color::teal() noexcept {
return named_color<
"teal">; }
356[[nodiscard]]
inline color color::aqua() noexcept {
return named_color<
"aqua">; }
357[[nodiscard]]
inline color color::indigo() noexcept {
return named_color<
"indigo">; }
358[[nodiscard]]
inline color color::orange() noexcept {
return named_color<
"orange">; }
359[[nodiscard]]
inline color color::pink() noexcept {
return named_color<
"pink">; }
360[[nodiscard]]
inline color color::gray0() noexcept {
return named_color<
"gray0">; }
361[[nodiscard]]
inline color color::gray1() noexcept {
return named_color<
"gray1">; }
362[[nodiscard]]
inline color color::gray2() noexcept {
return named_color<
"gray2">; }
363[[nodiscard]]
inline color color::gray3() noexcept {
return named_color<
"gray3">; }
364[[nodiscard]]
inline color color::gray4() noexcept {
return named_color<
"gray4">; }
365[[nodiscard]]
inline color color::gray5() noexcept {
return named_color<
"gray5">; }
366[[nodiscard]]
inline color color::gray6() noexcept {
return named_color<
"gray6">; }
367[[nodiscard]]
inline color color::gray7() noexcept {
return named_color<
"gray7">; }
368[[nodiscard]]
inline color color::gray8() noexcept {
return named_color<
"gray8">; }
369[[nodiscard]]
inline color color::gray9() noexcept {
return named_color<
"gray9">; }
370[[nodiscard]]
inline color color::gray10() noexcept {
return named_color<
"gray10">; }
371[[nodiscard]]
inline color color::transparent() noexcept {
return named_color<
"transparent">; }
387struct std::formatter<
hi::color, char> : std::formatter<std::string, char> {
388 auto format(
hi::color const& t,
auto& fc)
const
390 return std::formatter<std::string, char>::format(std::format(
"rgba({}, {}, {}, {})", t.r(), t.g(), t.b(), t.a()), fc);
@ other
The gui_event does not have associated data.
Definition gui_event_variant.hpp:24
The HikoGUI namespace.
Definition array_generic.hpp:21
The HikoGUI API version 1.
Definition array_generic.hpp:22
@ color
A color value was modified.
Definition style_modify_mask.hpp:27
constexpr matrix2 operator*(matrix2 const &lhs, matrix2 const &rhs) noexcept
Matrix/Matrix multiplication.
Definition transform.hpp:69
This is a RGBA floating point color.
Definition color_intf.hpp:49
static color * find(std::string const &name) noexcept
Find a color by name.
Definition color_intf.hpp:298
static std::vector< std::string > list() noexcept
List color names.
Definition color_intf.hpp:293
constexpr friend color operator*(matrix3 const &lhs, color const &rhs) noexcept
Transform a color by a color matrix.
Definition color_intf.hpp:188
Definition color_intf.hpp:276
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix3.hpp:36