From 53f156a6fcec07301a6b29a3f647fff43520af7a Mon Sep 17 00:00:00 2001 From: Kjell Ericson Date: Thu, 22 May 2003 06:42:14 +0000 Subject: New feature for player: Jump scroll! git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3693 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/lcd-player.c | 65 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 13 deletions(-) (limited to 'firmware/drivers/lcd-player.c') diff --git a/firmware/drivers/lcd-player.c b/firmware/drivers/lcd-player.c index c5915af9fa..2496fb6f66 100644 --- a/firmware/drivers/lcd-player.c +++ b/firmware/drivers/lcd-player.c @@ -70,6 +70,7 @@ struct scrollinfo { int starty; long scroll_start_tick; int direction; /* +1 for right or -1 for left*/ + int jump_scroll; }; #define MAX_CURSOR_CHARS 8 @@ -91,6 +92,7 @@ static int scroll_delay = HZ/2; /* delay before starting scroll */ static char scroll_spacing = 3; /* spaces between end and start of text */ static bool allow_bidirectional_scrolling = true; static int bidir_limit = 50; /* percent */ +static int jump_scroll = 0; /* 0=off, 1=once, 2=always */ static struct scrollinfo scroll[SCROLLABLE_LINES]; @@ -498,6 +500,11 @@ void lcd_init (void) sizeof(scroll_stack), scroll_name); } +void lcd_jump_scroll (int mode) /* 0=off, 1=once, 2=always */ +{ + jump_scroll=mode; +} + void lcd_bidir_scroll(int percent) { bidir_limit = percent; @@ -522,6 +529,9 @@ void lcd_puts_scroll(int x, int y, unsigned char* string ) s->startx=x; s->starty=y; s->direction=+1; + s->jump_scroll=0; + if (jump_scroll && scroll_delay/2<(HZ/scroll_speed)*(s->textlen-11+x)) + s->jump_scroll=11-x; strncpy(s->text,string,sizeof s->text); s->turn_offset=-1; if (bidir_limit && (s->textlen < ((11-x)*(100+bidir_limit))/100)) { @@ -596,18 +606,40 @@ static void scroll_thread(void) if ( TIME_AFTER(current_tick, s->scroll_start_tick) ) { char buffer[12]; update = true; - if ( s->offset < s->textlen-1 ) { - s->offset+=s->direction; - if (s->offset==0) { - s->direction=+1; - s->scroll_start_tick = current_tick + scroll_delay; - } else if (s->offset==s->turn_offset) { - s->direction=-1; - s->scroll_start_tick = current_tick + scroll_delay; + if (s->jump_scroll) { + s->offset+=s->jump_scroll; + s->scroll_start_tick = current_tick + + scroll_delay/2; + /* Eat space */ + while (s->offset < s->textlen && + s->text[s->offset] == ' ') { + s->offset++; + } + if (s->offset >= s->textlen) { + s->offset=0; + if (jump_scroll!=2) { + s->jump_scroll=0; + s->direction=1; + } + } + } else { + if ( s->offset < s->textlen-1 ) { + s->offset+=s->direction; + if (s->offset==0) { + s->direction=+1; + s->scroll_start_tick = current_tick + + scroll_delay; + } else { + if (s->offset == s->turn_offset) { + s->direction=-1; + s->scroll_start_tick = current_tick + + scroll_delay; + } + } + } + else { + s->offset = 0; } - } - else { - s->offset = 0; } i=0; @@ -618,10 +650,17 @@ static void scroll_thread(void) break; } o=0; - while (i<11) { - buffer[i++]=s->text[o++]; + if (s->turn_offset == -1 && !s->jump_scroll) { + while (i<11) { + buffer[i++]=s->text[o++]; + } + } else { + while (i<11) { + buffer[i++]=' '; + } } buffer[11]=0; + lcd_puts_cont_scroll(s->startx, s->starty, buffer); } } -- cgit v1.2.3