From 4eb398d0af04e27327d0482bf1917066420b97a2 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 22 Jun 2013 20:16:20 +0000 Subject: Switch to X11 --- hsv2rgb.c | 97 ++++++++++++--------------------------------------------------- 1 file changed, 18 insertions(+), 79 deletions(-) (limited to 'hsv2rgb.c') diff --git a/hsv2rgb.c b/hsv2rgb.c index 6339533..bd7d7e2 100644 --- a/hsv2rgb.c +++ b/hsv2rgb.c @@ -1,96 +1,35 @@ /* $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 +#include -int -hsv2rgb(uint8_t *r, uint8_t *g, uint8_t *b, float h, float s, float v) +/* input: h, s, v [0..1] + * output: r, g, b [0..1] + */ +void +hsv2rgb(float *r, float *g, float *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; + *r = *g = *b = v; } 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 */ - + if (h == 1.0) + h = 0.0; + h *= 6.0; + i = floorf(h); + F = h - i; 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; + case 0: *r = v; *g = K; *b = M; break; + case 1: *r = N; *g = v; *b = M; break; + case 2: *r = M; *g = v; *b = K; break; + case 3: *r = M; *g = N; *b = v; break; + case 4: *r = K; *g = M; *b = v; break; + case 5: *r = v; *g = M; *b = N; break; } } - - return 0; } -- cgit v1.2.3