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.
21 #define EPSILON (1e-8)
23 #define my_max(a, b) ((a) < (b) ? (b) : (a))
24 #define my_min(a, b) ((a) > (b) ? (b) : (a))
27 =item i_rgb2hsvf(&color)
29 Converts the first 3 channels of color into hue, saturation and value.
31 Each value is scaled into the range 0 to 1.0.
35 void i_rgb_to_hsvf(i_fcolor *color) {
40 v = my_max(my_max(color->rgb.r, color->rgb.g), color->rgb.b);
41 temp = my_min(my_min(color->rgb.r, color->rgb.g), color->rgb.b);
49 Cr = (v - color->rgb.r)/(v-temp);
50 Cg = (v - color->rgb.g)/(v-temp);
51 Cb = (v - color->rgb.b)/(v-temp);
52 if (color->rgb.r == v)
54 else if (color->rgb.g == v)
56 else if (color->rgb.b == v)
62 color->channel[0] = h / 360.0;
63 color->channel[1] = s;
64 color->channel[2] = v;
68 =item i_rgb2hsv(&color)
70 Converts the first 3 channels of color into hue, saturation and value.
72 Each value is scaled into the range 0 to 255.
76 void i_rgb_to_hsv(i_color *color) {
81 v = my_max(my_max(color->rgb.r, color->rgb.g), color->rgb.b);
82 temp = my_min(my_min(color->rgb.r, color->rgb.g), color->rgb.b);
90 Cr = (v - color->rgb.r)/(v-temp);
91 Cg = (v - color->rgb.g)/(v-temp);
92 Cb = (v - color->rgb.b)/(v-temp);
93 if (color->rgb.r == v)
95 else if (color->rgb.g == v)
97 else if (color->rgb.b == v)
103 color->channel[0] = h * 255 / 360.0;
104 color->channel[1] = s;
105 color->channel[2] = v;
109 =item i_hsv_to_rgbf(&color)
111 Convert a HSV value to an RGB value, each value ranges from 0 to 1.
116 void i_hsv_to_rgbf(i_fcolor *color) {
117 double h = color->channel[0];
118 double s = color->channel[1];
119 double v = color->channel[2];
121 if (color->channel[1] < EPSILON) {
122 /* ignore h in this case */
123 color->rgb.r = color->rgb.g = color->rgb.b = v;
128 h = fmod(h, 1.0) * 6;
133 k = v * (1 - s * (1 - f));
136 color->rgb.r = v; color->rgb.g = k; color->rgb.b = m;
139 color->rgb.r = n; color->rgb.g = v; color->rgb.b = m;
142 color->rgb.r = m; color->rgb.g = v; color->rgb.b = k;
145 color->rgb.r = m; color->rgb.g = n; color->rgb.b = v;
148 color->rgb.r = k; color->rgb.g = m; color->rgb.b = v;
151 color->rgb.r = v; color->rgb.g = m; color->rgb.b = n;
158 =item i_hsv_to_rgb(&color)
160 Convert a HSV value to an RGB value, each value ranges from 0 to 1.
165 void i_hsv_to_rgb(i_color *color) {
166 double h = color->channel[0];
167 double s = color->channel[1];
168 double v = color->channel[2];
170 if (color->channel[1] == 0) {
171 /* ignore h in this case */
172 color->rgb.r = color->rgb.g = color->rgb.b = v;
180 m = v * (255 - s) / 255;
181 n = v * (255 - s * f) / 255;
182 k = v * (255 - s * (1 - f)) / 255;
185 color->rgb.r = v; color->rgb.g = k; color->rgb.b = m;
188 color->rgb.r = n; color->rgb.g = v; color->rgb.b = m;
191 color->rgb.r = m; color->rgb.g = v; color->rgb.b = k;
194 color->rgb.r = m; color->rgb.g = n; color->rgb.b = v;
197 color->rgb.r = k; color->rgb.g = m; color->rgb.b = v;
200 color->rgb.r = v; color->rgb.g = m; color->rgb.b = n;
211 Tony Cook <tony@develop-help.com>