diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2012-02-22 21:18:05 +1100 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2012-02-28 11:44:59 +1100 |
commit | b37e6bc8c119289aca8740dd5e3b60d72f9d6b40 (patch) | |
tree | 7ee9d491811c950943f0fc068d2e2b460ff05c6d /firmware/drivers/lcd-2bit-horz.c | |
parent | 15c69b8bafc3e89e1a825b5bbefef4a97f0001b1 (diff) | |
download | rockbox-b37e6bc8c119289aca8740dd5e3b60d72f9d6b40.tar.gz rockbox-b37e6bc8c119289aca8740dd5e3b60d72f9d6b40.zip |
lcd drivers: Convert lcd_[remote_]framebuffer to a pointer
Change all lcd drivers to using a pointer to the static framebuffer
instead of directly accessing the static array. This will let us
later do fun things like dynamic framebuffer sizes (RaaA) or
ability to use different buffers for different layers (dynamic
skin backdrops!)
Change-Id: I0a4d58a9d7b55e6c932131b929e5d4c9f9414b06
Diffstat (limited to 'firmware/drivers/lcd-2bit-horz.c')
-rw-r--r-- | firmware/drivers/lcd-2bit-horz.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c index b4805094ff..3870bac644 100644 --- a/firmware/drivers/lcd-2bit-horz.c +++ b/firmware/drivers/lcd-2bit-horz.c | |||
@@ -39,7 +39,8 @@ | |||
39 | 39 | ||
40 | /*** globals ***/ | 40 | /*** globals ***/ |
41 | 41 | ||
42 | unsigned char lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER; | 42 | unsigned char lcd_static_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER; |
43 | unsigned char *lcd_framebuffer = &lcd_static_framebuffer[0][0]; | ||
43 | 44 | ||
44 | static const unsigned char pixmask[4] ICONST_ATTR = { | 45 | static const unsigned char pixmask[4] ICONST_ATTR = { |
45 | 0xC0, 0x30, 0x0C, 0x03 | 46 | 0xC0, 0x30, 0x0C, 0x03 |
@@ -193,7 +194,7 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h) | |||
193 | static void setpixel(int x, int y) | 194 | static void setpixel(int x, int y) |
194 | { | 195 | { |
195 | unsigned mask = pixmask[x & 3]; | 196 | unsigned mask = pixmask[x & 3]; |
196 | fb_data *address = &lcd_framebuffer[y][x>>2]; | 197 | fb_data *address = FBADDR(x>>2,y); |
197 | unsigned data = *address; | 198 | unsigned data = *address; |
198 | 199 | ||
199 | *address = data ^ ((data ^ fg_pattern) & mask); | 200 | *address = data ^ ((data ^ fg_pattern) & mask); |
@@ -202,7 +203,7 @@ static void setpixel(int x, int y) | |||
202 | static void clearpixel(int x, int y) | 203 | static void clearpixel(int x, int y) |
203 | { | 204 | { |
204 | unsigned mask = pixmask[x & 3]; | 205 | unsigned mask = pixmask[x & 3]; |
205 | fb_data *address = &lcd_framebuffer[y][x>>2]; | 206 | fb_data *address = FBADDR(x>>2,y); |
206 | unsigned data = *address; | 207 | unsigned data = *address; |
207 | 208 | ||
208 | *address = data ^ ((data ^ bg_pattern) & mask); | 209 | *address = data ^ ((data ^ bg_pattern) & mask); |
@@ -211,7 +212,7 @@ static void clearpixel(int x, int y) | |||
211 | static void clearimgpixel(int x, int y) | 212 | static void clearimgpixel(int x, int y) |
212 | { | 213 | { |
213 | unsigned mask = pixmask[x & 3]; | 214 | unsigned mask = pixmask[x & 3]; |
214 | fb_data *address = &lcd_framebuffer[y][x>>2]; | 215 | fb_data *address = FBADDR(x>>2,y); |
215 | unsigned data = *address; | 216 | unsigned data = *address; |
216 | 217 | ||
217 | *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask); | 218 | *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask); |
@@ -220,7 +221,7 @@ static void clearimgpixel(int x, int y) | |||
220 | static void flippixel(int x, int y) | 221 | static void flippixel(int x, int y) |
221 | { | 222 | { |
222 | unsigned mask = pixmask[x & 3]; | 223 | unsigned mask = pixmask[x & 3]; |
223 | fb_data *address = &lcd_framebuffer[y][x>>2]; | 224 | fb_data *address = FBADDR(x>>2,y); |
224 | 225 | ||
225 | *address ^= mask; | 226 | *address ^= mask; |
226 | } | 227 | } |
@@ -396,14 +397,14 @@ void lcd_clear_display(void) | |||
396 | { | 397 | { |
397 | if (current_vp->drawmode & DRMODE_INVERSEVID) | 398 | if (current_vp->drawmode & DRMODE_INVERSEVID) |
398 | { | 399 | { |
399 | memset(lcd_framebuffer, fg_pattern, sizeof lcd_framebuffer); | 400 | memset(lcd_framebuffer, fg_pattern, FRAMEBUFFER_SIZE); |
400 | } | 401 | } |
401 | else | 402 | else |
402 | { | 403 | { |
403 | if (lcd_backdrop) | 404 | if (lcd_backdrop) |
404 | memcpy(lcd_framebuffer, lcd_backdrop, sizeof lcd_framebuffer); | 405 | memcpy(lcd_framebuffer, lcd_backdrop, FRAMEBUFFER_SIZE); |
405 | else | 406 | else |
406 | memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer); | 407 | memset(lcd_framebuffer, bg_pattern, FRAMEBUFFER_SIZE); |
407 | } | 408 | } |
408 | 409 | ||
409 | lcd_scroll_info.lines = 0; | 410 | lcd_scroll_info.lines = 0; |
@@ -583,7 +584,7 @@ void lcd_hline(int x1, int x2, int y) | |||
583 | #endif | 584 | #endif |
584 | 585 | ||
585 | bfunc = lcd_blockfuncs[current_vp->drawmode]; | 586 | bfunc = lcd_blockfuncs[current_vp->drawmode]; |
586 | dst = &lcd_framebuffer[y][x1>>2]; | 587 | dst = FBADDR(x1>>2,y); |
587 | nx = x2 - (x1 & ~3); | 588 | nx = x2 - (x1 & ~3); |
588 | mask = 0xFFu >> (2 * (x1 & 3)); | 589 | mask = 0xFFu >> (2 * (x1 & 3)); |
589 | mask_right = 0xFFu << (2 * (~nx & 3)); | 590 | mask_right = 0xFFu << (2 * (~nx & 3)); |
@@ -644,7 +645,7 @@ void lcd_vline(int x, int y1, int y2) | |||
644 | #endif | 645 | #endif |
645 | 646 | ||
646 | bfunc = lcd_blockfuncs[current_vp->drawmode]; | 647 | bfunc = lcd_blockfuncs[current_vp->drawmode]; |
647 | dst = &lcd_framebuffer[y1][x>>2]; | 648 | dst = FBADDR(x>>2,y1); |
648 | mask = pixmask[x & 3]; | 649 | mask = pixmask[x & 3]; |
649 | 650 | ||
650 | dst_end = dst + (y2 - y1) * LCD_FBWIDTH; | 651 | dst_end = dst + (y2 - y1) * LCD_FBWIDTH; |
@@ -729,7 +730,7 @@ void lcd_fillrect(int x, int y, int width, int height) | |||
729 | #endif | 730 | #endif |
730 | 731 | ||
731 | bfunc = lcd_blockfuncs[current_vp->drawmode]; | 732 | bfunc = lcd_blockfuncs[current_vp->drawmode]; |
732 | dst = &lcd_framebuffer[y][x>>2]; | 733 | dst = FBADDR(x>>2,y); |
733 | nx = width - 1 + (x & 3); | 734 | nx = width - 1 + (x & 3); |
734 | mask = 0xFFu >> (2 * (x & 3)); | 735 | mask = 0xFFu >> (2 * (x & 3)); |
735 | mask_right = 0xFFu << (2 * (~nx & 3)); | 736 | mask_right = 0xFFu << (2 * (~nx & 3)); |
@@ -836,7 +837,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
836 | src_y &= 7; | 837 | src_y &= 7; |
837 | src_end = src + width; | 838 | src_end = src + width; |
838 | 839 | ||
839 | dst = &lcd_framebuffer[y][x >> 2]; | 840 | dst = FBADDR(x >> 2,y); |
840 | dst_end = dst + height * LCD_FBWIDTH; | 841 | dst_end = dst + height * LCD_FBWIDTH; |
841 | dst_mask = pixmask[x & 3]; | 842 | dst_mask = pixmask[x & 3]; |
842 | 843 | ||
@@ -1050,7 +1051,7 @@ void ICODE_ATTR lcd_bitmap_part(const unsigned char *src, int src_x, | |||
1050 | src += stride * src_y + (src_x >> 2); /* move starting point */ | 1051 | src += stride * src_y + (src_x >> 2); /* move starting point */ |
1051 | src_x &= 3; | 1052 | src_x &= 3; |
1052 | x -= src_x; | 1053 | x -= src_x; |
1053 | dst = &lcd_framebuffer[y][x>>2]; | 1054 | dst = FBADDR(x>>2,y); |
1054 | shift = x & 3; | 1055 | shift = x & 3; |
1055 | nx = width - 1 + shift + src_x; | 1056 | nx = width - 1 + shift + src_x; |
1056 | 1057 | ||