From 8a21372e5bcfddabac0aa05b9dd9e3dc5e85da9b Mon Sep 17 00:00:00 2001 From: Johannes Schwarz Date: Sun, 28 Jun 2009 09:48:12 +0000 Subject: FS#10099: new lib, which displays formatted text on every target; also supports viewport git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21537 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/lib/SOURCES | 1 + apps/plugins/lib/display_text.c | 139 ++++++++++++++++++++++++++++++++++++++++ apps/plugins/lib/display_text.h | 47 ++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 apps/plugins/lib/display_text.c create mode 100644 apps/plugins/lib/display_text.h (limited to 'apps/plugins/lib') diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES index 2ed38c4f8b..02adb7089c 100644 --- a/apps/plugins/lib/SOURCES +++ b/apps/plugins/lib/SOURCES @@ -5,6 +5,7 @@ fixedpoint.c playback_control.c rgb_hsv.c buflib.c +display_text.c #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) grey_core.c grey_draw.c diff --git a/apps/plugins/lib/display_text.c b/apps/plugins/lib/display_text.c new file mode 100644 index 0000000000..8ba31e2ff3 --- /dev/null +++ b/apps/plugins/lib/display_text.c @@ -0,0 +1,139 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2009 Johannes Schwarz + * based on Will Robertson code in superdom + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "plugin.h" +#include "display_text.h" + +#ifdef HAVE_LCD_CHARCELLS +#define MARGIN 0 +#else +#define MARGIN 5 +#endif + +bool display_text(short words, char** text, struct style_text* style, + struct viewport* vp_text) +{ +#ifdef HAVE_LCD_BITMAP + int prev_drawmode; +#endif +#ifdef HAVE_LCD_COLOR + unsigned standard_fgcolor; +#endif + int space_w, width, height; + unsigned short x , y; + unsigned short vp_width = LCD_WIDTH; + unsigned short vp_height = LCD_HEIGHT; + int button; + short i=0; + if (vp_text != NULL) { + vp_width = vp_text->width; + vp_height = vp_text->height; + } + rb->screens[SCREEN_MAIN]->set_viewport(vp_text); +#ifdef HAVE_LCD_BITMAP + prev_drawmode = rb->lcd_get_drawmode(); + rb->lcd_set_drawmode(DRMODE_SOLID); +#endif +#ifdef HAVE_LCD_COLOR + standard_fgcolor = rb->lcd_get_foreground(); +#endif + rb->screens[SCREEN_MAIN]->clear_viewport(); + x = MARGIN; + y = MARGIN; + rb->button_clear_queue(); + rb->lcd_getstringsize(" ", &space_w, &height); + for (i = 0; i < words; i++) { + rb->lcd_getstringsize(text[i], &width, NULL); + /* skip to next line if the current one can't fit the word */ + if (x + width > vp_width - MARGIN) { + x = MARGIN; + y = y + height; + } + /* .. or if the word is the empty string */ + if (rb->strcmp(text[i], "")==0) { + x = MARGIN; + y = y + height; + continue; + } + /* display the remaining text by button click or exit */ + if (y + height > vp_height - MARGIN) { + y = MARGIN; + rb->screens[SCREEN_MAIN]->update_viewport(); + do { + button = rb->button_get(true); + if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED ) + return true; + } while( ( button == BUTTON_NONE ) + || ( button & (BUTTON_REL|BUTTON_REPEAT) ) ); + rb->screens[SCREEN_MAIN]->clear_viewport(); + } + /* no text formations available */ + if (style==NULL) { + rb->lcd_putsxy(x, y, text[i]); + } else { + /* set align */ + if (style[i].flags&TEXT_CENTER) { + x = (vp_width-width)/2; + } + /* set font color */ +#ifdef HAVE_LCD_COLOR + switch (style[i].flags&TEXT_COLOR_MASK) { + case C_RED: + rb->lcd_set_foreground(LCD_RGBPACK(255,0,0)); + break; + case C_YELLOW: + rb->lcd_set_foreground(LCD_RGBPACK(255,255,0)); + break; + case C_GREEN: + rb->lcd_set_foreground(LCD_RGBPACK(0,192,0)); + break; + case C_BLUE: + rb->lcd_set_foreground(LCD_RGBPACK(0,0,255)); + break; + case C_ORANGE: + rb->lcd_set_foreground(LCD_RGBPACK(255,192,0)); + break; + case STANDARD: + default: + rb->lcd_set_foreground(standard_fgcolor); + break; + } +#endif + rb->lcd_putsxy(x, y, text[i]); +#ifdef HAVE_LCD_BITMAP + if (style[i].flags&TEXT_UNDERLINE) { + rb->lcd_hline(x, x+width, y+height-1); + } +#endif + } + x += width + space_w; + } + rb->screens[SCREEN_MAIN]->update_viewport(); +#ifdef HAVE_LCD_BITMAP + rb->lcd_set_drawmode(prev_drawmode); +#endif +#ifdef HAVE_LCD_COLOR + if (style!=NULL) { + rb->lcd_set_foreground(standard_fgcolor); + } +#endif + return false; +} diff --git a/apps/plugins/lib/display_text.h b/apps/plugins/lib/display_text.h new file mode 100644 index 0000000000..9f21d236ea --- /dev/null +++ b/apps/plugins/lib/display_text.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2009 Johannes Schwarz + * based on Will Robertson code in superdom + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "plugin.h" +/* + * basic usage: + * #define WORDS (sizeof text / sizeof (char*)) + * char *text[] = {"normal", "centering", "red,underline"}; + * struct style_text formation[WORDS]={ + * [1] = { TEXT_CENTER }, + * [2] = { C_RED|TEXT_UNDERLINE }, + * }; + * if (display_text(WORDS, text, formation, NULL)) + * return PLUGIN_USB_CONNECTED; + */ + +enum ecolor { STANDARD, C_YELLOW, C_RED, C_BLUE, C_GREEN , C_ORANGE }; +#define TEXT_COLOR_MASK 0x00ff +#define TEXT_CENTER 0x0100 +#define TEXT_UNDERLINE 0x0200 + +struct style_text { + unsigned short flags; +}; + +/* style and vp_text is optional. + * return true if usb is connected. */ +bool display_text(short words, char** text, struct style_text* style, + struct viewport* vp_text); -- cgit v1.2.3