From 58fc279d2674b5d56fed6772f82cdf1e431088f1 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Sat, 28 Jul 2007 08:12:05 +0000 Subject: Scroll on main and remote with a single thread. Change the way system messages are defined before running out is an issue (which requires a full update of rockbox on the player). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14035 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/lcd-2bit-horz.c | 176 +++++++++++++-------------------------- 1 file changed, 57 insertions(+), 119 deletions(-) (limited to 'firmware/drivers/lcd-2bit-horz.c') diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c index d3d086a9d2..48fd22f703 100644 --- a/firmware/drivers/lcd-2bit-horz.c +++ b/firmware/drivers/lcd-2bit-horz.c @@ -33,8 +33,7 @@ #include "font.h" #include "rbunicode.h" #include "bidi.h" - -#define SCROLLABLE_LINES (((LCD_HEIGHT+4)/5 < 32) ? (LCD_HEIGHT+4)/5 : 32) +#include "scroll_engine.h" /*** globals ***/ @@ -54,33 +53,13 @@ static int xmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; -/* scrolling */ -static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */ -static void scroll_thread(void); -static long scroll_stack[DEFAULT_STACK_SIZE/sizeof(long)]; -static const char scroll_name[] = "scroll"; -static int scroll_ticks = 12; /* # of ticks between updates*/ -static int scroll_delay = HZ/2; /* ticks delay before start */ -static int scroll_step = 6; /* pixels per scroll step */ -static int bidir_limit = 50; /* percent */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - - /* LCD init */ void lcd_init(void) { lcd_clear_display(); /* Call device specific init */ lcd_init_device(); - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); + scroll_init(); } /*** parameter handling ***/ @@ -143,6 +122,11 @@ void lcd_setfont(int newfont) curfont = newfont; } +int lcd_getfont(void) +{ + return curfont; +} + int lcd_getstringsize(const unsigned char *str, int *w, int *h) { return font_getstringsize(str, w, h, curfont); @@ -377,7 +361,8 @@ void lcd_clear_display(void) else memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer); } - scrolling_lines = 0; + + lcd_scroll_info.lines = 0; } /* Set a single pixel */ @@ -862,7 +847,7 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int lastmode = drawmode; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_scroll_info.lines &= ~(1 << y); if(!str || !str[0]) return; @@ -880,46 +865,6 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, } /*** scrolling ***/ - -/* Reverse the invert setting of the scrolling line (if any) at given char - position. Setting will go into affect next time line scrolls. */ -void lcd_invertscroll(int x, int y) -{ - struct scrollinfo* s; - - (void)x; - - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; - s->invert = !s->invert; -} - -void lcd_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_scroll_step(int step) -{ - scroll_step = step; -} - -void lcd_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - void lcd_puts_scroll(int x, int y, const unsigned char *string) { lcd_puts_scroll_style(x, y, string, STYLE_DEFAULT); @@ -941,11 +886,11 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, struct scrollinfo* s; int w, h; - if(y>=SCROLLABLE_LINES) return; + if(y>=LCD_SCROLLABLE_LINES) return; - s = &scroll[y]; + s = &lcd_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_scroll_info.delay; s->invert = false; if (style & STYLE_INVERT) { s->invert = true; @@ -968,9 +913,9 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, /* scroll bidirectional or forward only depending on the string width */ - if ( bidir_limit ) { + if ( lcd_scroll_info.bidir_limit ) { s->bidir = s->width < (LCD_WIDTH - xmargin) * - (100 + bidir_limit) / 100; + (100 + lcd_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -988,14 +933,14 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, s->offset = offset; s->startx = xmargin + x * s->width / s->len;; s->backward = false; - scrolling_lines |= (1<start_tick)) - continue; + /* check pause */ + if (TIME_BEFORE(current_tick, s->start_tick)) + continue; - if (s->backward) - s->offset -= scroll_step; - else - s->offset += scroll_step; - - pf = font_get(curfont); - xpos = s->startx; - ypos = ymargin + index * pf->height; - - if (s->bidir) { /* scroll bidirectional */ - if (s->offset <= 0) { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { - /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + if (s->backward) + s->offset -= lcd_scroll_info.step; + else + s->offset += lcd_scroll_info.step; + + pf = font_get(curfont); + xpos = s->startx; + ypos = ymargin + index * pf->height; + + if (s->bidir) { /* scroll bidirectional */ + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; + if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->width - (LCD_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - - lastmode = drawmode; - drawmode = s->invert ? - (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_putsxyofs(xpos, ypos, s->offset, s->line); - drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + } + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } - sleep(scroll_ticks); + lastmode = drawmode; + drawmode = s->invert ? + (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; + lcd_putsxyofs(xpos, ypos, s->offset, s->line); + drawmode = lastmode; + lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); } } -- cgit v1.2.3