48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#pragma once
|
|
|
|
class Color {
|
|
public:
|
|
Color() = default;
|
|
Color(int r, int g, int b) : m_r(r), m_g(g), m_b(b) {}
|
|
|
|
int r() { return m_r; }
|
|
int g() { return m_g; }
|
|
int b() { return m_b; }
|
|
|
|
void set_r(int r) { m_r = r; }
|
|
void set_g(int g) { m_g = g; }
|
|
void set_b(int b) { m_b = b; }
|
|
|
|
static Color from_hsv(int h, int s, int v) {
|
|
if(s == 0) {
|
|
return {v, v, v};
|
|
}
|
|
|
|
int region = h / 43;
|
|
int remainder = (h - region * 43) * 6;
|
|
|
|
int p = (v * (255 - s)) >> 8;
|
|
int q = (v * (255 - ((s * remainder) >> 8))) >> 8;
|
|
int t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
|
|
|
|
switch(region) {
|
|
case 0:
|
|
return {v, t, p};
|
|
case 1:
|
|
return {q, v, p};
|
|
case 2:
|
|
return {p, v, t};
|
|
case 3:
|
|
return {p, q, v};
|
|
case 4:
|
|
return {t, p, v};
|
|
default:
|
|
return {v, p ,q};
|
|
}
|
|
}
|
|
|
|
private:
|
|
int m_r;
|
|
int m_g;
|
|
int m_b;
|
|
};
|