summaryrefslogtreecommitdiff
path: root/apps/plugins/lib
diff options
context:
space:
mode:
authorJohannes Schwarz <ubuntuxer@rockbox.org>2009-06-28 09:48:12 +0000
committerJohannes Schwarz <ubuntuxer@rockbox.org>2009-06-28 09:48:12 +0000
commit8a21372e5bcfddabac0aa05b9dd9e3dc5e85da9b (patch)
tree9e5e3c67cbafd8b4b6806f0b5e777500e6b0135b /apps/plugins/lib
parent41baca7de673d8b3935fa21fb6d6b10722b10b7e (diff)
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
Diffstat (limited to 'apps/plugins/lib')
-rw-r--r--apps/plugins/lib/SOURCES1
-rw-r--r--apps/plugins/lib/display_text.c139
-rw-r--r--apps/plugins/lib/display_text.h47
3 files changed, 187 insertions, 0 deletions
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);