summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-scroll.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/lcd-scroll.c')
-rw-r--r--firmware/drivers/lcd-scroll.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/firmware/drivers/lcd-scroll.c b/firmware/drivers/lcd-scroll.c
index 31c2cf20b0..d524ce81c8 100644
--- a/firmware/drivers/lcd-scroll.c
+++ b/firmware/drivers/lcd-scroll.c
@@ -132,10 +132,10 @@ static void LCDFN(scroll_worker)(void)
132 struct scroll_screen_info *si = &LCDFN(scroll_info); 132 struct scroll_screen_info *si = &LCDFN(scroll_info);
133 struct scrollinfo *s; 133 struct scrollinfo *s;
134 struct viewport *vp; 134 struct viewport *vp;
135 int step;
135 136
136 unsigned fg_pattern, bg_pattern, drawmode; 137 for ( index = 0; index < si->lines; index++ )
137 138 {
138 for ( index = 0; index < si->lines; index++ ) {
139 s = &si->scroll[index]; 139 s = &si->scroll[index];
140 140
141 /* check pause */ 141 /* check pause */
@@ -154,14 +154,19 @@ static void LCDFN(scroll_worker)(void)
154 154
155 width = LCDFN(getstringsize)(s->linebuffer, NULL, NULL); 155 width = LCDFN(getstringsize)(s->linebuffer, NULL, NULL);
156 makedelay = false; 156 makedelay = false;
157 157#ifdef HAVE_LCD_BITMAP
158 step = si->step;
159#else
160 step = 1;
161#endif
162
158 if (s->backward) 163 if (s->backward)
159 s->offset -= si->step; 164 s->offset -= step;
160 else 165 else
161 s->offset += si->step; 166 s->offset += step;
162
163 if (s->bidir) { /* scroll bidirectional */
164 167
168 if (s->bidir)
169 { /* scroll bidirectional */
165 s->line = s->linebuffer; 170 s->line = s->linebuffer;
166 if (s->offset <= 0) { 171 if (s->offset <= 0) {
167 /* at beginning of line */ 172 /* at beginning of line */
@@ -169,15 +174,15 @@ static void LCDFN(scroll_worker)(void)
169 s->backward = false; 174 s->backward = false;
170 makedelay = true; 175 makedelay = true;
171 } 176 }
172 else if (s->offset >= width - (s->width - s->x)) { 177 else if (s->offset >= width - s->width) {
173 /* at end of line */ 178 /* at end of line */
174 s->offset = width - (s->width - s->x); 179 s->offset = width - s->width;
175 s->backward = true; 180 s->backward = true;
176 makedelay = true; 181 makedelay = true;
177 } 182 }
178 } 183 }
179 else { 184 else
180 185 {
181 snprintf(line_buf, sizeof(line_buf)-1, "%s%s%s", 186 snprintf(line_buf, sizeof(line_buf)-1, "%s%s%s",
182 s->linebuffer, " ", s->linebuffer); 187 s->linebuffer, " ", s->linebuffer);
183 s->line = line_buf; 188 s->line = line_buf;
@@ -191,17 +196,26 @@ static void LCDFN(scroll_worker)(void)
191 196
192 /* Stash and restore these three, so that the scroll_func 197 /* Stash and restore these three, so that the scroll_func
193 * can do whatever it likes without destroying the state */ 198 * can do whatever it likes without destroying the state */
199#ifdef HAVE_LCD_BITMAP
200 unsigned drawmode;
201#if LCD_DEPTH > 1
202 unsigned fg_pattern, bg_pattern;
194 fg_pattern = s->vp->fg_pattern; 203 fg_pattern = s->vp->fg_pattern;
195 bg_pattern = s->vp->bg_pattern; 204 bg_pattern = s->vp->bg_pattern;
205#endif
196 drawmode = s->vp->drawmode; 206 drawmode = s->vp->drawmode;
197 207#endif
198 s->scroll_func(s); 208 s->scroll_func(s);
209
199 LCDFN(update_viewport_rect)(s->x, s->y, s->width, s->height); 210 LCDFN(update_viewport_rect)(s->x, s->y, s->width, s->height);
200 211
212#ifdef HAVE_LCD_BITMAP
213#if LCD_DEPTH > 1
201 s->vp->fg_pattern = fg_pattern; 214 s->vp->fg_pattern = fg_pattern;
202 s->vp->bg_pattern = bg_pattern; 215 s->vp->bg_pattern = bg_pattern;
216#endif
203 s->vp->drawmode = drawmode; 217 s->vp->drawmode = drawmode;
204 218#endif
205 LCDFN(set_viewport)(vp); 219 LCDFN(set_viewport)(vp);
206 220
207 if (makedelay) 221 if (makedelay)