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>
This commit is contained in:
parent
2dc1a97272
commit
6d463de46b
@ -50,6 +50,10 @@ struct globals {
|
|||||||
struct fb_var_screeninfo scr_var;
|
struct fb_var_screeninfo scr_var;
|
||||||
struct fb_fix_screeninfo scr_fix;
|
struct fb_fix_screeninfo scr_fix;
|
||||||
unsigned bytes_per_pixel;
|
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 G (*ptr_to_globals)
|
||||||
#define INIT_G() do { \
|
#define INIT_G() do { \
|
||||||
@ -139,6 +143,9 @@ static void fb_open(const char *strfb_device)
|
|||||||
break;
|
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;
|
G.bytes_per_pixel = (G.scr_var.bits_per_pixel + 7) >> 3;
|
||||||
|
|
||||||
// map the device in memory
|
// 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)
|
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) {
|
if (G.bytes_per_pixel == 1) {
|
||||||
r = r & 0xe0; // 3-bit red
|
r = r & 0xe0; // 3-bit red
|
||||||
g = (g >> 3) & 0x1c; // 3-bit green
|
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;
|
return r + g + b;
|
||||||
}
|
}
|
||||||
if (G.bytes_per_pixel == 2) {
|
if (G.bytes_per_pixel == 2) {
|
||||||
r = (r & 0xf8) << 8; // 5-bit red
|
// ARM PL110 on Integrator/CP has RGBA5551 bit arrangement.
|
||||||
g = (g & 0xfc) << 3; // 6-bit green
|
// We want to support bit locations like that.
|
||||||
b = b >> 3; // 5-bit blue
|
//
|
||||||
return r + g + b;
|
// 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
|
// RGB 888
|
||||||
return b + (g << 8) + (r << 16);
|
return b + (g << 8) + (r << 16);
|
||||||
|
Loading…
Reference in New Issue
Block a user