/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) Jonathan Gordon (2006) * * 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 "config.h" #include "stdarg.h" #include "string.h" #include "stdio.h" #include "kernel.h" #include "system.h" #include "screen_access.h" #include "debug.h" #include "misc.h" #include "settings.h" #include "scrollbar.h" #include "lang.h" #include "splash.h" #define TEXT_MARGIN display->char_width+2 #define SLIDER_START 20 #if (CONFIG_KEYPAD == IRIVER_H300_PAD) #define SLIDER_UP BUTTON_UP #define SLIDER_DOWN BUTTON_DOWN #define SLIDER_LEFT BUTTON_LEFT #define SLIDER_RIGHT BUTTON_RIGHT #define SLIDER_OK BUTTON_ON #define SLIDER_OK2 BUTTON_SELECT #define SLIDER_CANCEL BUTTON_OFF #define SLIDER_RC_UP BUTTON_RC_REW #define SLIDER_RC_DOWN BUTTON_RC_FF #define SLIDER_RC_LEFT BUTTON_RC_SOURCE #define SLIDER_RC_RIGHT BUTTON_RC_BITRATE #define SLIDER_RC_OK BUTTON_RC_ON #define SLIDER_RC_CANCEL BUTTON_RC_STOP #elif (CONFIG_KEYPAD == GIGABEAT_PAD) #define SLIDER_UP BUTTON_UP #define SLIDER_DOWN BUTTON_DOWN #define SLIDER_LEFT BUTTON_LEFT #define SLIDER_RIGHT BUTTON_RIGHT #define SLIDER_OK BUTTON_POWER #define SLIDER_CANCEL BUTTON_A #elif (CONFIG_KEYPAD == IPOD_4G_PAD) #define SLIDER_UP BUTTON_LEFT #define SLIDER_DOWN BUTTON_RIGHT #define SLIDER_LEFT BUTTON_SCROLL_BACK #define SLIDER_RIGHT BUTTON_SCROLL_FWD #define SLIDER_OK BUTTON_SELECT #define SLIDER_CANCEL BUTTON_MENU #elif (CONFIG_KEYPAD == IAUDIO_X5_PAD) #define SLIDER_UP BUTTON_UP #define SLIDER_DOWN BUTTON_DOWN #define SLIDER_LEFT BUTTON_LEFT #define SLIDER_RIGHT BUTTON_RIGHT #define SLIDER_OK BUTTON_SELECT #define SLIDER_CANCEL BUTTON_PLAY #endif static const int max_val[3] = {LCD_MAX_RED,LCD_MAX_GREEN,LCD_MAX_BLUE}; static void draw_screen(struct screen *display, char *title, int *rgb_val, int color, int row) { int i; char *textrgb = str(LANG_COLOR_RGB_LABELS), rgb_dummy[2] = {0,0}; int text_top; int text_centre, bg_col; char buf[32]; int slider_width = (display->width-SLIDER_START-(display->char_width*5)); int background_color = global_settings.bg_color; int text_color = global_settings.fg_color; bool display_three_rows = (display->height/6) > display->char_height; display->clear_display(); if (display->depth > 1) { display->set_foreground(text_color); } i = display->getstringsize(title,0,0); display->putsxy((display->width-i)/2,6,title ); text_top = display->char_height*2; for (i=0; i<3 ;i++) { if (!display_three_rows) i = row; if (i==row) { if ((global_settings.invert_cursor) && (display->depth >2)) { display->fillrect(0,text_top-1,display->width,display->char_height+2); bg_col = text_color; } else if (display_three_rows) { display->putsxy(0,text_top,">"); display->putsxy(display->width-display->char_width-2,text_top,"<"); bg_col = background_color; } if (display->depth > 1) { if (i==0) display->set_foreground(LCD_RGBPACK(255, 0, 0)); else if (i==1) display->set_foreground(LCD_RGBPACK(0, 255, 0)); else if (i==2) display->set_foreground(LCD_RGBPACK(0 ,0 ,255)); } } else { if (display->depth > 1) display->set_foreground(text_color); bg_col = background_color; } if (display->depth > 1) display->set_background(bg_col); text_centre = text_top+(display->char_height/2); rgb_dummy[0] = textrgb[i]; display->putsxy(TEXT_MARGIN,text_top,rgb_dummy); snprintf(buf,3,"%02d",rgb_val[i]); display->putsxy(display->width-(display->char_width*4),text_top,buf); text_top += display->char_height/4; gui_scrollbar_draw(display,SLIDER_START,text_top,slider_width, display->char_height/2, max_val[i],0,rgb_val[i],HORIZONTAL); if (!display_three_rows) break; text_top += display->char_height; } if (display->depth > 1) { display->set_background(background_color); display->set_foreground(text_color); } if (text_top + (display->char_height*2) < (display->height-40-display->char_height)) text_top += (display->char_height*2); else text_top += (display->char_height); /* Display RGB: #rrggbb */ snprintf(buf,sizeof(buf),str(LANG_COLOR_RGB_VALUE), RGB_UNPACK_RED(color), RGB_UNPACK_GREEN(color), RGB_UNPACK_BLUE(color)); display->putsxy((display->width-(display->char_width*11))/2,text_top,buf); if (display->depth > 1) { display->set_foreground(color); display->fillrect(SLIDER_START,LCD_HEIGHT-40,slider_width,35); display->set_foreground(LCD_BLACK); display->drawrect(SLIDER_START-1,LCD_HEIGHT-41,slider_width+2,37); } display->update(); } /*********** set_color returns true if USB was inserted, false otherwise color is a pointer to the colour (in native format) to modify set banned_color to -1 to allow all ***********/ bool set_color(struct screen *display,char *title, int* color, int banned_color) { int exit = 0, button, slider=0; int rgb_val[3]; /* native depth r,g,b*/; int fgcolor = display->get_foreground(); int newcolor = *color; int i; #if LCD_PIXELFORMAT == RGB565 rgb_val[0] = ((*color)&0xf800) >> 11; rgb_val[1] = ((*color)&0x07e0) >> 5; rgb_val[2] = ((*color)&0x001f); #elif LCD_PIXELFORMAT == RGB565SWAPPED rgb_val[0] = ((swap16(*color))&0xf800) >> 11; rgb_val[1] = ((swap16(*color))&0x07e0) >> 5; rgb_val[2] = ((swap16(*color))&0x001f); #endif while (!exit) { /* We need to maintain three versions of the colour: rgb_val[3] - the native depth RGB values newcolor - the native format packed colour */ #if LCD_PIXELFORMAT == RGB565 newcolor = (rgb_val[0] << 11) | (rgb_val[1] << 5) | (rgb_val[2]); #elif LCD_PIXELFORMAT == RGB565SWAPPED newcolor = swap16((rgb_val[0] << 11) | (rgb_val[1] << 5) | (rgb_val[2])); #endif FOR_NB_SCREENS(i) { draw_screen(&screens[i], title, rgb_val, newcolor, slider); } button = button_get(true); switch (button) { case SLIDER_UP: #ifdef SLIDER_RC_UP case SLIDER_RC_UP: #endif slider = (slider+2)%3; break; case SLIDER_DOWN: #ifdef SLIDER_RC_DOWN case SLIDER_RC_DOWN: #endif slider = (slider+1)%3; break; case SLIDER_RIGHT: case SLIDER_RIGHT|BUTTON_REPEAT: #ifdef SLIDER_RC_RIGHT case SLIDER_RC_RIGHT: case SLIDER_RC_RIGHT|BUTTON_REPEAT: #endif if (rgb_val[slider] < max_val[slider]) rgb_val[slider]++; break; case SLIDER_LEFT: case SLIDER_LEFT|BUTTON_REPEAT: #ifdef SLIDER_RC_LEFT case SLIDER_RC_LEFT: case SLIDER_RC_LEFT|BUTTON_REPEAT: #endif if (rgb_val[slider] > 0) rgb_val[slider]--; break; case SLIDER_OK: #ifdef HAVE_REMOTE_LCD case SLIDER_RC_OK: #endif #ifdef SLIDER_OK2 case SLIDER_OK2: #endif if ((banned_color!=-1) && (banned_color == newcolor)) { gui_syncsplash(HZ*2,true,str(LANG_COLOR_UNACCEPTABLE)); break; } *color = newcolor; exit = 1; break; case SLIDER_CANCEL: #ifdef HAVE_REMOTE_LCD case SLIDER_RC_CANCEL: #endif exit = 1; break; default: if(default_event_handler(button) == SYS_USB_CONNECTED) { display->set_foreground(fgcolor); return true; } break; } } display->set_foreground(fgcolor); return false; }