diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/lcd-16bit.c | 37 | ||||
-rw-r--r-- | firmware/export/lcd.h | 3 |
2 files changed, 33 insertions, 7 deletions
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c index 16c97c9e99..f03cab3877 100644 --- a/firmware/drivers/lcd-16bit.c +++ b/firmware/drivers/lcd-16bit.c | |||
@@ -807,7 +807,8 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int style, | |||
807 | { | 807 | { |
808 | int xpos,ypos,w,h,xrect; | 808 | int xpos,ypos,w,h,xrect; |
809 | int lastmode = drawmode; | 809 | int lastmode = drawmode; |
810 | int oldcolor = fg_pattern; | 810 | int oldfgcolor = fg_pattern; |
811 | int oldbgcolor = bg_pattern; | ||
811 | 812 | ||
812 | /* make sure scrolling is turned off on the line we are updating */ | 813 | /* make sure scrolling is turned off on the line we are updating */ |
813 | scrolling_lines &= ~(1 << y); | 814 | scrolling_lines &= ~(1 << y); |
@@ -820,15 +821,19 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int style, | |||
820 | ypos = ymargin + y*h; | 821 | ypos = ymargin + y*h; |
821 | drawmode = (style & STYLE_INVERT) ? | 822 | drawmode = (style & STYLE_INVERT) ? |
822 | (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; | 823 | (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; |
823 | if (drawmode == DRMODE_SOLID && style & STYLE_COLORED) { | 824 | if (style & STYLE_COLORED) { |
824 | fg_pattern = style & STYLE_COLOR_MASK; | 825 | if (drawmode == DRMODE_SOLID) |
826 | fg_pattern = style & STYLE_COLOR_MASK; | ||
827 | else | ||
828 | bg_pattern = style & STYLE_COLOR_MASK; | ||
825 | } | 829 | } |
826 | lcd_putsxyofs(xpos, ypos, offset, str); | 830 | lcd_putsxyofs(xpos, ypos, offset, str); |
827 | drawmode ^= DRMODE_INVERSEVID; | 831 | drawmode ^= DRMODE_INVERSEVID; |
828 | xrect = xpos + MAX(w - offset, 0); | 832 | xrect = xpos + MAX(w - offset, 0); |
829 | lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h); | 833 | lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h); |
830 | drawmode = lastmode; | 834 | drawmode = lastmode; |
831 | fg_pattern = oldcolor; | 835 | fg_pattern = oldfgcolor; |
836 | bg_pattern = oldbgcolor; | ||
832 | } | 837 | } |
833 | 838 | ||
834 | /*** scrolling ***/ | 839 | /*** scrolling ***/ |
@@ -938,6 +943,8 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, | |||
938 | s->offset = offset; | 943 | s->offset = offset; |
939 | s->startx = xmargin + x * s->width / s->len; | 944 | s->startx = xmargin + x * s->width / s->len; |
940 | s->backward = false; | 945 | s->backward = false; |
946 | s->line_colour = (style&STYLE_COLORED)? | ||
947 | (style&STYLE_COLOR_MASK): -1; | ||
941 | scrolling_lines |= (1<<y); | 948 | scrolling_lines |= (1<<y); |
942 | } | 949 | } |
943 | else | 950 | else |
@@ -952,6 +959,7 @@ static void scroll_thread(void) | |||
952 | int index; | 959 | int index; |
953 | int xpos, ypos; | 960 | int xpos, ypos; |
954 | int lastmode; | 961 | int lastmode; |
962 | unsigned old_bgcolour, old_fgcolour; | ||
955 | 963 | ||
956 | /* initialize scroll struct array */ | 964 | /* initialize scroll struct array */ |
957 | scrolling_lines = 0; | 965 | scrolling_lines = 0; |
@@ -961,17 +969,31 @@ static void scroll_thread(void) | |||
961 | sleep(scroll_ticks); | 969 | sleep(scroll_ticks); |
962 | continue; | 970 | continue; |
963 | } | 971 | } |
972 | old_fgcolour = lcd_get_foreground(); | ||
973 | old_bgcolour = lcd_get_background(); | ||
964 | for ( index = 0; index < SCROLLABLE_LINES; index++ ) { | 974 | for ( index = 0; index < SCROLLABLE_LINES; index++ ) { |
965 | /* really scroll? */ | 975 | /* really scroll? */ |
966 | if ( !(scrolling_lines&(1<<index)) ) | 976 | if ( !(scrolling_lines&(1<<index)) ) |
967 | continue; | 977 | continue; |
968 | 978 | ||
969 | s = &scroll[index]; | 979 | s = &scroll[index]; |
970 | |||
971 | /* check pause */ | 980 | /* check pause */ |
972 | if (TIME_BEFORE(current_tick, s->start_tick)) | 981 | if (TIME_BEFORE(current_tick, s->start_tick)) |
973 | continue; | 982 | continue; |
974 | 983 | if (s->line_colour >= 0) | |
984 | { | ||
985 | if (s->invert) | ||
986 | { | ||
987 | lcd_set_foreground(old_fgcolour); | ||
988 | lcd_set_background(s->line_colour); | ||
989 | } | ||
990 | else | ||
991 | { | ||
992 | lcd_set_foreground(s->line_colour); | ||
993 | lcd_set_background(old_bgcolour); | ||
994 | } | ||
995 | } | ||
996 | |||
975 | if (s->backward) | 997 | if (s->backward) |
976 | s->offset -= scroll_step; | 998 | s->offset -= scroll_step; |
977 | else | 999 | else |
@@ -1008,7 +1030,8 @@ static void scroll_thread(void) | |||
1008 | drawmode = lastmode; | 1030 | drawmode = lastmode; |
1009 | lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); | 1031 | lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); |
1010 | } | 1032 | } |
1011 | 1033 | lcd_set_foreground(old_fgcolour); | |
1034 | lcd_set_background(old_bgcolour); | ||
1012 | sleep(scroll_ticks); | 1035 | sleep(scroll_ticks); |
1013 | } | 1036 | } |
1014 | } | 1037 | } |
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index cebcf54c9b..787eea01f5 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h | |||
@@ -392,6 +392,9 @@ struct scrollinfo { | |||
392 | bool backward; /* scroll presently forward or backward? */ | 392 | bool backward; /* scroll presently forward or backward? */ |
393 | bool bidir; | 393 | bool bidir; |
394 | long start_tick; | 394 | long start_tick; |
395 | #ifdef HAVE_LCD_COLOR | ||
396 | int line_colour; | ||
397 | #endif | ||
395 | }; | 398 | }; |
396 | 399 | ||
397 | #endif /* __LCD_H__ */ | 400 | #endif /* __LCD_H__ */ |