RGB <-> HSV colorspace conversion lib
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10253 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
61c301bf8d
commit
5e306b4c19
3 changed files with 165 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
|||
configfile.c
|
||||
playback_control.c
|
||||
rgb_hsv.c
|
||||
#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && (CONFIG_LCD != LCD_IPOD2BPP)
|
||||
gray_core.c
|
||||
gray_draw.c
|
||||
|
|
129
apps/plugins/lib/rgb_hsv.c
Normal file
129
apps/plugins/lib/rgb_hsv.c
Normal file
|
@ -0,0 +1,129 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 Antoine Cellerier <dionoea -at- videolan -dot- org>
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "rgb_hsv.h"
|
||||
|
||||
/***********************************************************************
|
||||
* Colorspace transformations
|
||||
***********************************************************************
|
||||
* r, g and b range from 0 to 255
|
||||
* h ranges from 0 to 3599 (which in fact means 0.0 to 359.9).
|
||||
* 360 is the same as 0 (it loops)
|
||||
* s and v range from 0 to 255 (which in fact means 0.00 to 1.00)
|
||||
***********************************************************************/
|
||||
|
||||
void rgb2hsv( int r, int g, int b, int *h, int *s, int *v )
|
||||
{
|
||||
int max;
|
||||
int min;
|
||||
|
||||
max = r > g ? r : g;
|
||||
if( b > max ) max = b;
|
||||
|
||||
min = r < g ? r : g;
|
||||
if( b < min ) min = b;
|
||||
|
||||
if( max == 0 )
|
||||
{
|
||||
*v = 0;
|
||||
*h = 0; *s = 0; /* Random since it's black */
|
||||
return;
|
||||
}
|
||||
else if( max == min )
|
||||
{
|
||||
*h = 0; /* Random since it's gray */
|
||||
}
|
||||
else if( max == r && g >= b )
|
||||
{
|
||||
*h = ( 10 * 60 * ( g - b )/( max - min ) );
|
||||
}
|
||||
else if( max == r && g < b )
|
||||
{
|
||||
*h = ( 10 * ( 60 * ( g - b )/( max - min ) + 360 ));
|
||||
}
|
||||
else if( max == g )
|
||||
{
|
||||
*h = ( 10 * ( 60 * ( b - r )/( max - min ) + 120 ));
|
||||
}
|
||||
else// if( max == b )
|
||||
{
|
||||
*h = ( 10 * ( 60 * ( r - g )/( max - min ) + 240 ));
|
||||
}
|
||||
|
||||
/* Just in case ? */
|
||||
while( *h < 0 ) *h += 3600;
|
||||
while( *h >= 3600 ) *h-= 3600;
|
||||
|
||||
*s = (( max - min )*255)/max;
|
||||
*v = max;
|
||||
}
|
||||
|
||||
void hsv2rgb( int h, int s, int v, int *r, int *g, int *b )
|
||||
{
|
||||
int f, p, q, t;
|
||||
while( h < 0 ) h += 3600;
|
||||
while( h >= 3600 ) h-= 3600;
|
||||
f = h%600;
|
||||
p = ( v * ( 255 - s ) ) / ( 255 );
|
||||
q = ( v * ( 600*255 - f*s ) ) / ( 255 * 600 );
|
||||
t = ( v * ( 600*255 - ( 600 - f ) * s ) ) / ( 255 * 600 );
|
||||
|
||||
|
||||
if( s == 0 ) /* gray */
|
||||
{
|
||||
*r = v;
|
||||
*g = *r;
|
||||
*b = *r;
|
||||
return;
|
||||
}
|
||||
|
||||
switch( h/600 )
|
||||
{
|
||||
case 0:
|
||||
*r = v;
|
||||
*g = t;
|
||||
*b = p;
|
||||
break;
|
||||
case 1:
|
||||
*r = q;
|
||||
*g = v;
|
||||
*b = p;
|
||||
break;
|
||||
case 2:
|
||||
*r = p;
|
||||
*g = v;
|
||||
*b = t;
|
||||
break;
|
||||
case 3:
|
||||
*r = p;
|
||||
*g = q;
|
||||
*b = v;
|
||||
break;
|
||||
case 4:
|
||||
*r = t;
|
||||
*g = p;
|
||||
*b = v;
|
||||
break;
|
||||
case 5:
|
||||
*r = v;
|
||||
*g = p;
|
||||
*b = q;
|
||||
break;
|
||||
}
|
||||
}
|
35
apps/plugins/lib/rgb_hsv.h
Normal file
35
apps/plugins/lib/rgb_hsv.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 Antoine Cellerier <dionoea -at- videolan -dot- org>
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef LIB_HSV_RGB_H
|
||||
#define LIB_HSV_RGB_H
|
||||
|
||||
/***********************************************************************
|
||||
* Colorspace transformations
|
||||
***********************************************************************
|
||||
* r, g and b range from 0 to 255
|
||||
* h ranges from 0 to 3599 (which in fact means 0.0 to 359.9).
|
||||
* 360 is the same as 0 (it loops)
|
||||
* s and v range from 0 to 255 (which in fact means 0.00 to 1.00)
|
||||
***********************************************************************/
|
||||
|
||||
void rgb2hsv( int r, int g, int b, int *h, int *s, int *v );
|
||||
void hsv2rgb( int h, int s, int v, int *r, int *g, int *b );
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue