#include namespace Color { rgba Generator::rgbFromRatio(double ratio, int16_t alpha = 255) { int normalized = int(ratio * 256 * 6); int x = normalized % 256; int16_t red = 0, green = 0, blue = 0; switch (normalized / 256) { case 0: red = 255; green = x; blue = 0; break; case 1: red = 255 - x; green = 255; blue = 0; break; case 2: red = 0; green = 255; blue = x; break; case 3: red = 0; green = 255 - x; blue = 255; break; case 4: red = x; green = 0; blue = 255; break; case 5: red = 255; green = 0; blue = 255 - x; break; } return {red, green, blue, alpha}; } rgb Generator::rgbFromHSV(hsv in) { double hh, p, q, t, ff; long i; rgb out; if (in.s <= 0.0) { // < is bogus, just shuts up warnings out.r = in.v; out.g = in.v; out.b = in.v; return out; } hh = in.h; if (hh >= 360.0) hh = 0.0; hh /= 60.0; i = (long)hh; ff = hh - i; p = in.v * (1.0 - in.s); q = in.v * (1.0 - (in.s * ff)); t = in.v * (1.0 - (in.s * (1.0 - ff))); switch (i) { case 0: out.r = in.v; out.g = t; out.b = p; break; case 1: out.r = q; out.g = in.v; out.b = p; break; case 2: out.r = p; out.g = in.v; out.b = t; break; case 3: out.r = p; out.g = q; out.b = in.v; break; case 4: out.r = t; out.g = p; out.b = in.v; break; case 5: default: out.r = in.v; out.g = p; out.b = q; break; } return out; } } // namespace Color