103 lines
1.6 KiB
C++
103 lines
1.6 KiB
C++
#include <VulcanoLE/Colors/ColorHelper.h>
|
|
|
|
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
|