blob: 8f185f0a37a61a80871f1cd38334e4bc1d1fde2f [file] [log] [blame]
[PATCH] fbv: support bgr555 format
Signed-off-by: Josh.Wu <josh.wu@atmel.com>
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: