Am 14.10.2011 10:29, schrieb Peter Korsgaard: > Fake truecolor support using a RGB:332 palette. > > function old new delta > fb_setpal - 212 +212 > fbsplash_main 1136 1184 +48 > fb_pixel_value 52 84 +32 > fb_write_pixel 60 68 +8 > ------------------------------------------------------------------------------ > (add/remove: 1/0 grow/shrink: 3/0 up/down: 300/0) Total: 300 bytes > > Signed-off-by: Peter Korsgaard <[email protected]> > --- > miscutils/fbsplash.c | 52 > +++++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 51 insertions(+), 1 deletions(-) > > diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c > index 937c6a4..d9077c5 100644 > --- a/miscutils/fbsplash.c > +++ b/miscutils/fbsplash.c > @@ -74,6 +74,33 @@ struct globals { > #define DEBUG_MESSAGE(...) ((void)0) > #endif > > +/** > + * Configure palette for RGB:332 > + */ > +static void fb_setpal(int fd) > +{ > + struct fb_cmap cmap; > + /* fb colors are 16 bit */ > + unsigned short red[256], green[256], blue[256]; > + int i; > + > + /* RGB:332 */ > + for (i = 0; i < 256; i++) > + { > + red[i] = ((i & 0xe0) << 8) + ((i & 0x20) ? 0x1fff : 0); > + green[i] = ((i & 0x1c) << 11) + ((i & 0x04) ? 0x1fff : 0); > + blue[i] = ((i & 0x03) << 14) + ((i & 0x01) ? 0x3fff : 0); > + } > + > + cmap.start = 0; > + cmap.len = 256; > + cmap.red = red; > + cmap.green = green; > + cmap.blue = blue; > + cmap.transp = 0; > + > + xioctl(fd, FBIOPUTCMAP, &cmap); > +} > > /** > * Open and initialize the framebuffer device > @@ -87,8 +114,21 @@ static void fb_open(const char *strfb_device) > xioctl(fbfd, FBIOGET_VSCREENINFO, &G.scr_var); > xioctl(fbfd, FBIOGET_FSCREENINFO, &G.scr_fix); > > - if (G.scr_var.bits_per_pixel < 16 || G.scr_var.bits_per_pixel > 32) > + switch (G.scr_var.bits_per_pixel) { > + case 8: > + fb_setpal(fbfd); > + break; > + > + case 16: > + case 24: > + case 32: > + break; > + > + default: > bb_error_msg_and_die("unsupported %u bpp", > (int)G.scr_var.bits_per_pixel); > + break; > + } > + > G.bytes_per_pixel = (G.scr_var.bits_per_pixel + 7) >> 3; > > // map the device in memory > @@ -109,6 +149,13 @@ static void fb_open(const char *strfb_device) > */ > static unsigned fb_pixel_value(unsigned r, unsigned g, unsigned b) > { > + if (G.bytes_per_pixel == 1) { > + r >>= 5; // 3-bit red > + g >>= 5; // 3-bit green > + b >>= 6; // 2-bit blue > + return b + (g << 2) + (r << (2+3)); > + } > + > if (G.bytes_per_pixel == 2) { > r >>= 3; // 5-bit red > g >>= 2; // 6-bit green > @@ -125,6 +172,9 @@ static unsigned fb_pixel_value(unsigned r, unsigned g, > unsigned b) > static void fb_write_pixel(unsigned char *addr, unsigned pixel) > { > switch (G.bytes_per_pixel) { > + case 1: > + *addr = pixel; > + break; > case 2: > *(uint16_t *)addr = pixel; > break;
this looks confusing, would you mind to add a few words why this cases are so different ? i am not an expert on fb-devices, sorry. re, wh _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
