libNeon
Loading...
Searching...
No Matches
gradient.hpp
Go to the documentation of this file.
1//
2// Created by spak on 6/5/21.
3//
4
5#ifndef NEO_GRADIENT_HPP
6#define NEO_GRADIENT_HPP
7
8#include <mlab/bin_data.hpp>
9#include <neo/color.hpp>
10#include <vector>
11
12namespace neo {
13 using blending_method = rgb (&)(rgb l, rgb r, float t);
14
15 [[maybe_unused]] rgb blend_linear(rgb l, rgb r, float t);
16 [[maybe_unused]] rgb blend_round_down(rgb l, rgb, float);
17 [[maybe_unused]] rgb blend_round_up(rgb, rgb r, float);
18 [[maybe_unused]] rgb blend_nearest_neighbor(rgb l, rgb r, float t);
19
20 class gradient_entry;
22}// namespace neo
23
24namespace mlab {
25 bin_stream &operator>>(bin_stream &i, neo::gradient_entry &ge);
26 bin_data &operator<<(bin_data &o, neo::fixed_gradient_entry const &fge);
27}// namespace mlab
28
29namespace neo {
30
32 protected:
33 float _time = 0.f;
35
37
39
40 friend mlab::bin_stream &mlab::operator>>(mlab::bin_stream &, neo::gradient_entry &);
41
42 public:
43 [[nodiscard]] inline float time() const;
44
45 [[nodiscard]] inline rgb color() const;
46
47 inline void set_color(rgb color);
48
50
52
54
55 inline fixed_gradient_entry(float t, rgb c);
56
57 inline fixed_gradient_entry &operator=(rgb c);
58
59 [[nodiscard]] std::string to_string() const;
60 };
61
63 friend class gradient;
64 friend mlab::bin_stream &mlab::operator>>(mlab::bin_stream &, gradient_entry &);
65
66 public:
68 using fixed_gradient_entry::operator=;
72
73 inline void set_time(float t);
74
75 gradient_entry() = default;
76
77 gradient_entry(gradient_entry const &) = default;
78
79 gradient_entry(gradient_entry &&) noexcept = default;
80
81 gradient_entry &operator=(gradient_entry const &) = default;
82
83 gradient_entry &operator=(gradient_entry &&) noexcept = default;
84 };
85
86 class gradient {
87 std::vector<gradient_entry> _entries;
88
89 public:
92
93 gradient() = default;
94 explicit gradient(std::vector<gradient_entry> entries);
95 explicit gradient(std::vector<fixed_gradient_entry> const &entries);
96 explicit gradient(std::vector<rgb> const &colors);
97 explicit gradient(std::vector<hsv> const &colors);
98
99 [[nodiscard]] inline std::size_t size() const;
100
101 [[nodiscard]] inline bool empty() const;
102
103 [[nodiscard]] inline const_iterator begin() const;
104
105 [[nodiscard]] inline const_iterator end() const;
106
107 [[nodiscard]] inline iterator begin();
108
109 [[nodiscard]] inline iterator end();
110
111 [[nodiscard]] inline fixed_gradient_entry &front();
112
113 [[nodiscard]] inline fixed_gradient_entry &back();
114
115 [[nodiscard]] inline fixed_gradient_entry const &front() const;
116
117 [[nodiscard]] inline fixed_gradient_entry const &back() const;
118
119 inline std::pair<iterator, bool> emplace(fixed_gradient_entry entry);
120
121 std::pair<iterator, bool> emplace(gradient_entry entry);
122
123 [[nodiscard]] const_iterator lower_bound(float t) const;
124
125 [[nodiscard]] const_iterator upper_bound(float t) const;
126
127 void normalize();
128
129 [[nodiscard]] inline fixed_gradient_entry const &operator[](std::size_t i) const;
130 [[nodiscard]] inline fixed_gradient_entry &operator[](std::size_t i);
131
132 rgb sample(float t, blending_method = blend_linear) const;
133
134 void sample_uniform(float period, float offset, std::vector<rgb> &buffer,
135 blending_method method = blend_linear) const;
136
137 std::vector<rgb> sample_uniform(float period, float offset, std::size_t num_samples,
138 std::vector<rgb> reuse_buffer = {}, blending_method method = blend_linear) const;
139
140 [[nodiscard]] std::string to_string() const;
141 };
142}// namespace neo
143
144namespace mlab {
145 bin_data &operator<<(bin_data &o, neo::gradient const &g);
146 bin_stream &operator>>(bin_stream &i, neo::gradient &g);
147}// namespace mlab
148
149namespace neo {
150 bool gradient::empty() const {
151 return _entries.empty();
152 }
153
154 std::size_t gradient::size() const {
155 return _entries.size();
156 }
157
158
159 gradient::const_iterator gradient::begin() const {
160 return _entries.data();
161 }
162
163 gradient::const_iterator gradient::end() const {
164 return begin() + size();
165 }
166
167 gradient::iterator gradient::begin() {
168 return _entries.data();
169 }
170
171 gradient::iterator gradient::end() {
172 return begin() + size();
173 }
174
175 fixed_gradient_entry &gradient::front() {
176 return _entries.front();
177 }
178
179 fixed_gradient_entry &gradient::back() {
180 return _entries.back();
181 }
182
183 fixed_gradient_entry const &gradient::front() const {
184 return _entries.front();
185 }
186
187 fixed_gradient_entry const &gradient::back() const {
188 return _entries.back();
189 }
190
191 void fixed_gradient_entry::set_color(rgb color) {
192 _color = color;
193 }
194
195 fixed_gradient_entry::fixed_gradient_entry(float t, rgb c) : _time{t}, _color{c} {}
196
198 return _time;
199 }
200
202 return _color;
203 }
204
206 set_color(c);
207 return *this;
208 }
209
211 _time = t;
212 }
213
214 std::pair<gradient::iterator, bool> gradient::emplace(fixed_gradient_entry entry) {
215 return emplace(gradient_entry{entry.time(), entry.color()});
216 }
217
218 fixed_gradient_entry const &gradient::operator[](std::size_t i) const {
219 return _entries.at(i);
220 }
222 return _entries.at(i);
223 }
224}// namespace neo
225#endif//NEO_GRADIENT_HPP
Definition: gradient.hpp:31
fixed_gradient_entry()=default
std::string to_string() const
Definition: gradient.cpp:112
fixed_gradient_entry & operator=(fixed_gradient_entry &&) noexcept=default
float _time
Definition: gradient.hpp:33
float time() const
Definition: gradient.hpp:197
rgb color() const
Definition: gradient.hpp:201
rgb _color
Definition: gradient.hpp:34
fixed_gradient_entry & operator=(fixed_gradient_entry const &)=default
void set_color(rgb color)
Definition: gradient.hpp:191
Definition: gradient.hpp:62
gradient_entry()=default
void set_time(float t)
Definition: gradient.hpp:210
gradient_entry(gradient_entry &&) noexcept=default
gradient_entry(gradient_entry const &)=default
Definition: gradient.hpp:86
gradient()=default
std::pair< iterator, bool > emplace(fixed_gradient_entry entry)
Definition: gradient.hpp:214
fixed_gradient_entry const * const_iterator
Definition: gradient.hpp:91
std::vector< gradient_entry > _entries
Definition: gradient.hpp:87
fixed_gradient_entry const & operator[](std::size_t i) const
Definition: gradient.hpp:218
Definition: any_fx.cpp:81
mlab::bin_stream & operator>>(mlab::bin_stream &s, neo::any_fx_config &fx_cfg)
Definition: any_fx.cpp:83
bin_data & operator<<(bin_data &o, neo::rgb c)
Definition: color.cpp:157
Definition: any_fx.cpp:7
rgb(&)(rgb l, rgb r, float t) blending_method
Definition: gradient.hpp:13
rgb blend_linear(rgb l, rgb r, float t)
Definition: gradient.cpp:96
rgb blend_nearest_neighbor(rgb l, rgb r, float t)
Definition: gradient.cpp:108
rgb blend_round_down(rgb l, rgb, float)
Definition: gradient.cpp:100
rgb blend_round_up(rgb, rgb r, float)
Definition: gradient.cpp:104
Definition: color.hpp:47