When you use splash() and a centered output, it will now put the text in
a centered "box" on the screen and will not clear the rest of the screen. This makes a neat "windows-effect", as can be seen on these demo-shots: http://www.contactor.se/~dast/splash3.png http://www.contactor.se/~dast/splash2.png http://www.contactor.se/~dast/splash.png Needless to say, current code that "pops-up" information should be moved to use splash() instead... git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3476 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
6b6f97ddda
commit
078f328544
1 changed files with 36 additions and 6 deletions
|
@ -469,7 +469,7 @@ bool f3_screen(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
#define SPACE 4 /* pixels between words */
|
#define SPACE 3 /* pixels between words */
|
||||||
#define MAXLETTERS 128 /* 16*8 */
|
#define MAXLETTERS 128 /* 16*8 */
|
||||||
#define MAXLINES 10
|
#define MAXLINES 10
|
||||||
#else
|
#else
|
||||||
|
@ -499,13 +499,15 @@ void splash(int ticks, /* how long */
|
||||||
unsigned char widths[MAXLINES];
|
unsigned char widths[MAXLINES];
|
||||||
int line=0;
|
int line=0;
|
||||||
bool first=true;
|
bool first=true;
|
||||||
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
int maxw=0;
|
||||||
|
#endif
|
||||||
|
|
||||||
va_start( ap, fmt );
|
va_start( ap, fmt );
|
||||||
vsnprintf( splash_buf, sizeof(splash_buf), fmt, ap );
|
vsnprintf( splash_buf, sizeof(splash_buf), fmt, ap );
|
||||||
|
|
||||||
lcd_clear_display();
|
|
||||||
|
|
||||||
if(center) {
|
if(center) {
|
||||||
|
|
||||||
/* first a pass to measure sizes */
|
/* first a pass to measure sizes */
|
||||||
next = strtok_r(splash_buf, " ", &store);
|
next = strtok_r(splash_buf, " ", &store);
|
||||||
while (next) {
|
while (next) {
|
||||||
|
@ -513,11 +515,11 @@ void splash(int ticks, /* how long */
|
||||||
lcd_getstringsize(next, &w, &h);
|
lcd_getstringsize(next, &w, &h);
|
||||||
#else
|
#else
|
||||||
w = strlen(next);
|
w = strlen(next);
|
||||||
h = 1;
|
h = 1; /* store height in characters */
|
||||||
#endif
|
#endif
|
||||||
if(!first) {
|
if(!first) {
|
||||||
if(x+w> LCD_WIDTH) {
|
if(x+w> LCD_WIDTH) {
|
||||||
/* too wide */
|
/* Too wide, wrap */
|
||||||
y+=h;
|
y+=h;
|
||||||
line++;
|
line++;
|
||||||
if((y > (LCD_HEIGHT-h)) || (line > MAXLINES))
|
if((y > (LCD_HEIGHT-h)) || (line > MAXLINES))
|
||||||
|
@ -535,6 +537,11 @@ void splash(int ticks, /* how long */
|
||||||
|
|
||||||
x += w+SPACE;
|
x += w+SPACE;
|
||||||
widths[line]=x-SPACE; /* don't count the trailing space */
|
widths[line]=x-SPACE; /* don't count the trailing space */
|
||||||
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
/* store the widest line */
|
||||||
|
if(widths[line]>maxw)
|
||||||
|
maxw = widths[line];
|
||||||
|
#endif
|
||||||
next = strtok_r(NULL, " ", &store);
|
next = strtok_r(NULL, " ", &store);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
@ -545,14 +552,37 @@ void splash(int ticks, /* how long */
|
||||||
#else
|
#else
|
||||||
y = 0; /* vertical center on 2 lines would be silly */
|
y = 0; /* vertical center on 2 lines would be silly */
|
||||||
#endif
|
#endif
|
||||||
line=0;
|
|
||||||
first=true;
|
first=true;
|
||||||
|
|
||||||
|
/* Now recreate the string again since the strtok_r() above has ruined
|
||||||
|
the one we already have! Here's room for improvements! */
|
||||||
vsnprintf( splash_buf, sizeof(splash_buf), fmt, ap );
|
vsnprintf( splash_buf, sizeof(splash_buf), fmt, ap );
|
||||||
}
|
}
|
||||||
va_end( ap );
|
va_end( ap );
|
||||||
|
|
||||||
if(center)
|
if(center)
|
||||||
x = (LCD_WIDTH-widths[0])/2;
|
x = (LCD_WIDTH-widths[0])/2;
|
||||||
|
|
||||||
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
/* If we center the display and it wouldn't cover the full screen,
|
||||||
|
then just clear the box we need and put a nice little frame and
|
||||||
|
put the text in there! */
|
||||||
|
if(center && (y > 2)) {
|
||||||
|
if(maxw < (LCD_WIDTH -4)) {
|
||||||
|
int xx = (LCD_WIDTH-maxw)/2 - 2;
|
||||||
|
lcd_clearrect(xx, y-2, maxw+4, LCD_HEIGHT-y*2+4);
|
||||||
|
lcd_drawrect(xx, y-2, maxw+4, LCD_HEIGHT-y*2+4);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcd_clearrect(0, y-2, LCD_WIDTH, LCD_HEIGHT-y*2+4);
|
||||||
|
lcd_drawline(0, y-2, LCD_WIDTH, y-2);
|
||||||
|
lcd_drawline(0, LCD_HEIGHT-y+2, LCD_WIDTH, LCD_HEIGHT-y+2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
lcd_clear_display();
|
||||||
|
line=0;
|
||||||
next = strtok_r(splash_buf, " ", &store);
|
next = strtok_r(splash_buf, " ", &store);
|
||||||
while (next) {
|
while (next) {
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
|
Loading…
Reference in a new issue