diff options
Diffstat (limited to 'color-utils.c')
| -rwxr-xr-x | color-utils.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/color-utils.c b/color-utils.c new file mode 100755 index 0000000..d01da3a --- /dev/null +++ b/color-utils.c @@ -0,0 +1,91 @@ +#ifndef color_utils_c +#define color_utils_c +#include <math.h> + +struct RGB +{ + unsigned char R; + unsigned char G; + unsigned char B; +}; +struct HSV +{ + double H; + double S; + double V; +}; +struct RGB HSVToRGB(struct HSV hsv) { + double r = 0, g = 0, b = 0; + + if (hsv.S == 0) + { + r = hsv.V; + g = hsv.V; + b = hsv.V; + } + else + { + int i; + double f, p, q, t; + + if (hsv.H == 360) + hsv.H = 0; + else + hsv.H = hsv.H / 60; + + i = (int)trunc(hsv.H); + f = hsv.H - i; + + p = hsv.V * (1.0 - hsv.S); + q = hsv.V * (1.0 - (hsv.S * f)); + t = hsv.V * (1.0 - (hsv.S * (1.0 - f))); + + switch (i) + { + case 0: + r = hsv.V; + g = t; + b = p; + break; + + case 1: + r = q; + g = hsv.V; + b = p; + break; + + case 2: + r = p; + g = hsv.V; + b = t; + break; + + case 3: + r = p; + g = q; + b = hsv.V; + break; + + case 4: + r = t; + g = p; + b = hsv.V; + break; + + default: + r = hsv.V; + g = p; + b = q; + break; + } + + } + + struct RGB rgb; + rgb.R = r * 255; + rgb.G = g * 255; + rgb.B = b * 255; + + return rgb; +} +#endif |
