ttx 0.1.0
Loading...
Searching...
No Matches
color.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/function/value.h"
4#include "di/parser/basic/match_zero_or_more.h"
5#include "di/reflect/prelude.h"
6#include "di/types/floats.h"
7#include "di/types/integers.h"
8
9namespace ttx::terminal {
10struct Color {
11 using IsAtom = void;
12
13 enum class Type : u8 {
18 };
19
38
39 static auto from_name(di::StringView color) -> di::Result<Color>;
40 static auto from_string(di::StringView color) -> di::Result<Color>;
41
42 Color() = default;
43 constexpr Color(Palette c) : type(Type::Palette), r(c) {}
44 constexpr Color(u8 r, u8 g, u8 b) : type(Type::Custom), r(r), g(g), b(b) {}
45 constexpr explicit Color(Type t) : type(t) {}
46
48 u8 r = 0;
49 u8 g = 0;
50 u8 b = 0;
51
52 auto is_default() const { return type == Type::Default; }
53 auto is_palette() const { return type == Type::Palette; }
54 auto is_custom() const { return type == Type::Custom; }
55 auto is_dynamic() const { return type == Type::Dynamic; }
56
61 auto brightness() const -> f64;
62
66 auto dimmed(u32 dim_factor) const -> Color;
67
68 auto value_or(Color other) const { return is_default() ? other : *this; }
69
70 auto to_string() const -> di::String;
71
72 auto operator==(Color const& other) const -> bool = default;
73 auto operator<=>(Color const& other) const = default;
74
75 constexpr friend auto tag_invoke(di::Tag<di::parser::create_parser_in_place>, di::InPlaceType<Color>) {
76 return di::parser::match_zero_or_more(di::function::value(true))
77 << []<typename Context>(Context& context,
78 di::concepts::CopyConstructible auto results) -> di::Result<Color> {
79 using Enc = di::meta::Encoding<Context>;
80 auto encoding = context.encoding();
81
82 auto const input = di::container::string::StringViewImpl<Enc> {
83 di::encoding::unicode_code_point_unwrap(encoding, results.begin()),
84 di::encoding::unicode_code_point_unwrap(encoding, results.end())
85 };
86
87 return Color::from_string(input);
88 };
89 }
90};
91
92constexpr auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<Color::Type>) {
93 using enum Color::Type;
94 return di::make_enumerators<"Color::Type">(di::enumerator<"Default", Default>, di::enumerator<"Palette", Palette>,
95 di::enumerator<"Custom", Custom>, di::enumerator<"Dynamic", Dynamic>);
96}
97
98constexpr auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<Color::Palette>) {
99 using enum Color::Palette;
100 return di::make_enumerators<"Color::Palette">(
101 di::enumerator<"Black", Black>, di::enumerator<"Red", Red>, di::enumerator<"Green", Green>,
102 di::enumerator<"Brown", Yellow>, di::enumerator<"Blue", Blue>, di::enumerator<"Magenta", Magenta>,
103 di::enumerator<"Cyan", Cyan>, di::enumerator<"LightGrey", LightGrey>, di::enumerator<"DarkGrey", DarkGrey>,
104 di::enumerator<"LightRed", LightRed>, di::enumerator<"LightGreen", LightGreen>,
105 di::enumerator<"Yellow", LightYellow>, di::enumerator<"LightBlue", LightBlue>,
106 di::enumerator<"LightMagenta", LightMagenta>, di::enumerator<"LightCyan", LightCyan>,
107 di::enumerator<"White", White>);
108}
109}
Definition palette.h:69
Definition absolute_position.h:6
constexpr auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< Color::Type >)
Definition color.h:92
Definition color.h:10
static auto from_name(di::StringView color) -> di::Result< Color >
Definition color.cpp:774
u8 g
Definition color.h:49
auto value_or(Color other) const
Definition color.h:68
auto is_palette() const
Definition color.h:53
auto dimmed(u32 dim_factor) const -> Color
Definition color.cpp:837
auto is_dynamic() const
Compute the perceived brightness of a color.
Definition color.h:55
auto is_default() const
Definition color.h:52
void IsAtom
Definition color.h:11
auto brightness() const -> f64
Dim the given color by a percentage.
Definition color.cpp:825
constexpr Color(Type t)
Definition color.h:45
Type
Definition color.h:13
@ Palette
Color is a palette color (256 colors are available).
Definition color.h:15
@ Default
Color is the default (unset SGR).
Definition color.h:14
@ Custom
Color is true color (r, b, g fully specified).
Definition color.h:16
@ Dynamic
Color is dynamic (e.g. for selection use reverse video).
Definition color.h:17
constexpr Color(u8 r, u8 g, u8 b)
Definition color.h:44
Type type
Definition color.h:47
auto to_string() const -> di::String
Definition color.cpp:812
u8 r
Definition color.h:48
constexpr Color(Palette c)
Definition color.h:43
auto is_custom() const
Definition color.h:54
constexpr friend auto tag_invoke(di::Tag< di::parser::create_parser_in_place >, di::InPlaceType< Color >)
Definition color.h:75
u8 b
Definition color.h:50
static auto from_string(di::StringView color) -> di::Result< Color >
Definition color.cpp:783
Palette
Definition color.h:20
@ LightRed
Definition color.h:30
@ LightGrey
Definition color.h:28
@ Cyan
Definition color.h:27
@ White
Definition color.h:36
@ Black
Definition color.h:21
@ DarkGrey
Definition color.h:29
@ Yellow
Definition color.h:24
@ Green
Definition color.h:23
@ Magenta
Definition color.h:26
@ LightCyan
Definition color.h:35
@ Blue
Definition color.h:25
@ LightBlue
Definition color.h:33
@ Red
Definition color.h:22
@ LightYellow
Definition color.h:32
@ LightGreen
Definition color.h:31
@ LightMagenta
Definition color.h:34