summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-2bit-horz.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2012-02-22 21:18:05 +1100
committerJonathan Gordon <rockbox@jdgordon.info>2012-02-28 11:44:59 +1100
commitb37e6bc8c119289aca8740dd5e3b60d72f9d6b40 (patch)
tree7ee9d491811c950943f0fc068d2e2b460ff05c6d /firmware/drivers/lcd-2bit-horz.c
parent15c69b8bafc3e89e1a825b5bbefef4a97f0001b1 (diff)
downloadrockbox-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.c27
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
42unsigned char lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER; 42unsigned char lcd_static_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER;
43unsigned char *lcd_framebuffer = &lcd_static_framebuffer[0][0];
43 44
44static const unsigned char pixmask[4] ICONST_ATTR = { 45static 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)
193static void setpixel(int x, int y) 194static 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)
202static void clearpixel(int x, int y) 203static 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)
211static void clearimgpixel(int x, int y) 212static 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)
220static void flippixel(int x, int y) 221static 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