#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; };