forked from len0rd/rockbox
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
This commit is contained in:
parent
41baca7de6
commit
8a21372e5b
3 changed files with 187 additions and 0 deletions
|
@ -5,6 +5,7 @@ fixedpoint.c
|
||||||
playback_control.c
|
playback_control.c
|
||||||
rgb_hsv.c
|
rgb_hsv.c
|
||||||
buflib.c
|
buflib.c
|
||||||
|
display_text.c
|
||||||
#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4)
|
#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4)
|
||||||
grey_core.c
|
grey_core.c
|
||||||
grey_draw.c
|
grey_draw.c
|
||||||
|
|
139
apps/plugins/lib/display_text.c
Normal file
139
apps/plugins/lib/display_text.c
Normal file
|
@ -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;
|
||||||
|
}
|
47
apps/plugins/lib/display_text.h
Normal file
47
apps/plugins/lib/display_text.h
Normal file
|
@ -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);
|
Loading…
Add table
Add a link
Reference in a new issue