summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
authorAntoine Cellerier <dionoea@videolan.org>2006-07-19 19:40:17 +0000
committerAntoine Cellerier <dionoea@videolan.org>2006-07-19 19:40:17 +0000
commit5e306b4c19dfe8732107d255c9c00e7d585c24ca (patch)
tree18183d5f5c0e23b0c04ad094a75ccaf42b907133 /apps/plugins
parent61c301bf8d7606e7cd693f6b66b9657462a3a6b4 (diff)
downloadrockbox-5e306b4c19dfe8732107d255c9c00e7d585c24ca.zip
rockbox-5e306b4c19dfe8732107d255c9c00e7d585c24ca.tar.gz
rockbox-5e306b4c19dfe8732107d255c9c00e7d585c24ca.tar.bz2
rockbox-5e306b4c19dfe8732107d255c9c00e7d585c24ca.tar.xz
RGB <-> HSV colorspace conversion lib
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10253 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/lib/SOURCES1
-rw-r--r--apps/plugins/lib/rgb_hsv.c129
-rw-r--r--apps/plugins/lib/rgb_hsv.h35
3 files changed, 165 insertions, 0 deletions
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES
index 81cdc8c..f0e9ebc 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 0000000..0d424b9
--- /dev/null
+++ b/apps/plugins/lib/rgb_hsv.c
@@ -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;
+ }
+}
diff --git a/apps/plugins/lib/rgb_hsv.h b/apps/plugins/lib/rgb_hsv.h
new file mode 100644
index 0000000..30bb206
--- /dev/null
+++ b/apps/plugins/lib/rgb_hsv.h
@@ -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