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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
// Special HSV -> RGB converter for use with the color selector classes
// Takes values in the range [ 0.0 , 1.0 ]
// Gives values in the range [ 0.0 , 255.0 ]
void hsv_to_rgb_range_one(float *h_, float *s_, float *v_)
{
gint i;
gdouble f, w, q, t;
float h, s, v;
float r, g, b;
r = g = b = 0.0; // silence gcc warning
h = *h_;
s = *s_;
v = *v_;
h = h - floor(h);
s = CLAMP(s, 0.0, 1.0);
v = CLAMP(v, 0.0, 1.0);
gdouble hue = h;
if( hue == 1.0 )
hue = 0.0;
else
hue *= 6.0;
i = (gint) hue;
f = hue - i;
w = v * (1.0 - s);
q = v * (1.0 - (s * f));
t = v * (1.0 - (s * (1.0 - f)));
switch (i)
{
case 0:
r = v;
g = t;
b = w;
break;
case 1:
r = q;
g = v;
b = w;
break;
case 2:
r = w;
g = v;
b = t;
break;
case 3:
r = w;
g = q;
b = v;
break;
case 4:
r = t;
g = w;
b = v;
break;
case 5:
r = v;
g = w;
b = q;
break;
}
*h_ = r*255.0f;
*s_ = g*255.0f;
*v_ = b*255.0f;
}
|