summaryrefslogtreecommitdiff
path: root/apps/plugins/lib/grey_scroll.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lib/grey_scroll.c')
-rw-r--r--apps/plugins/lib/grey_scroll.c273
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 */
150void grey_ub_scroll_left(int count) 151void 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 */
194void grey_ub_scroll_right(int count) 177void 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 */
237void grey_ub_scroll_up(int count) 202void 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 */
297void grey_ub_scroll_down(int count) 268void 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 */