-
Notifications
You must be signed in to change notification settings - Fork 0
/
gradient.hpp
78 lines (71 loc) · 1.6 KB
/
gradient.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef _c9b3775782f94483965d7b3ca0224896
#define _c9b3775782f94483965d7b3ca0224896
#include <cmath>
#include <limits>
#include <cstdint>
#include "range_map.hpp"
namespace bsb
{
namespace gradient
{
struct rgb
{
using value_type = uint8_t;
value_type r, g, b;
};
//rainbow gradient
inline rgb gradient_value(const long double value)
{
const uint8_t regions = 6;
auto max_rgb = std::numeric_limits<rgb::value_type>::max();
long double region;
auto subregion_value = (rgb::value_type)(std::modf(value * regions, ®ion) * max_rgb);
auto region_value = (rgb::value_type)region % 6;
rgb gradient{ 0, 0, 0 };
switch (region_value)
{
case 0:
gradient.r = max_rgb;
gradient.g = subregion_value;
gradient.b = 0;
break;
case 1:
gradient.r = max_rgb - subregion_value;
gradient.g = max_rgb;
gradient.b = 0;
break;
case 2:
gradient.r = 0;
gradient.g = max_rgb;
gradient.b = subregion_value;
break;
case 3:
gradient.r = 0;
gradient.g = max_rgb - subregion_value;
gradient.b = max_rgb;
break;
case 4:
gradient.r = subregion_value;
gradient.g = 0;
gradient.b = max_rgb;
break;
case 5:
gradient.r = max_rgb;
gradient.g = 0;
gradient.b = max_rgb - subregion_value;
break;
};
return gradient;
}
//gradient between two colors
inline rgb gradient_value(const long double value, const rgb & from_color, const rgb & to_color)
{
using namespace range_map;
return {
scale_value(value, from_color.r, to_color.r),
scale_value(value, from_color.g, to_color.g),
scale_value(value, from_color.b, to_color.b) };
}
}
}
#endif