summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Walleij <triad@df.lth.se>2012-09-06 14:52:31 (GMT)
committer Denys Vlasenko <vda.linux@googlemail.com>2012-09-06 14:52:31 (GMT)
commit6d463de46b418e6c4c8d1397033608f78b33ab21 (patch)
treef0d0583e55347f16c894b5308ef27b717f541e17
parent2dc1a9727288dd732af47e2618a791be9214dfe4 (diff)
downloadbusybox-6d463de46b418e6c4c8d1397033608f78b33ab21.tar.gz
busybox-6d463de46b418e6c4c8d1397033608f78b33ab21.tar.bz2
fbsplash: support non-RGB565 pixels in 16-bit mode
function old new delta fbsplash_main 953 989 +36 fb_pixel_value 80 110 +30 Signed-off-by: Linus Walleij <triad@df.lth.se> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/fbsplash.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 988439b..37ca665 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -50,6 +50,10 @@ struct globals {
struct fb_var_screeninfo scr_var;
struct fb_fix_screeninfo scr_fix;
unsigned bytes_per_pixel;
+ // cached (8 - scr_var.COLOR.length):
+ unsigned red_shift;
+ unsigned green_shift;
+ unsigned blue_shift;
};
#define G (*ptr_to_globals)
#define INIT_G() do { \
@@ -139,6 +143,9 @@ static void fb_open(const char *strfb_device)
break;
}
+ G.red_shift = 8 - G.scr_var.red.length;
+ G.green_shift = 8 - G.scr_var.green.length;
+ G.blue_shift = 8 - G.scr_var.blue.length;
G.bytes_per_pixel = (G.scr_var.bits_per_pixel + 7) >> 3;
// map the device in memory
@@ -155,10 +162,13 @@ static void fb_open(const char *strfb_device)
/**
- * Return pixel value of the passed RGB color
+ * Return pixel value of the passed RGB color.
+ * This is performance critical fn.
*/
static unsigned fb_pixel_value(unsigned r, unsigned g, unsigned b)
{
+ /* We assume that the r,g,b values are <= 255 */
+
if (G.bytes_per_pixel == 1) {
r = r & 0xe0; // 3-bit red
g = (g >> 3) & 0x1c; // 3-bit green
@@ -166,10 +176,17 @@ static unsigned fb_pixel_value(unsigned r, unsigned g, unsigned b)
return r + g + b;
}
if (G.bytes_per_pixel == 2) {
- r = (r & 0xf8) << 8; // 5-bit red
- g = (g & 0xfc) << 3; // 6-bit green
- b = b >> 3; // 5-bit blue
- return r + g + b;
+ // ARM PL110 on Integrator/CP has RGBA5551 bit arrangement.
+ // We want to support bit locations like that.
+ //
+ // First shift out unused bits
+ r = r >> G.red_shift;
+ g = g >> G.green_shift;
+ b = b >> G.blue_shift;
+ // Then shift the remaining bits to their offset
+ return (r << G.scr_var.red.offset) +
+ (g << G.scr_var.green.offset) +
+ (b << G.scr_var.blue.offset);
}
// RGB 888
return b + (g << 8) + (r << 16);