-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcolor.cpp
83 lines (66 loc) · 1.14 KB
/
color.cpp
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
79
80
81
82
83
#include "color.hpp"
#include <cmath>
#include <optional>
static int addHue(const int h1, const int h2){
if(h1 + h2 > 360)
return std::abs(h1 - h2);
if(h1 + h2 < 0)
return 360 - std::abs(h1 - h2);
return h1 + h2;
}
static int addVal(const int v1, const int v2){
if(v1 + v2 > 100)
return 100;
if(v1 + v2 < 0)
return 0;
return v1 + v2;
}
std::optional<RGB> Color::getRGB(){
if(!_set)
return {};
return {rgb};
}
std::optional<HSV> Color::getHSV(){
if(!_set)
return {};
return {hsv};
}
HSV& HSV::operator+=(const HSV& in){
// hue
h = addHue(h, in.h);
// saturation
s = addVal(s, in.s);
// value
v = addVal(v, in.v);
return (*this);
}
HSV& HSV::operator-=(const HSV& in){
// hue
h = addHue(h, -in.h);
// saturation
s = addVal(s, -in.s);
// value
v = addVal(v, -in.v);
return(*this);
}
void Color::set(RGB v){
_set = true;
rgb = v;
hsv = v;
}
void Color::set(HSV v){
_set = true;
rgb = v;
hsv = v;
}
Color::Color(HSV v){
set(v);
}
Color::Color(RGB v){
set(v);
}
Color::Color(){
}
std::string RGBtos(const RGB& in){
return std::to_string(in.r) + ", " + std::to_string(in.g) + ", " + std::to_string(in.b);
}