From 5e306b4c19dfe8732107d255c9c00e7d585c24ca Mon Sep 17 00:00:00 2001 From: Antoine Cellerier Date: Wed, 19 Jul 2006 19:40:17 +0000 Subject: RGB <-> HSV colorspace conversion lib git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10253 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/lib/SOURCES | 1 + apps/plugins/lib/rgb_hsv.c | 129 +++++++++++++++++++++++++++++++++++++++++++++ apps/plugins/lib/rgb_hsv.h | 35 ++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 apps/plugins/lib/rgb_hsv.c create mode 100644 apps/plugins/lib/rgb_hsv.h diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES index 81cdc8c944..f0e9ebce63 100644 --- a/apps/plugins/lib/SOURCES +++ b/apps/plugins/lib/SOURCES @@ -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 diff --git a/apps/plugins/lib/rgb_hsv.c b/apps/plugins/lib/rgb_hsv.c new file mode 100644 index 0000000000..0d424b9149 --- /dev/null +++ b/apps/plugins/lib/rgb_hsv.c @@ -0,0 +1,129 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 Antoine Cellerier + * + * 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; + } +} diff --git a/apps/plugins/lib/rgb_hsv.h b/apps/plugins/lib/rgb_hsv.h new file mode 100644 index 0000000000..30bb206df1 --- /dev/null +++ b/apps/plugins/lib/rgb_hsv.h @@ -0,0 +1,35 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 Antoine Cellerier + * + * 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 -- cgit v1.2.3