diff options
Diffstat (limited to 'apps/plugins/lib/grey_scroll.c')
-rw-r--r-- | apps/plugins/lib/grey_scroll.c | 273 |
1 files changed, 124 insertions, 149 deletions
diff --git a/apps/plugins/lib/grey_scroll.c b/apps/plugins/lib/grey_scroll.c index 4a18d7d29e..4e1d5070fc 100644 --- a/apps/plugins/lib/grey_scroll.c +++ b/apps/plugins/lib/grey_scroll.c | |||
@@ -46,8 +46,9 @@ void grey_scroll_left(int count) | |||
46 | do | 46 | do |
47 | { | 47 | { |
48 | _grey_rb->memmove(data, data + count, length); | 48 | _grey_rb->memmove(data, data + count, length); |
49 | _grey_rb->memset(data + length, blank, count); | 49 | data += length; |
50 | data += _grey_info.width; | 50 | _grey_rb->memset(data, blank, count); |
51 | data += count; | ||
51 | } | 52 | } |
52 | while (data < data_end); | 53 | while (data < data_end); |
53 | } | 54 | } |
@@ -149,210 +150,184 @@ void grey_ub_scroll_down(int count) | |||
149 | /* Scroll left */ | 150 | /* Scroll left */ |
150 | void grey_ub_scroll_left(int count) | 151 | void grey_ub_scroll_left(int count) |
151 | { | 152 | { |
152 | unsigned char *dst, *src, *end; | 153 | unsigned char *data, *data_end; |
153 | int blank, y, idx; | 154 | int blank, length; |
154 | 155 | ||
155 | if ((count == 0) || ((unsigned)count >= (unsigned)_grey_info.width)) | 156 | if ((unsigned)count >= (unsigned)_grey_info.width) |
156 | return; | 157 | return; |
157 | 158 | ||
159 | data = _grey_info.values; | ||
160 | data_end = data + _GREY_MULUQ(_grey_info.width, _grey_info.height); | ||
161 | length = (_grey_info.width - count) << _GREY_BSHIFT; | ||
162 | count <<= _GREY_BSHIFT; | ||
158 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? | 163 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? |
159 | _grey_info.fg_val : _grey_info.bg_val; | 164 | _grey_info.fg_val : _grey_info.bg_val; |
160 | 165 | ||
161 | for (y = 0; y < _grey_info.height; y++) | 166 | do |
162 | { | 167 | { |
163 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | 168 | _grey_rb->memmove(data, data + count, length); |
164 | idx = _GREY_MULUQ(_grey_info.width, y); | 169 | data += length; |
165 | #else | 170 | _grey_rb->memset(data, blank, count); |
166 | #if LCD_DEPTH == 1 | 171 | data += count; |
167 | idx = _GREY_MULUQ(_grey_info.width, y & ~7) + (~y & 7); | ||
168 | #elif LCD_DEPTH == 2 | ||
169 | idx = _GREY_MULUQ(_grey_info.width, y & ~3) + (~y & 3); | ||
170 | #endif | ||
171 | #endif /* LCD_PIXELFORMAT */ | ||
172 | dst = _grey_info.values + idx; | ||
173 | src = dst + count * _GREY_X_ADVANCE; | ||
174 | end = dst + _grey_info.width * _GREY_X_ADVANCE; | ||
175 | |||
176 | do | ||
177 | { | ||
178 | *dst = *src; | ||
179 | dst += _GREY_X_ADVANCE; | ||
180 | src += _GREY_X_ADVANCE; | ||
181 | } | ||
182 | while (src < end); | ||
183 | |||
184 | do | ||
185 | { | ||
186 | *dst = blank; | ||
187 | dst += _GREY_X_ADVANCE; | ||
188 | } | ||
189 | while (dst < end); | ||
190 | } | 172 | } |
173 | while (data < data_end); | ||
191 | } | 174 | } |
192 | 175 | ||
193 | /* Scroll right */ | 176 | /* Scroll right */ |
194 | void grey_ub_scroll_right(int count) | 177 | void grey_ub_scroll_right(int count) |
195 | { | 178 | { |
196 | unsigned char *dst, *src, *start; | 179 | unsigned char *data, *data_end; |
197 | int blank, y, idx; | 180 | int blank, length; |
198 | 181 | ||
199 | if ((count == 0) || ((unsigned)count >= (unsigned)_grey_info.width)) | 182 | if ((unsigned)count >= (unsigned)_grey_info.width) |
200 | return; | 183 | return; |
201 | 184 | ||
185 | data = _grey_info.values; | ||
186 | data_end = data + _GREY_MULUQ(_grey_info.width, _grey_info.height); | ||
187 | length = (_grey_info.width - count) << _GREY_BSHIFT; | ||
188 | count <<= _GREY_BSHIFT; | ||
202 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? | 189 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? |
203 | _grey_info.fg_val : _grey_info.bg_val; | 190 | _grey_info.fg_val : _grey_info.bg_val; |
204 | 191 | ||
205 | for (y = 0; y < _grey_info.height; y++) | 192 | do |
206 | { | 193 | { |
207 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | 194 | _grey_rb->memmove(data + count, data, length); |
208 | idx = _GREY_MULUQ(_grey_info.width, y); | 195 | _grey_rb->memset(data, blank, count); |
209 | #else | 196 | data += _grey_info.width << _GREY_BSHIFT; |
210 | #if LCD_DEPTH == 1 | ||
211 | idx = _GREY_MULUQ(_grey_info.width, y & ~7) + (~y & 7); | ||
212 | #elif LCD_DEPTH == 2 | ||
213 | idx = _GREY_MULUQ(_grey_info.width, y & ~3) + (~y & 3); | ||
214 | #endif | ||
215 | #endif /* LCD_PIXELFORMAT */ | ||
216 | start = _grey_info.values + idx; | ||
217 | dst = start + _grey_info.width * _GREY_X_ADVANCE; | ||
218 | src = dst - count * _GREY_X_ADVANCE; | ||
219 | |||
220 | do | ||
221 | { | ||
222 | dst -= _GREY_X_ADVANCE; | ||
223 | src -= _GREY_X_ADVANCE; | ||
224 | *dst = *src; | ||
225 | } | ||
226 | while (src > start); | ||
227 | |||
228 | do | ||
229 | { | ||
230 | dst -= _GREY_X_ADVANCE; | ||
231 | *dst = blank; | ||
232 | } | ||
233 | while (dst > start); | ||
234 | } | 197 | } |
198 | while (data < data_end); | ||
235 | } | 199 | } |
236 | 200 | ||
201 | /* Scroll up */ | ||
237 | void grey_ub_scroll_up(int count) | 202 | void grey_ub_scroll_up(int count) |
238 | { | 203 | { |
239 | unsigned char *dst, *dst_end, *src; | 204 | unsigned char *dst, *end, *src; |
240 | int blank, ys, yd, is, id; | 205 | int blank; |
241 | 206 | ||
242 | if ((unsigned)count >= (unsigned)_grey_info.height) | 207 | if ((unsigned)count >= (unsigned)_grey_info.height) |
243 | return; | 208 | return; |
244 | 209 | ||
210 | dst = _grey_info.values; | ||
211 | end = dst + _GREY_MULUQ(_grey_info.height, _grey_info.width); | ||
245 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? | 212 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? |
246 | _grey_info.fg_val : _grey_info.bg_val; | 213 | _grey_info.fg_val : _grey_info.bg_val; |
247 | 214 | ||
248 | for (ys = count, yd = 0; ys < _grey_info.height; ys++, yd++) | 215 | #if LCD_PIXELFORMAT == VERTICAL_PACKING |
216 | if (count & _GREY_BMASK) | ||
249 | { | 217 | { |
250 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | 218 | /* Scrolling by fractional blocks - move pixel wise. */ |
251 | id = _GREY_MULUQ(_grey_info.width, yd); | 219 | unsigned char *line_end; |
252 | is = _GREY_MULUQ(_grey_info.width, ys); | 220 | int ys, yd; |
253 | #else | ||
254 | #if LCD_DEPTH == 1 | ||
255 | id = _GREY_MULUQ(_grey_info.width, yd & ~7) + (~yd & 7); | ||
256 | is = _GREY_MULUQ(_grey_info.width, ys & ~7) + (~ys & 7); | ||
257 | #elif LCD_DEPTH == 2 | ||
258 | id = _GREY_MULUQ(_grey_info.width, yd & ~3) + (~yd & 3); | ||
259 | is = _GREY_MULUQ(_grey_info.width, ys & ~3) + (~ys & 3); | ||
260 | #endif | ||
261 | #endif /* LCD_PIXELFORMAT */ | ||
262 | dst = _grey_info.values + id; | ||
263 | src = _grey_info.values + is; | ||
264 | dst_end = dst + _grey_info.width * _GREY_X_ADVANCE; | ||
265 | 221 | ||
266 | do | 222 | for (ys = count, yd = 0; ys < _grey_info.height; ys++, yd++) |
267 | { | 223 | { |
268 | *dst = *src; | 224 | dst = _grey_info.values |
269 | dst += _GREY_X_ADVANCE; | 225 | + _GREY_MULUQ(_grey_info.width, yd & ~_GREY_BMASK) |
270 | src += _GREY_X_ADVANCE; | 226 | + (~yd & _GREY_BMASK); |
227 | src = _grey_info.values | ||
228 | + _GREY_MULUQ(_grey_info.width, ys & ~_GREY_BMASK) | ||
229 | + (~ys & _GREY_BMASK); | ||
230 | line_end = dst + _grey_info.width * _GREY_BSIZE; | ||
231 | |||
232 | do | ||
233 | { | ||
234 | *dst = *src; | ||
235 | dst += _GREY_BSIZE; | ||
236 | src += _GREY_BSIZE; | ||
237 | } | ||
238 | while (dst < line_end); | ||
239 | } | ||
240 | for (; yd & _GREY_BMASK; yd++) /* Fill remainder of current block. */ | ||
241 | { | ||
242 | dst = _grey_info.values | ||
243 | + _GREY_MULUQ(_grey_info.width, yd & ~_GREY_BMASK) | ||
244 | + (~yd & _GREY_BMASK); | ||
245 | line_end = dst + _grey_info.width * _GREY_BSIZE; | ||
246 | |||
247 | do | ||
248 | { | ||
249 | *dst = blank; | ||
250 | dst += _GREY_BSIZE; | ||
251 | } | ||
252 | while (dst < line_end); | ||
271 | } | 253 | } |
272 | while (dst < dst_end); | ||
273 | } | 254 | } |
274 | for (; yd < _grey_info.height; yd++) | 255 | else |
275 | { | ||
276 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | ||
277 | id = _GREY_MULUQ(_grey_info.width, yd); | ||
278 | #else | ||
279 | #if LCD_DEPTH == 1 | ||
280 | id = _GREY_MULUQ(_grey_info.width, yd & ~7) + (~yd & 7); | ||
281 | #elif LCD_DEPTH == 2 | ||
282 | id = _GREY_MULUQ(_grey_info.width, yd & ~3) + (~yd & 3); | ||
283 | #endif | 256 | #endif |
284 | #endif /* LCD_PIXELFORMAT */ | 257 | { |
285 | dst = _grey_info.values + id; | 258 | int blen = _GREY_MULUQ(_grey_info.height - count, _grey_info.width); |
286 | dst_end = dst + _grey_info.width * _GREY_X_ADVANCE; | ||
287 | 259 | ||
288 | do | 260 | src = dst + _GREY_MULUQ(count, _grey_info.width); |
289 | { | 261 | _grey_rb->memmove(dst, src, blen); |
290 | *dst = blank; | 262 | dst += blen; |
291 | dst += _GREY_X_ADVANCE; | ||
292 | } | ||
293 | while (dst < dst_end); | ||
294 | } | 263 | } |
264 | _grey_rb->memset(dst, blank, end - dst); /* Fill remainder at once. */ | ||
295 | } | 265 | } |
296 | 266 | ||
267 | /* Scroll down */ | ||
297 | void grey_ub_scroll_down(int count) | 268 | void grey_ub_scroll_down(int count) |
298 | { | 269 | { |
299 | unsigned char *dst, *dst_end, *src; | 270 | unsigned char *start, *dst, *src; |
300 | int blank, ys, yd, is, id; | 271 | int blank; |
301 | 272 | ||
302 | if ((unsigned)count >= (unsigned)_grey_info.height) | 273 | if ((unsigned)count >= (unsigned)_grey_info.height) |
303 | return; | 274 | return; |
304 | 275 | ||
276 | start = _grey_info.values; | ||
277 | dst = start + _GREY_MULUQ(_grey_info.height, _grey_info.width); | ||
305 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? | 278 | blank = (_grey_info.drawmode & DRMODE_INVERSEVID) ? |
306 | _grey_info.fg_val : _grey_info.bg_val; | 279 | _grey_info.fg_val : _grey_info.bg_val; |
307 | 280 | ||
308 | yd = _grey_info.height - 1; | 281 | #if LCD_PIXELFORMAT == VERTICAL_PACKING |
309 | for (ys = yd - count; ys >= 0; ys--, yd--) | 282 | if (count & _GREY_BMASK) |
310 | { | 283 | { |
311 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | 284 | /* Scrolling by fractional blocks - move pixel wise. */ |
312 | id = _GREY_MULUQ(_grey_info.width, yd); | 285 | unsigned char *line_end; |
313 | is = _GREY_MULUQ(_grey_info.width, ys); | 286 | int ys, yd; |
314 | #else | ||
315 | #if LCD_DEPTH == 1 | ||
316 | id = _GREY_MULUQ(_grey_info.width, yd & ~7) + (~yd & 7); | ||
317 | is = _GREY_MULUQ(_grey_info.width, ys & ~7) + (~ys & 7); | ||
318 | #elif LCD_DEPTH == 2 | ||
319 | id = _GREY_MULUQ(_grey_info.width, yd & ~3) + (~yd & 3); | ||
320 | is = _GREY_MULUQ(_grey_info.width, ys & ~3) + (~ys & 3); | ||
321 | #endif | ||
322 | #endif /* LCD_PIXELFORMAT */ | ||
323 | dst = _grey_info.values + id; | ||
324 | src = _grey_info.values + is; | ||
325 | dst_end = dst + _grey_info.width * _GREY_X_ADVANCE; | ||
326 | 287 | ||
327 | do | 288 | yd = _grey_info.height - 1; |
289 | for (ys = yd - count; ys >= 0; ys--, yd--) | ||
328 | { | 290 | { |
329 | *dst = *src; | 291 | dst = _grey_info.values |
330 | dst += _GREY_X_ADVANCE; | 292 | + _GREY_MULUQ(_grey_info.width, yd & ~_GREY_BMASK) |
331 | src += _GREY_X_ADVANCE; | 293 | + (~yd & _GREY_BMASK); |
294 | src = _grey_info.values | ||
295 | + _GREY_MULUQ(_grey_info.width, ys & ~_GREY_BMASK) | ||
296 | + (~ys & _GREY_BMASK); | ||
297 | line_end = dst + _grey_info.width * _GREY_BSIZE; | ||
298 | |||
299 | do | ||
300 | { | ||
301 | *dst = *src; | ||
302 | dst += _GREY_BSIZE; | ||
303 | src += _GREY_BSIZE; | ||
304 | } | ||
305 | while (dst < line_end); | ||
306 | } | ||
307 | for (; ~yd & _GREY_BMASK; yd--) /* Fill remainder of current block. */ | ||
308 | { | ||
309 | dst = _grey_info.values | ||
310 | + _GREY_MULUQ(_grey_info.width, yd & ~_GREY_BMASK) | ||
311 | + (~yd & _GREY_BMASK); | ||
312 | line_end = dst + _grey_info.width * _GREY_BSIZE; | ||
313 | |||
314 | do | ||
315 | { | ||
316 | line_end -= _GREY_BSIZE; | ||
317 | *line_end = blank; | ||
318 | } | ||
319 | while (dst < line_end); | ||
332 | } | 320 | } |
333 | while (dst < dst_end); | ||
334 | } | 321 | } |
335 | for (; yd >= 0; yd--) | 322 | else |
336 | { | ||
337 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | ||
338 | id = _GREY_MULUQ(_grey_info.width, yd); | ||
339 | #else | ||
340 | #if LCD_DEPTH == 1 | ||
341 | id = _GREY_MULUQ(_grey_info.width, yd & ~7) + (~yd & 7); | ||
342 | #elif LCD_DEPTH == 2 | ||
343 | id = _GREY_MULUQ(_grey_info.width, yd & ~3) + (~yd & 3); | ||
344 | #endif | 323 | #endif |
345 | #endif /* LCD_PIXELFORMAT */ | 324 | { |
346 | dst = _grey_info.values + id; | 325 | int blen = _GREY_MULUQ(_grey_info.height - count, _grey_info.width); |
347 | dst_end = dst + _grey_info.width * _GREY_X_ADVANCE; | ||
348 | 326 | ||
349 | do | 327 | dst -= blen; |
350 | { | 328 | _grey_rb->memmove(dst, start, blen); |
351 | *dst = blank; | ||
352 | dst += _GREY_X_ADVANCE; | ||
353 | } | ||
354 | while (dst < dst_end); | ||
355 | } | 329 | } |
330 | _grey_rb->memset(start, blank, dst - start); /* Fill remainder at once. */ | ||
356 | } | 331 | } |
357 | 332 | ||
358 | #endif /* !SIMULATOR */ | 333 | #endif /* !SIMULATOR */ |