summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2006-07-28 07:17:00 +0000
committerJens Arnold <amiconn@rockbox.org>2006-07-28 07:17:00 +0000
commitcb36fec3922cb1317bdb06a6497370f188694d4e (patch)
tree5dfe6aa35f8e55485e18de4c5bdac0ed54e8d80c
parent2d4cfa8738abc42603de8f90e715433bb4345dd7 (diff)
downloadrockbox-cb36fec3922cb1317bdb06a6497370f188694d4e.zip
rockbox-cb36fec3922cb1317bdb06a6497370f188694d4e.tar.gz
rockbox-cb36fec3922cb1317bdb06a6497370f188694d4e.tar.bz2
rockbox-cb36fec3922cb1317bdb06a6497370f188694d4e.tar.xz
LCD drivers: * Slight speedup for 2bit greyscale drivers. Use the same scrolltext drawing anywhere. * Cleanup, fixes and definitions in preparation for X5 remote.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10346 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/lcd-16bit.c3
-rw-r--r--firmware/drivers/lcd-2bit-horz.c71
-rw-r--r--firmware/drivers/lcd-h100-remote.c70
-rw-r--r--firmware/drivers/lcd-h100.c91
-rw-r--r--firmware/export/config-h100.h2
-rw-r--r--firmware/export/config-h120.h2
-rw-r--r--firmware/export/config-h300.h2
-rw-r--r--firmware/export/lcd-remote.h109
-rw-r--r--firmware/export/lcd.h2
9 files changed, 216 insertions, 136 deletions
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
index d237dac..fd95f2a 100644
--- a/firmware/drivers/lcd-16bit.c
+++ b/firmware/drivers/lcd-16bit.c
@@ -34,7 +34,7 @@
#include "rbunicode.h"
#include "bidi.h"
-#define SCROLLABLE_LINES 26
+#define SCROLLABLE_LINES ((LCD_HEIGHT+4)/5 < 32 ? (LCD_HEIGHT+4)/5 : 32)
enum fill_opt {
OPT_NONE = 0,
@@ -972,4 +972,3 @@ static void scroll_thread(void)
sleep(scroll_ticks);
}
}
-
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
index 4ee2e2e..68074e3 100644
--- a/firmware/drivers/lcd-2bit-horz.c
+++ b/firmware/drivers/lcd-2bit-horz.c
@@ -34,7 +34,7 @@
#include "rbunicode.h"
#include "bidi.h"
-#define SCROLLABLE_LINES 26
+#define SCROLLABLE_LINES (((LCD_HEIGHT+4)/5 < 32) ? (LCD_HEIGHT+4)/5 : 32)
/*** globals ***/
@@ -148,21 +148,28 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
static void setpixel(int x, int y)
{
- unsigned char *data = &lcd_framebuffer[y][x>>2];
unsigned mask = pixmask[x & 3];
- *data = (*data & ~mask) | (fg_pattern & mask);
+ fb_data *address = &lcd_framebuffer[y][x>>2];
+ unsigned data = *address;
+
+ *address = data ^ ((data ^ fg_pattern) & mask);
}
static void clearpixel(int x, int y)
{
- unsigned char *data = &lcd_framebuffer[y][x>>2];
unsigned mask = pixmask[x & 3];
- *data = (*data & ~mask) | (bg_pattern & mask);
+ fb_data *address = &lcd_framebuffer[y][x>>2];
+ unsigned data = *address;
+
+ *address = data ^ ((data ^ bg_pattern) & mask);
}
static void flippixel(int x, int y)
{
- lcd_framebuffer[y][x>>2] ^= pixmask[x & 3];
+ unsigned mask = pixmask[x & 3];
+ fb_data *address = &lcd_framebuffer[y][x>>2];
+
+ *address ^= mask;
}
static void nopixel(int x, int y)
@@ -177,34 +184,34 @@ lcd_pixelfunc_type* const lcd_pixelfuncs[8] = {
};
/* 'mask' and 'bits' contain 2 bits per pixel */
-static void flipblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void flipblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipblock(fb_data *address, unsigned mask, unsigned bits)
{
*address ^= bits & mask;
}
-static void bgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bgblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void bgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bgblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ bg_pattern) & mask & ~bits);
}
-static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fgblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fgblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ fg_pattern) & mask & bits);
}
-static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
unsigned bgp = bg_pattern;
@@ -213,34 +220,34 @@ static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
*address = data ^ ((data ^ bits) & mask);
}
-static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipinvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipinvblock(fb_data *address, unsigned mask, unsigned bits)
{
*address ^= ~bits & mask;
}
-static void bginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bginvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void bginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bginvblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ bg_pattern) & mask & bits);
}
-static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fginvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fginvblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ fg_pattern) & mask & ~bits);
}
-static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidinvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidinvblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
unsigned fgp = fg_pattern;
@@ -254,7 +261,7 @@ lcd_blockfunc_type* const lcd_blockfuncs[8] = {
flipinvblock, bginvblock, fginvblock, solidinvblock
};
-static inline void setblock(unsigned char *address, unsigned mask, unsigned bits)
+static inline void setblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
@@ -510,11 +517,11 @@ void lcd_fillrect(int x, int y, int width, int height)
/* About Rockbox' internal monochrome bitmap format:
*
* A bitmap contains one bit for every pixel that defines if that pixel is
- * black (1) or white (0). Bits within a byte are arranged horizontally, LSB
+ * black (1) or white (0). Bits within a byte are arranged vertically, LSB
* at top.
* The bytes are stored in row-major order, with byte 0 being top left,
- * byte 1 2nd from left etc. The first row of bytes defines pixel row
- * 0, the second row defines pixel row 1 etc. */
+ * byte 1 2nd from left etc. The first row of bytes defines pixel rows
+ * 0..7, the second row defines pixel row 8..15 etc. */
/* Draw a partial monochrome bitmap */
void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
@@ -937,15 +944,9 @@ static void scroll_thread(void)
}
lastmode = drawmode;
- drawmode = (DRMODE_SOLID|DRMODE_INVERSEVID);
- lcd_fillrect(xpos, ypos, LCD_WIDTH - xpos, pf->height);
- drawmode = DRMODE_SOLID;
- lcd_putsxyofs(xpos, ypos, s->offset, (unsigned char *)s->line);
- if (s->invert)
- {
- drawmode = DRMODE_COMPLEMENT;
- lcd_fillrect(xpos, ypos, LCD_WIDTH - xpos, pf->height);
- }
+ drawmode = s->invert ?
+ (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID;
+ lcd_putsxyofs(xpos, ypos, s->offset, s->line);
drawmode = lastmode;
lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height);
}
diff --git a/firmware/drivers/lcd-h100-remote.c b/firmware/drivers/lcd-h100-remote.c
index f7b3c21..0c71f0b 100644
--- a/firmware/drivers/lcd-h100-remote.c
+++ b/firmware/drivers/lcd-h100-remote.c
@@ -65,8 +65,8 @@
/*** globals ***/
-unsigned char lcd_remote_framebuffer[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH]
- IBSS_ATTR;
+fb_remote_data lcd_remote_framebuffer[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH]
+ IBSS_ATTR;
static int drawmode = DRMODE_SOLID;
static int xmargin = 0;
@@ -686,35 +686,35 @@ static void nopixel(int x, int y)
(void)y;
}
-lcd_pixelfunc_type* const lcd_remote_pixelfuncs[8] = {
+lcd_remote_pixelfunc_type* const lcd_remote_pixelfuncs[8] = {
flippixel, nopixel, setpixel, setpixel,
nopixel, clearpixel, nopixel, clearpixel
};
-static void flipblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void flipblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
*address ^= bits & mask;
}
-static void bgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bgblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void bgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bgblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
*address &= bits | ~mask;
}
-static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fgblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fgblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
*address |= bits & mask;
}
-static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
@@ -722,30 +722,30 @@ static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
*address = data ^ (bits & mask);
}
-static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipinvblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipinvblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
*address ^= ~bits & mask;
}
-static void bginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bginvblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void bginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bginvblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
*address &= ~(bits & mask);
}
-static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fginvblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fginvblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
*address |= ~bits & mask;
}
-static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidinvblock(fb_remote_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidinvblock(fb_remote_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
@@ -753,7 +753,7 @@ static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
*address = data ^ (bits & mask);
}
-lcd_blockfunc_type* const lcd_remote_blockfuncs[8] = {
+lcd_remote_blockfunc_type* const lcd_remote_blockfuncs[8] = {
flipblock, bgblock, fgblock, solidblock,
flipinvblock, bginvblock, fginvblock, solidinvblock
};
@@ -785,7 +785,7 @@ void lcd_remote_drawline(int x1, int y1, int x2, int y2)
int d, dinc1, dinc2;
int x, xinc1, xinc2;
int y, yinc1, yinc2;
- lcd_pixelfunc_type *pfunc = lcd_remote_pixelfuncs[drawmode];
+ lcd_remote_pixelfunc_type *pfunc = lcd_remote_pixelfuncs[drawmode];
deltax = abs(x2 - x1);
deltay = abs(y2 - y1);
@@ -851,9 +851,9 @@ void lcd_remote_drawline(int x1, int y1, int x2, int y2)
void lcd_remote_hline(int x1, int x2, int y)
{
int x;
- unsigned char *dst, *dst_end;
+ fb_remote_data *dst, *dst_end;
unsigned mask;
- lcd_blockfunc_type *bfunc;
+ lcd_remote_blockfunc_type *bfunc;
/* direction flip */
if (x2 < x1)
@@ -888,9 +888,9 @@ void lcd_remote_hline(int x1, int x2, int y)
void lcd_remote_vline(int x, int y1, int y2)
{
int ny;
- unsigned char *dst;
+ fb_remote_data *dst;
unsigned mask, mask_bottom;
- lcd_blockfunc_type *bfunc;
+ lcd_remote_blockfunc_type *bfunc;
/* direction flip */
if (y2 < y1)
@@ -946,10 +946,10 @@ void lcd_remote_drawrect(int x, int y, int width, int height)
void lcd_remote_fillrect(int x, int y, int width, int height)
{
int ny;
- unsigned char *dst, *dst_end;
+ fb_remote_data *dst, *dst_end;
unsigned mask, mask_bottom;
unsigned bits = 0;
- lcd_blockfunc_type *bfunc;
+ lcd_remote_blockfunc_type *bfunc;
bool fillopt = false;
/* nothing to draw? */
@@ -1000,7 +1000,7 @@ void lcd_remote_fillrect(int x, int y, int width, int height)
memset(dst, bits, width);
else
{
- unsigned char *dst_row = dst;
+ fb_remote_data *dst_row = dst;
dst_end = dst_row + width;
do
@@ -1043,9 +1043,9 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
int stride, int x, int y, int width, int height)
{
int shift, ny;
- unsigned char *dst, *dst_end;
+ fb_remote_data *dst, *dst_end;
unsigned mask, mask_bottom;
- lcd_blockfunc_type *bfunc;
+ lcd_remote_blockfunc_type *bfunc;
/* nothing to draw? */
if ((width <= 0) || (height <= 0) || (x >= LCD_REMOTE_WIDTH)
@@ -1070,9 +1070,9 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
if (y + height > LCD_REMOTE_HEIGHT)
height = LCD_REMOTE_HEIGHT - y;
- src += stride * (src_y >> 3) + src_x; /* move starting point */
- src_y &= 7;
- y -= src_y;
+ src += stride * (src_y >> 3) + src_x; /* move starting point */
+ src_y &= 7;
+ y -= src_y;
dst = &lcd_remote_framebuffer[y>>3][x];
shift = y & 7;
ny = height - 1 + shift + src_y;
@@ -1092,7 +1092,7 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
else
{
const unsigned char *src_row = src;
- unsigned char *dst_row = dst;
+ fb_remote_data *dst_row = dst;
dst_end = dst_row + width;
do
@@ -1122,7 +1122,7 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
do
{
const unsigned char *src_col = src++;
- unsigned char *dst_col = dst++;
+ fb_remote_data *dst_col = dst++;
unsigned mask_col = mask;
unsigned data = 0;
diff --git a/firmware/drivers/lcd-h100.c b/firmware/drivers/lcd-h100.c
index 3698339..39497cc 100644
--- a/firmware/drivers/lcd-h100.c
+++ b/firmware/drivers/lcd-h100.c
@@ -63,7 +63,7 @@
/*** globals ***/
-unsigned char lcd_framebuffer[LCD_HEIGHT/4][LCD_WIDTH] IBSS_ATTR;
+fb_data lcd_framebuffer[LCD_HEIGHT/4][LCD_WIDTH] IBSS_ATTR;
static const unsigned char dibits[16] ICONST_ATTR = {
0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
@@ -357,21 +357,28 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
static void setpixel(int x, int y)
{
- unsigned char *data = &lcd_framebuffer[y>>2][x];
unsigned mask = pixmask[y & 3];
- *data = (*data & ~mask) | (fg_pattern & mask);
+ fb_data *address = &lcd_framebuffer[y>>2][x];
+ unsigned data = *address;
+
+ *address = data ^ ((data ^ fg_pattern) & mask);
}
static void clearpixel(int x, int y)
{
- unsigned char *data = &lcd_framebuffer[y>>2][x];
unsigned mask = pixmask[y & 3];
- *data = (*data & ~mask) | (bg_pattern & mask);
+ fb_data *address = &lcd_framebuffer[y>>2][x];
+ unsigned data = *address;
+
+ *address = data ^ ((data ^ bg_pattern) & mask);
}
static void flippixel(int x, int y)
{
- lcd_framebuffer[y>>2][x] ^= pixmask[y & 3];
+ unsigned mask = pixmask[y & 3];
+ fb_data *address = &lcd_framebuffer[y>>2][x];
+
+ *address ^= mask;
}
static void nopixel(int x, int y)
@@ -386,34 +393,34 @@ lcd_pixelfunc_type* const lcd_pixelfuncs[8] = {
};
/* 'mask' and 'bits' contain 2 bits per pixel */
-static void flipblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void flipblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipblock(fb_data *address, unsigned mask, unsigned bits)
{
*address ^= bits & mask;
}
-static void bgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bgblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void bgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bgblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ bg_pattern) & mask & ~bits);
}
-static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fgblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fgblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ fg_pattern) & mask & bits);
}
-static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
unsigned bgp = bg_pattern;
@@ -422,34 +429,34 @@ static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
*address = data ^ ((data ^ bits) & mask);
}
-static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipinvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void flipinvblock(fb_data *address, unsigned mask, unsigned bits)
{
*address ^= ~bits & mask;
}
-static void bginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bginvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void bginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void bginvblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ bg_pattern) & mask & bits);
}
-static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fginvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void fginvblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
*address = data ^ ((data ^ fg_pattern) & mask & ~bits);
}
-static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidinvblock(fb_data *address, unsigned mask, unsigned bits)
ICODE_ATTR;
-static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
+static void solidinvblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
unsigned fgp = fg_pattern;
@@ -463,7 +470,7 @@ lcd_blockfunc_type* const lcd_blockfuncs[8] = {
flipinvblock, bginvblock, fginvblock, solidinvblock
};
-static inline void setblock(unsigned char *address, unsigned mask, unsigned bits)
+static inline void setblock(fb_data *address, unsigned mask, unsigned bits)
{
unsigned data = *address;
@@ -564,7 +571,7 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
void lcd_hline(int x1, int x2, int y)
{
int x;
- unsigned char *dst, *dst_end;
+ fb_data *dst, *dst_end;
unsigned mask;
lcd_blockfunc_type *bfunc;
@@ -600,7 +607,7 @@ void lcd_hline(int x1, int x2, int y)
void lcd_vline(int x, int y1, int y2)
{
int ny;
- unsigned char *dst;
+ fb_data *dst;
unsigned mask, mask_bottom;
lcd_blockfunc_type *bfunc;
@@ -657,7 +664,7 @@ void lcd_drawrect(int x, int y, int width, int height)
void lcd_fillrect(int x, int y, int width, int height)
{
int ny;
- unsigned char *dst, *dst_end;
+ fb_data *dst, *dst_end;
unsigned mask, mask_bottom;
unsigned bits = 0;
lcd_blockfunc_type *bfunc;
@@ -712,7 +719,7 @@ void lcd_fillrect(int x, int y, int width, int height)
memset(dst, bits, width);
else
{
- unsigned char *dst_row = dst;
+ fb_data *dst_row = dst;
dst_end = dst_row + width;
do
@@ -755,7 +762,7 @@ void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
int stride, int x, int y, int width, int height)
{
int shift, ny;
- unsigned char *dst, *dst_end;
+ fb_data *dst, *dst_end;
unsigned mask, mask_bottom;
lcd_blockfunc_type *bfunc;
@@ -800,7 +807,7 @@ void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
for (; ny >= 8; ny -= 8)
{
const unsigned char *src_row = src;
- unsigned char *dst_row = dst + LCD_WIDTH;
+ fb_data *dst_row = dst + LCD_WIDTH;
dmask1 = dibits[mask&0x0F];
dmask2 = dibits[(mask>>4)&0x0F];
@@ -863,7 +870,7 @@ void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
do
{
const unsigned char *src_col = src++;
- unsigned char *dst_col = dst++;
+ fb_data *dst_col = dst++;
unsigned mask_col = mask;
unsigned data = 0;
@@ -916,14 +923,14 @@ void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, int heig
* This is the same as the internal lcd hw format. */
/* Draw a partial native bitmap */
-void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
+void lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
int stride, int x, int y, int width, int height)
ICODE_ATTR;
-void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
+void lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
int stride, int x, int y, int width, int height)
{
int shift, ny;
- unsigned char *dst, *dst_end;
+ fb_data *dst, *dst_end;
unsigned mask, mask_bottom;
/* nothing to draw? */
@@ -949,9 +956,9 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
if (y + height > LCD_HEIGHT)
height = LCD_HEIGHT - y;
- src += stride * (src_y >> 2) + src_x; /* move starting point */
- src_y &= 3;
- y -= src_y;
+ src += stride * (src_y >> 2) + src_x; /* move starting point */
+ src_y &= 3;
+ y -= src_y;
dst = &lcd_framebuffer[y>>2][x];
shift = y & 3;
ny = height - 1 + shift + src_y;
@@ -967,15 +974,14 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
memcpy(dst, src, width);
else
{
- const unsigned char *src_row = src;
- unsigned char *dst_row = dst;
+ const fb_data *src_row = src;
+ fb_data *dst_row = dst;
dst_end = dst_row + width;
do
setblock(dst_row++, mask, *src_row++);
while (dst_row < dst_end);
}
-
src += stride;
dst += LCD_WIDTH;
mask = 0xFFu;
@@ -998,8 +1004,8 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
dst_end = dst + width;
do
{
- const unsigned char *src_col = src++;
- unsigned char *dst_col = dst++;
+ const fb_data *src_col = src++;
+ fb_data *dst_col = dst++;
unsigned mask_col = mask;
unsigned data = 0;
@@ -1027,7 +1033,7 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
}
/* Draw a full native bitmap */
-void lcd_bitmap(const unsigned char *src, int x, int y, int width, int height)
+void lcd_bitmap(const fb_data *src, int x, int y, int width, int height)
{
lcd_bitmap_part(src, 0, 0, width, x, y, width, height);
}
@@ -1290,4 +1296,3 @@ static void scroll_thread(void)
sleep(scroll_ticks);
}
}
-
diff --git a/firmware/export/config-h100.h b/firmware/export/config-h100.h
index 4461cc2..6d204c3 100644
--- a/firmware/export/config-h100.h
+++ b/firmware/export/config-h100.h
@@ -31,6 +31,8 @@
#define LCD_REMOTE_HEIGHT 64
#define LCD_REMOTE_DEPTH 1
+#define LCD_REMOTE_PIXELFORMAT VERTICAL_PACKING
+
#define CONFIG_KEYPAD IRIVER_H100_PAD
#define CONFIG_REMOTE_KEYPAD H100_REMOTE
diff --git a/firmware/export/config-h120.h b/firmware/export/config-h120.h
index f2cd8c2..5635a92 100644
--- a/firmware/export/config-h120.h
+++ b/firmware/export/config-h120.h
@@ -27,6 +27,8 @@
#define LCD_REMOTE_HEIGHT 64
#define LCD_REMOTE_DEPTH 1
+#define LCD_REMOTE_PIXELFORMAT VERTICAL_PACKING
+
#define CONFIG_KEYPAD IRIVER_H100_PAD
#define CONFIG_REMOTE_KEYPAD H100_REMOTE
diff --git a/firmware/export/config-h300.h b/firmware/export/config-h300.h
index 30cca21..e98b60c 100644
--- a/firmware/export/config-h300.h
+++ b/firmware/export/config-h300.h
@@ -29,6 +29,8 @@
#define LCD_REMOTE_HEIGHT 64
#define LCD_REMOTE_DEPTH 1
+#define LCD_REMOTE_PIXELFORMAT VERTICAL_PACKING
+
#define CONFIG_KEYPAD IRIVER_H300_PAD
#define CONFIG_REMOTE_KEYPAD H300_REMOTE
diff --git a/firmware/export/lcd-remote.h b/firmware/export/lcd-remote.h
index c27a0d4..031fcdf 100644
--- a/firmware/export/lcd-remote.h
+++ b/firmware/export/lcd-remote.h
@@ -27,9 +27,6 @@
#ifdef HAVE_REMOTE_LCD
-#define STYLE_DEFAULT 0
-#define STYLE_INVERT 1
-
#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
#define REMOTETYPE_H100_LCD 1
#define REMOTETYPE_H300_LCD 2
@@ -37,35 +34,82 @@
extern int remote_type(void);
#endif
+#define STYLE_DEFAULT 0
+#define STYLE_INVERT 1
+
+#if LCD_REMOTE_DEPTH <= 8
+#if (LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED) \
+ || (LCD_REMOTE_PIXELFORMAT == HORIZONTAL_INTERLEAVED)
+typedef unsigned short fb_remote_data;
+#else
+typedef unsigned char fb_remote_data;
+#endif
+#elif LCD_DEPTH <= 16
+typedef unsigned short fb_remote_data;
+#else
+typedef unsigned long fb_remote_data;
+#endif
+
+#ifndef LCD_REMOTE_FBWIDTH
+#define LCD_REMOTE_FBWIDTH LCD_REMOTE_WIDTH
+#endif
+
+/* Low-level drawing function types */
+typedef void lcd_remote_pixelfunc_type(int x, int y);
+typedef void lcd_remote_blockfunc_type(fb_remote_data *address, unsigned mask,
+ unsigned bits);
+
+#if LCD_REMOTE_DEPTH > 1 /* greyscale */
+#define LCD_REMOTE_MAX_LEVEL ((1 << LCD_REMOTE_DEPTH) - 1)
+#define LCD_REMOTE_BRIGHTNESS(y) (((y) * LCD_REMOTE_MAX_LEVEL + 127) / 255)
+
+#define LCD_REMOTE_BLACK LCD_REMOTE_BRIGHTNESS(0)
+#define LCD_REMOTE_DARKGRAY LCD_REMOTE_BRIGHTNESS(85)
+#define LCD_REMOTE_LIGHTGRAY LCD_REMOTE_BRIGHTNESS(170)
+#define LCD_REMOTE_WHITE LCD_REMOTE_BRIGHTNESS(255)
+#define LCD_REMOTE_DEFAULT_FG LCD_REMOTE_BLACK
+#define LCD_REMOTE_DEFAULT_BG LCD_REMOTE_WHITE
+
+#endif
+
+/* Memory copy of display bitmap */
+#if LCD_REMOTE_DEPTH == 1
+extern fb_remote_data lcd_remote_framebuffer[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH];
+#elif LCD_REMOTE_DEPTH == 2
+#if LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED
+extern fb_remote_data lcd_remote_framebuffer[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH];
+#endif
+#endif
+
extern void lcd_remote_init(void);
extern int lcd_remote_default_contrast(void);
extern void lcd_remote_set_contrast(int val);
extern void lcd_remote_emireduce(bool state);
extern void lcd_remote_clear_display(void);
-extern void lcd_remote_puts(int x, int y, const unsigned char *string);
-extern void lcd_remote_puts_style(int x, int y, const unsigned char *string,
+extern void lcd_remote_puts(int x, int y, const unsigned char *str);
+extern void lcd_remote_puts_style(int x, int y, const unsigned char *str,
int style);
-extern void lcd_remote_puts_offset(int x, int y, const unsigned char *str, int offset);
-extern void lcd_remote_puts_style_offset(int x, int y, const unsigned char *str, int style, int offset);
+extern void lcd_remote_puts_offset(int x, int y, const unsigned char *str,
+ int offset);
+extern void lcd_remote_puts_style_offset(int x, int y, const unsigned char *str,
+ int style, int offset);
extern void lcd_remote_putc(int x, int y, unsigned short ch);
extern void lcd_remote_stop_scroll(void);
extern void lcd_remote_scroll_speed(int speed);
extern void lcd_remote_scroll_delay(int ms);
-extern void lcd_remote_puts_scroll(int x, int y, const unsigned char* string);
-extern void lcd_remote_puts_scroll_style(int x, int y,const unsigned char* string,
- int style);
-extern void lcd_remote_puts_scroll_offset(int x, int y, const unsigned char *string,
- int offset);
-extern void lcd_remote_puts_scroll_style_offset(int x, int y, const unsigned char *string,
+extern void lcd_remote_puts_scroll(int x, int y, const unsigned char *str);
+extern void lcd_remote_puts_scroll_style(int x, int y, const unsigned char *str,
+ int style);
+extern void lcd_remote_puts_scroll_offset(int x, int y,
+ const unsigned char *str, int offset);
+extern void lcd_remote_puts_scroll_style_offset(int x, int y,
+ const unsigned char *string,
int style, int offset);
extern void lcd_remote_update(void);
extern void lcd_remote_update_rect(int x, int y, int width, int height);
-/* Memory copy of display bitmap */
-extern unsigned char lcd_remote_framebuffer[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH];
-
extern void lcd_remote_set_invert_display(bool yesno);
extern void lcd_remote_set_flip(bool yesno);
extern void lcd_remote_roll(int pixels);
@@ -78,25 +122,50 @@ extern int lcd_remote_getymargin(void);
extern void lcd_remote_setfont(int font);
extern int lcd_remote_getstringsize(const unsigned char *str, int *w, int *h);
+/* low level drawing function pointer arrays */
+extern lcd_remote_pixelfunc_type* const lcd_remote_pixelfuncs[8];
+extern lcd_remote_blockfunc_type* const lcd_remote_blockfuncs[8];
+
extern void lcd_remote_drawpixel(int x, int y);
extern void lcd_remote_drawline(int x1, int y1, int x2, int y2);
extern void lcd_remote_hline(int x1, int x2, int y);
extern void lcd_remote_vline(int x, int y1, int y2);
extern void lcd_remote_drawrect(int x, int y, int width, int height);
extern void lcd_remote_fillrect(int x, int y, int width, int height);
-extern void lcd_remote_bitmap_part(const unsigned char *src, int src_x,
+extern void lcd_remote_bitmap_part(const fb_remote_data *src, int src_x,
int src_y, int stride, int x, int y,
int width, int height);
-extern void lcd_remote_bitmap(const unsigned char *src, int x, int y,
+extern void lcd_remote_bitmap(const fb_remote_data *src, int x, int y,
int width, int height);
-extern void lcd_remote_putsxy(int x, int y, const unsigned char *string);
+extern void lcd_remote_putsxy(int x, int y, const unsigned char *str);
extern void lcd_remote_invertscroll(int x, int y);
extern void lcd_remote_bidir_scroll(int threshold);
extern void lcd_remote_scroll_step(int pixels);
+#if LCD_REMOTE_DEPTH > 1
+extern void lcd_remote_set_foreground(unsigned foreground);
+extern unsigned lcd_remote_get_foreground(void);
+extern void lcd_remote_set_background(unsigned background);
+extern unsigned lcd_remote_get_background(void);
+extern void lcd_remote_set_drawinfo(int mode, unsigned foreground,
+ unsigned background);
+
+extern void lcd_remote_mono_bitmap_part(const unsigned char *src, int src_x,
+ int src_y, int stride, int x, int y,
+ int width, int height);
+extern void lcd_remote_mono_bitmap(const unsigned char *src, int x, int y,
+ int width, int height);
+extern void lcd_remote_bitmap_transparent_part(const fb_remote_data *src,
+ int src_x, int src_y,
+ int stride, int x, int y,
+ int width, int height);
+extern void lcd_bitmap_remote_transparent(const fb_remote_data *src, int x,
+ int y, int width, int height);
+#else /* LCD_REMOTE_DEPTH == 1 */
#define lcd_remote_mono_bitmap lcd_remote_bitmap
#define lcd_remote_mono_bitmap_part lcd_remote_bitmap_part
+#endif /* LCD_REMOTE_DEPTH */
#endif
-#endif
+#endif /* __LCD_REMOTE_H__ */
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index 89bf353..38561a7 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -138,7 +138,7 @@ extern void lcd_jump_scroll_delay(int ms);
/* Low-level drawing function types */
typedef void lcd_pixelfunc_type(int x, int y);
-typedef void lcd_blockfunc_type(unsigned char *address, unsigned mask, unsigned bits);
+typedef void lcd_blockfunc_type(fb_data *address, unsigned mask, unsigned bits);
#if LCD_DEPTH >= 8
typedef void lcd_fastpixelfunc_type(fb_data *address);
#endif