Philips GoGear SA9200 port. Working bootloader and normal builds, including sound...
[Rockbox.git] / apps / plugins / lib / rgb_hsv.c
blob0d424b914959b0cf1e63703bc0e4080bdee20057
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2006 Antoine Cellerier <dionoea -at- videolan -dot- org>
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "rgb_hsv.h"
22 /***********************************************************************
23 * Colorspace transformations
24 ***********************************************************************
25 * r, g and b range from 0 to 255
26 * h ranges from 0 to 3599 (which in fact means 0.0 to 359.9).
27 * 360 is the same as 0 (it loops)
28 * s and v range from 0 to 255 (which in fact means 0.00 to 1.00)
29 ***********************************************************************/
31 void rgb2hsv( int r, int g, int b, int *h, int *s, int *v )
33 int max;
34 int min;
36 max = r > g ? r : g;
37 if( b > max ) max = b;
39 min = r < g ? r : g;
40 if( b < min ) min = b;
42 if( max == 0 )
44 *v = 0;
45 *h = 0; *s = 0; /* Random since it's black */
46 return;
48 else if( max == min )
50 *h = 0; /* Random since it's gray */
52 else if( max == r && g >= b )
54 *h = ( 10 * 60 * ( g - b )/( max - min ) );
56 else if( max == r && g < b )
58 *h = ( 10 * ( 60 * ( g - b )/( max - min ) + 360 ));
60 else if( max == g )
62 *h = ( 10 * ( 60 * ( b - r )/( max - min ) + 120 ));
64 else// if( max == b )
66 *h = ( 10 * ( 60 * ( r - g )/( max - min ) + 240 ));
69 /* Just in case ? */
70 while( *h < 0 ) *h += 3600;
71 while( *h >= 3600 ) *h-= 3600;
73 *s = (( max - min )*255)/max;
74 *v = max;
77 void hsv2rgb( int h, int s, int v, int *r, int *g, int *b )
79 int f, p, q, t;
80 while( h < 0 ) h += 3600;
81 while( h >= 3600 ) h-= 3600;
82 f = h%600;
83 p = ( v * ( 255 - s ) ) / ( 255 );
84 q = ( v * ( 600*255 - f*s ) ) / ( 255 * 600 );
85 t = ( v * ( 600*255 - ( 600 - f ) * s ) ) / ( 255 * 600 );
88 if( s == 0 ) /* gray */
90 *r = v;
91 *g = *r;
92 *b = *r;
93 return;
96 switch( h/600 )
98 case 0:
99 *r = v;
100 *g = t;
101 *b = p;
102 break;
103 case 1:
104 *r = q;
105 *g = v;
106 *b = p;
107 break;
108 case 2:
109 *r = p;
110 *g = v;
111 *b = t;
112 break;
113 case 3:
114 *r = p;
115 *g = q;
116 *b = v;
117 break;
118 case 4:
119 *r = t;
120 *g = p;
121 *b = v;
122 break;
123 case 5:
124 *r = v;
125 *g = p;
126 *b = q;
127 break;