[PATCH] fbv: support bgr555 format Signed-off-by: Josh.Wu diff -Naur fbv-1.0b-ori/fb_display.c fbv-1.0b/fb_display.c --- fbv-1.0b-ori/fb_display.c 2010-04-02 09:38:15.000000000 +0800 +++ fbv-1.0b/fb_display.c 2010-04-01 18:54:15.000000000 +0800 @@ -297,6 +297,14 @@ ((b >> 3) & 31) ); } +inline static unsigned short make15color_bgr(unsigned char r, unsigned char g, unsigned char b) +{ + return ( + (((b >> 3) & 31) << 10) | + (((g >> 3) & 31) << 5) | + ((r >> 3) & 31) ); +} + inline static unsigned short make16color(unsigned char r, unsigned char g, unsigned char b) { return ( @@ -313,6 +321,14 @@ u_int16_t *s_fbbuff; u_int32_t *i_fbbuff; + int is_bgr555 = 0; + struct fb_var_screeninfo var; + getVarScreenInfo(fh, &var); + if(var.red.offset == 0 && + var.green.offset == 5 && + var.blue.offset == 10) + is_bgr555 = 1; + switch(bpp) { case 8: @@ -325,15 +341,23 @@ case 15: *cpp = 2; s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short)); - for(i = 0; i < count ; i++) - s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + if(is_bgr555) + for(i = 0; i < count ; i++) + s_fbbuff[i] = make15color_bgr(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + else + for(i = 0; i < count ; i++) + s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); fbbuff = (void *) s_fbbuff; break; case 16: *cpp = 2; s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short)); - for(i = 0; i < count ; i++) - s_fbbuff[i] = make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + if(is_bgr555) + for(i = 0; i < count ; i++) + s_fbbuff[i] = make15color_bgr(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + else + for(i = 0; i < count ; i++) + s_fbbuff[i] = make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); fbbuff = (void *) s_fbbuff; break; case 24: