diff options
author | Jens Arnold <amiconn@rockbox.org> | 2008-01-10 22:51:33 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2008-01-10 22:51:33 +0000 |
commit | df5c3e15e8d04d519b7870fe809c15053783c14c (patch) | |
tree | 984d43fcc9756a39b693976a91f3b3e657cef361 /apps | |
parent | 12cc3cc47cf4820a323fabf9815076705b9dd8fb (diff) | |
download | rockbox-df5c3e15e8d04d519b7870fe809c15053783c14c.tar.gz rockbox-df5c3e15e8d04d519b7870fe809c15053783c14c.zip |
Greyscale library: * Introduced some extra macros dealing with block size, allowing to write some parts with less #ifdefing. * Optimised grey_update_rect() for horizontally packed LCDs, and unbuffered scrolling.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16050 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/lib/grey.h | 9 | ||||
-rw-r--r-- | apps/plugins/lib/grey_core.c | 58 | ||||
-rw-r--r-- | apps/plugins/lib/grey_draw.c | 13 | ||||
-rw-r--r-- | apps/plugins/lib/grey_scroll.c | 273 |
4 files changed, 168 insertions, 185 deletions
diff --git a/apps/plugins/lib/grey.h b/apps/plugins/lib/grey.h index 9a3bd7d3f8..5bef88a89a 100644 --- a/apps/plugins/lib/grey.h +++ b/apps/plugins/lib/grey.h | |||
@@ -121,15 +121,18 @@ void grey_ub_scroll_down(int count); | |||
121 | #endif | 121 | #endif |
122 | 122 | ||
123 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | 123 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING |
124 | #define _GREY_X_ADVANCE 1 | 124 | #define _GREY_BSHIFT 0 |
125 | #else | 125 | #else |
126 | #if LCD_DEPTH == 1 | 126 | #if LCD_DEPTH == 1 |
127 | #define _GREY_X_ADVANCE 8 | 127 | #define _GREY_BSHIFT 3 |
128 | #elif LCD_DEPTH == 2 | 128 | #elif LCD_DEPTH == 2 |
129 | #define _GREY_X_ADVANCE 4 | 129 | #define _GREY_BSHIFT 2 |
130 | #endif | 130 | #endif |
131 | #endif /* LCD_PIXELFORMAT */ | 131 | #endif /* LCD_PIXELFORMAT */ |
132 | 132 | ||
133 | #define _GREY_BSIZE (1<<_GREY_BSHIFT) | ||
134 | #define _GREY_BMASK (_GREY_BSIZE-1) | ||
135 | |||
133 | /* The greyscale buffer management structure */ | 136 | /* The greyscale buffer management structure */ |
134 | struct _grey_info | 137 | struct _grey_info |
135 | { | 138 | { |
diff --git a/apps/plugins/lib/grey_core.c b/apps/plugins/lib/grey_core.c index 43eed9b022..5ba5f41404 100644 --- a/apps/plugins/lib/grey_core.c +++ b/apps/plugins/lib/grey_core.c | |||
@@ -373,7 +373,10 @@ bool grey_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, | |||
373 | return false; | 373 | return false; |
374 | 374 | ||
375 | #ifndef SIMULATOR | 375 | #ifndef SIMULATOR |
376 | /* Init to white */ | ||
376 | _grey_rb->memset(_grey_info.values, 0x80, plane_size); | 377 | _grey_rb->memset(_grey_info.values, 0x80, plane_size); |
378 | |||
379 | /* Init phases with random bits */ | ||
377 | dst = (unsigned*)(_grey_info.phases); | 380 | dst = (unsigned*)(_grey_info.phases); |
378 | end = (unsigned*)(_grey_info.phases + plane_size); | 381 | end = (unsigned*)(_grey_info.phases + plane_size); |
379 | 382 | ||
@@ -516,7 +519,7 @@ void grey_update_rect(int x, int y, int width, int height) | |||
516 | 519 | ||
517 | void grey_update_rect(int x, int y, int width, int height) | 520 | void grey_update_rect(int x, int y, int width, int height) |
518 | { | 521 | { |
519 | unsigned char *src; | 522 | unsigned char *src, *dst; |
520 | 523 | ||
521 | if ((width <= 0) || (height <= 0)) | 524 | if ((width <= 0) || (height <= 0)) |
522 | return; /* nothing to do */ | 525 | return; /* nothing to do */ |
@@ -527,26 +530,31 @@ void grey_update_rect(int x, int y, int width, int height) | |||
527 | width = _grey_info.width - x; | 530 | width = _grey_info.width - x; |
528 | 531 | ||
529 | src = _grey_info.buffer + _GREY_MULUQ(_grey_info.width, y) + x; | 532 | src = _grey_info.buffer + _GREY_MULUQ(_grey_info.width, y) + x; |
533 | |||
534 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | ||
535 | dst = _grey_info.values + _GREY_MULUQ(_grey_info.width, y) + x; | ||
530 | 536 | ||
531 | do | 537 | do |
538 | { | ||
539 | _grey_rb->memcpy(dst, src, width); | ||
540 | dst += _grey_info.width; | ||
541 | src += _grey_info.width; | ||
542 | } | ||
543 | while (--height > 0); | ||
544 | |||
545 | #else /* LCD_PIXELFORMAT == VRTICAL_PACKING */ | ||
546 | do | ||
532 | { | 547 | { |
533 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | ||
534 | int idx = _GREY_MULUQ(_grey_info.width, y) + x; | ||
535 | #else | ||
536 | #if LCD_DEPTH == 1 | ||
537 | int idx = _GREY_MULUQ(_grey_info.width, y & ~7) + (x << 3) + (~y & 7); | ||
538 | #elif LCD_DEPTH == 2 | ||
539 | int idx = _GREY_MULUQ(_grey_info.width, y & ~3) + (x << 2) + (~y & 3); | ||
540 | #endif | ||
541 | #endif /* LCD_PIXELFORMAT */ | ||
542 | unsigned char *dst_row = _grey_info.values + idx; | ||
543 | unsigned char *src_row = src; | 548 | unsigned char *src_row = src; |
544 | unsigned char *src_end = src + width; | 549 | unsigned char *src_end = src + width; |
545 | 550 | ||
551 | dst = _grey_info.values | ||
552 | + _GREY_MULUQ(_grey_info.width, y & ~_GREY_BMASK) | ||
553 | + (x << _GREY_BSHIFT) + (~y & _GREY_BMASK); | ||
546 | do | 554 | do |
547 | { | 555 | { |
548 | *dst_row = *src_row++; | 556 | *dst = *src_row++; |
549 | dst_row += _GREY_X_ADVANCE; | 557 | dst += _GREY_BSIZE; |
550 | } | 558 | } |
551 | while (src_row < src_end); | 559 | while (src_row < src_end); |
552 | 560 | ||
@@ -554,6 +562,8 @@ void grey_update_rect(int x, int y, int width, int height) | |||
554 | src += _grey_info.width; | 562 | src += _grey_info.width; |
555 | } | 563 | } |
556 | while (--height > 0); | 564 | while (--height > 0); |
565 | |||
566 | #endif /* LCD_PIXELFORMAT */ | ||
557 | } | 567 | } |
558 | 568 | ||
559 | #endif /* !SIMULATOR */ | 569 | #endif /* !SIMULATOR */ |
@@ -687,18 +697,12 @@ static void grey_screendump_hook(int fd) | |||
687 | #ifdef SIMULATOR | 697 | #ifdef SIMULATOR |
688 | unsigned char *src = _grey_info.buffer | 698 | unsigned char *src = _grey_info.buffer |
689 | + _GREY_MULUQ(_grey_info.width, gy) + gx; | 699 | + _GREY_MULUQ(_grey_info.width, gy) + gx; |
690 | |||
691 | for (i = 0; i < 4; i++) | ||
692 | linebuf[x + i] = BMP_FIXEDCOLORS + *src++; | ||
693 | #else | 700 | #else |
694 | unsigned char *src = _grey_info.values | 701 | unsigned char *src = _grey_info.values |
695 | + _GREY_MULUQ(_grey_info.width, gy) + gx; | 702 | + _GREY_MULUQ(_grey_info.width, gy) + gx; |
696 | for (i = 0; i < 4; i++) | ||
697 | { | ||
698 | linebuf[x + i] = BMP_FIXEDCOLORS + *src; | ||
699 | src += _GREY_X_ADVANCE; | ||
700 | } | ||
701 | #endif | 703 | #endif |
704 | for (i = 0; i < 4; i++) | ||
705 | linebuf[x + i] = BMP_FIXEDCOLORS + *src++; | ||
702 | } | 706 | } |
703 | else | 707 | else |
704 | { | 708 | { |
@@ -730,7 +734,9 @@ static void grey_screendump_hook(int fd) | |||
730 | #else | 734 | #else |
731 | linebuf[x] = BMP_FIXEDCOLORS | 735 | linebuf[x] = BMP_FIXEDCOLORS |
732 | + _grey_info.values[_GREY_MULUQ(_grey_info.width, | 736 | + _grey_info.values[_GREY_MULUQ(_grey_info.width, |
733 | gy & ~7) + (gx << 3) + (~gy & 7)]; | 737 | gy & ~_GREY_BMASK) |
738 | + (gx << _GREY_BSHIFT) | ||
739 | + (~gy & _GREY_BMASK)]; | ||
734 | #endif | 740 | #endif |
735 | } | 741 | } |
736 | else | 742 | else |
@@ -757,7 +763,9 @@ static void grey_screendump_hook(int fd) | |||
757 | #else | 763 | #else |
758 | linebuf[x] = BMP_FIXEDCOLORS | 764 | linebuf[x] = BMP_FIXEDCOLORS |
759 | + _grey_info.values[_GREY_MULUQ(_grey_info.width, | 765 | + _grey_info.values[_GREY_MULUQ(_grey_info.width, |
760 | gy & ~3) + (gx << 2) + (~gy & 3)]; | 766 | gy & ~_GREY_BMASK) |
767 | + (gx << _GREY_BSHIFT) | ||
768 | + (~gy & _GREY_BMASK)]; | ||
761 | #endif | 769 | #endif |
762 | } | 770 | } |
763 | else | 771 | else |
diff --git a/apps/plugins/lib/grey_draw.c b/apps/plugins/lib/grey_draw.c index ccb8deae7b..683793129e 100644 --- a/apps/plugins/lib/grey_draw.c +++ b/apps/plugins/lib/grey_draw.c | |||
@@ -634,18 +634,15 @@ void grey_ub_gray_bitmap_part(const unsigned char *src, int src_x, int src_y, | |||
634 | if (y + height > _grey_info.height) | 634 | if (y + height > _grey_info.height) |
635 | height = _grey_info.height - y; | 635 | height = _grey_info.height - y; |
636 | 636 | ||
637 | src += _GREY_MULUQ(stride, src_y) + src_x; /* move starting point */ | 637 | src += _GREY_MULUQ(stride, src_y) + src_x; /* move starting point */ |
638 | 638 | ||
639 | do | 639 | do |
640 | { | 640 | { |
641 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | 641 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING |
642 | int idx = _GREY_MULUQ(_grey_info.width, y) + x; | 642 | int idx = _GREY_MULUQ(_grey_info.width, y) + x; |
643 | #else | 643 | #else |
644 | #if LCD_DEPTH == 1 | 644 | int idx = _GREY_MULUQ(_grey_info.width, y & ~_GREY_BMASK) |
645 | int idx = _GREY_MULUQ(_grey_info.width, y & ~7) + (x << 3) + (~y & 7); | 645 | + (x << _GREY_BSHIFT) + (~y & _GREY_BMASK); |
646 | #elif LCD_DEPTH == 2 | ||
647 | int idx = _GREY_MULUQ(_grey_info.width, y & ~3) + (x << 2) + (~y & 3); | ||
648 | #endif | ||
649 | #endif /* LCD_PIXELFORMAT */ | 646 | #endif /* LCD_PIXELFORMAT */ |
650 | unsigned char *dst_row = _grey_info.values + idx; | 647 | unsigned char *dst_row = _grey_info.values + idx; |
651 | const unsigned char *src_row = src; | 648 | const unsigned char *src_row = src; |
@@ -654,7 +651,7 @@ void grey_ub_gray_bitmap_part(const unsigned char *src, int src_x, int src_y, | |||
654 | do | 651 | do |
655 | { | 652 | { |
656 | *dst_row = _grey_info.gvalue[*src_row++]; | 653 | *dst_row = _grey_info.gvalue[*src_row++]; |
657 | dst_row += _GREY_X_ADVANCE; | 654 | dst_row += _GREY_BSIZE; |
658 | } | 655 | } |
659 | while (src_row < src_end); | 656 | while (src_row < src_end); |
660 | 657 | ||
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 */ |