mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
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
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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue