6 color.c - color manipulation functions
11 i_rgb_to_hsvf(&color);
12 i_hsv_to_rgbf(&color);
16 A collection of utility functions for converting between color spaces.
20 #define EPSILON (1e-8)
23 =item i_rgb2hsvf(&color)
25 Converts the first 3 channels of color into hue, saturation and value.
27 Each value is scaled into the range 0 to 1.0.
31 void i_rgb_to_hsvf(i_fcolor *color) {
36 v = max(max(color->rgb.r, color->rgb.g), color->rgb.b);
37 temp = min(min(color->rgb.r, color->rgb.g), color->rgb.b);
45 Cr = (v - color->rgb.r)/(v-temp);
46 Cg = (v - color->rgb.g)/(v-temp);
47 Cb = (v - color->rgb.b)/(v-temp);
48 if (color->rgb.r == v)
50 else if (color->rgb.g == v)
52 else if (color->rgb.b == v)
58 color->channel[0] = h / 360.0;
59 color->channel[1] = s;
60 color->channel[2] = v;
64 =item i_hsv_to_rgbf(&color)
66 Convert a HSV value to an RGB value, each value ranges from 0 to 1.
71 void i_hsv_to_rgbf(i_fcolor *color) {
72 double h = color->channel[0];
73 double s = color->channel[1];
74 double v = color->channel[2];
76 if (color->channel[1] < EPSILON) {
77 /* ignore h in this case */
78 color->rgb.r = color->rgb.g = color->rgb.b = v;
88 k = v * (1 - s * (1 - f));
91 color->rgb.r = v; color->rgb.g = k; color->rgb.b = m;
94 color->rgb.r = n; color->rgb.g = v; color->rgb.b = m;
97 color->rgb.r = m; color->rgb.g = v; color->rgb.b = k;
100 color->rgb.r = m; color->rgb.g = n; color->rgb.b = v;
103 color->rgb.r = k; color->rgb.g = m; color->rgb.b = v;
106 color->rgb.r = v; color->rgb.g = m; color->rgb.b = n;
117 Tony Cook <tony@develop-help.com>