1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2006 Antoine Cellerier <dionoea -at- videolan -dot- org>
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
24 /***********************************************************************
25 * Colorspace transformations
26 ***********************************************************************
27 * r, g and b range from 0 to 255
28 * h ranges from 0 to 3599 (which in fact means 0.0 to 359.9).
29 * 360 is the same as 0 (it loops)
30 * s and v range from 0 to 255 (which in fact means 0.00 to 1.00)
31 ***********************************************************************/
33 void rgb2hsv( int r
, int g
, int b
, int *h
, int *s
, int *v
)
39 if( b
> max
) max
= b
;
42 if( b
< min
) min
= b
;
47 *h
= 0; *s
= 0; /* Random since it's black */
52 *h
= 0; /* Random since it's gray */
54 else if( max
== r
&& g
>= b
)
56 *h
= ( 10 * 60 * ( g
- b
)/( max
- min
) );
58 else if( max
== r
&& g
< b
)
60 *h
= ( 10 * ( 60 * ( g
- b
)/( max
- min
) + 360 ));
64 *h
= ( 10 * ( 60 * ( b
- r
)/( max
- min
) + 120 ));
68 *h
= ( 10 * ( 60 * ( r
- g
)/( max
- min
) + 240 ));
72 while( *h
< 0 ) *h
+= 3600;
73 while( *h
>= 3600 ) *h
-= 3600;
75 *s
= (( max
- min
)*255)/max
;
79 void hsv2rgb( int h
, int s
, int v
, int *r
, int *g
, int *b
)
82 while( h
< 0 ) h
+= 3600;
83 while( h
>= 3600 ) h
-= 3600;
85 p
= ( v
* ( 255 - s
) ) / ( 255 );
86 q
= ( v
* ( 600*255 - f
*s
) ) / ( 255 * 600 );
87 t
= ( v
* ( 600*255 - ( 600 - f
) * s
) ) / ( 255 * 600 );
90 if( s
== 0 ) /* gray */