7 color.c - color manipulation functions
12 i_rgb_to_hsvf(&color);
13 i_hsv_to_rgbf(&color);
17 A collection of utility functions for converting between color spaces.
24 #define EPSILON (1e-8)
26 #define my_max(a, b) ((a) < (b) ? (b) : (a))
27 #define my_min(a, b) ((a) > (b) ? (b) : (a))
30 =item i_rgb2hsvf(&color)
32 Converts the first 3 channels of color into hue, saturation and value.
34 Each value is scaled into the range 0 to 1.0.
38 void i_rgb_to_hsvf(i_fcolor *color) {
43 v = my_max(my_max(color->rgb.r, color->rgb.g), color->rgb.b);
44 temp = my_min(my_min(color->rgb.r, color->rgb.g), color->rgb.b);
52 Cr = (v - color->rgb.r)/(v-temp);
53 Cg = (v - color->rgb.g)/(v-temp);
54 Cb = (v - color->rgb.b)/(v-temp);
55 if (color->rgb.r == v)
57 else if (color->rgb.g == v)
59 else if (color->rgb.b == v)
65 color->channel[0] = h / 360.0;
66 color->channel[1] = s;
67 color->channel[2] = v;
71 =item i_rgb2hsv(&color)
73 Converts the first 3 channels of color into hue, saturation and value.
75 Each value is scaled into the range 0 to 255.
79 void i_rgb_to_hsv(i_color *color) {
84 v = my_max(my_max(color->rgb.r, color->rgb.g), color->rgb.b);
85 temp = my_min(my_min(color->rgb.r, color->rgb.g), color->rgb.b);
93 Cr = (v - color->rgb.r)/(v-temp);
94 Cg = (v - color->rgb.g)/(v-temp);
95 Cb = (v - color->rgb.b)/(v-temp);
96 if (color->rgb.r == v)
98 else if (color->rgb.g == v)
100 else if (color->rgb.b == v)
106 color->channel[0] = h * 255 / 360.0;
107 color->channel[1] = s;
108 color->channel[2] = v;
112 =item i_hsv_to_rgbf(&color)
114 Convert a HSV value to an RGB value, each value ranges from 0 to 1.
119 void i_hsv_to_rgbf(i_fcolor *color) {
120 double h = color->channel[0];
121 double s = color->channel[1];
122 double v = color->channel[2];
124 if (color->channel[1] < EPSILON) {
125 /* ignore h in this case */
126 color->rgb.r = color->rgb.g = color->rgb.b = v;
131 h = fmod(h, 1.0) * 6;
136 k = v * (1 - s * (1 - f));
139 color->rgb.r = v; color->rgb.g = k; color->rgb.b = m;
142 color->rgb.r = n; color->rgb.g = v; color->rgb.b = m;
145 color->rgb.r = m; color->rgb.g = v; color->rgb.b = k;
148 color->rgb.r = m; color->rgb.g = n; color->rgb.b = v;
151 color->rgb.r = k; color->rgb.g = m; color->rgb.b = v;
154 color->rgb.r = v; color->rgb.g = m; color->rgb.b = n;
161 =item i_hsv_to_rgb(&color)
163 Convert a HSV value to an RGB value, each value ranges from 0 to 1.
168 void i_hsv_to_rgb(i_color *color) {
169 double h = color->channel[0];
170 double s = color->channel[1];
171 double v = color->channel[2];
173 if (color->channel[1] == 0) {
174 /* ignore h in this case */
175 color->rgb.r = color->rgb.g = color->rgb.b = v;
184 m = 0.5 + v * (255 - s) / 255;
185 n = 0.5 + v * (255 - s * f) / 255;
186 k = 0.5 + v * (255 - s * (1 - f)) / 255;
189 color->rgb.r = v; color->rgb.g = k; color->rgb.b = m;
192 color->rgb.r = n; color->rgb.g = v; color->rgb.b = m;
195 color->rgb.r = m; color->rgb.g = v; color->rgb.b = k;
198 color->rgb.r = m; color->rgb.g = n; color->rgb.b = v;
201 color->rgb.r = k; color->rgb.g = m; color->rgb.b = v;
204 color->rgb.r = v; color->rgb.g = m; color->rgb.b = n;
215 Tony Cook <tony@develop-help.com>