aboutsummaryrefslogtreecommitdiff
path: root/hsv2rgb.c
blob: bd7d7e23082e3912f9c41314e4d9577190014d4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* $Id$ */

#include <math.h>

/* 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)
{
	float   F, M, N, K;
	int     i;

	if (s == 0.0) {
		*r = *g = *b = v;
	} else {
		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; *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;
		}
	}
}