From fce59d949c0a4767009a9db94f0af0903ff31be1 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 12 Mar 2011 01:53:00 +0000 Subject: sio spectrogram --- hsv2rgb.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 hsv2rgb.c (limited to 'hsv2rgb.c') diff --git a/hsv2rgb.c b/hsv2rgb.c new file mode 100644 index 0000000..6339533 --- /dev/null +++ b/hsv2rgb.c @@ -0,0 +1,96 @@ +/* $Id$ */ +/* hsv2rgb.c + * Convert Hue Saturation Value to Red Green Blue + * + * P.J. 08-Aug-98 + * + * Reference: + * D. F. Rogers + * Procedural Elements for Computer Graphics + * McGraw Hill 1985 + */ + +#include + +int +hsv2rgb(uint8_t *r, uint8_t *g, uint8_t *b, float h, float s, float v) +{ + /* + * Purpose: + * Convert HSV values to RGB values + * All values are in the range [0.0 .. 1.0] + */ + float F, M, N, K; + int i; + + /* normalize */ + if (s < 0.0) { + h += 0.5; + s = -s; + } + + if (v < 0.0) + v = -v; + + while (h > 1.0) + h -= 1.0; + while (h < 0.0) + h += 1.0; + + + if (s == 0.0) { + /* + * Achromatic case, set level of grey + */ + *r = v * 255; + *g = v * 255; + *b = v * 255; + } else { + /* + * Determine levels of primary colours. + */ + + h = (h >= 1.0) ? 0.0 : h * 6; + i = (int)h; /* should be in the range 0..5 */ + F = h - i; /* fractional part */ + + M = v * (1 - s); + N = v * (1 - s * F); + K = v * (1 - s * (1 - F)); + + switch (i) { + case 0: + *r = v * 255; + *g = K * 255; + *b = M * 255; + break; + case 1: + *r = N * 255; + *g = v * 255; + *b = M * 255; + break; + case 2: + *r = M * 255; + *g = v * 255; + *b = K * 255; + break; + case 3: + *r = M * 255; + *g = N * 255; + *b = v * 255; + break; + case 4: + *r = K * 255; + *g = M * 255; + *b = v * 255; + break; + case 5: + *r = v * 255; + *g = M * 255; + *b = N * 255; + break; + } + } + + return 0; +} -- cgit v1.2.3