1
0
Fork 0
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:
Johannes Schwarz 2009-06-28 09:48:12 +00:00
parent 41baca7de6
commit 8a21372e5b
3 changed files with 187 additions and 0 deletions

View file

@ -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

View 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;
}

View 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);