diff options
author | Thomas Martitz <kugel@rockbox.org> | 2013-12-15 00:38:48 +0100 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2013-12-15 00:38:48 +0100 |
commit | c72b454286864d728de676ebdf92288dd04ace45 (patch) | |
tree | bfe7ebfff65c3452b54661eafa844d28d0812a96 /firmware/drivers/lcd-scroll.c | |
parent | 1fc19042f72e9171b79c5a847cbce0c8939888c5 (diff) | |
download | rockbox-c72b454286864d728de676ebdf92288dd04ace45.tar.gz rockbox-c72b454286864d728de676ebdf92288dd04ace45.zip |
Fix reds. Also apply the new scrolling to lcd charcell (this even uncovered an
error).
Change-Id: I29243bb36b6cec1471bd6c0afc64e00547a68c50
Diffstat (limited to 'firmware/drivers/lcd-scroll.c')
-rw-r--r-- | firmware/drivers/lcd-scroll.c | 42 |
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) |