xref: /OK3568_Linux_fs/buildroot/package/fbv/0004-fix-bgr555.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun[PATCH] fbv: support bgr555 format
2*4882a593Smuzhiyun
3*4882a593SmuzhiyunSigned-off-by: Josh.Wu <josh.wu@atmel.com>
4*4882a593Smuzhiyundiff -Naur fbv-1.0b-ori/fb_display.c fbv-1.0b/fb_display.c
5*4882a593Smuzhiyun--- fbv-1.0b-ori/fb_display.c	2010-04-02 09:38:15.000000000 +0800
6*4882a593Smuzhiyun+++ fbv-1.0b/fb_display.c	2010-04-01 18:54:15.000000000 +0800
7*4882a593Smuzhiyun@@ -297,6 +297,14 @@
8*4882a593Smuzhiyun 	 ((b >> 3) & 31)        );
9*4882a593Smuzhiyun }
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun+inline static unsigned short make15color_bgr(unsigned char r, unsigned char g, unsigned char b)
12*4882a593Smuzhiyun+{
13*4882a593Smuzhiyun+    return (
14*4882a593Smuzhiyun+	(((b >> 3) & 31) << 10) |
15*4882a593Smuzhiyun+	(((g >> 3) & 31) << 5)  |
16*4882a593Smuzhiyun+	 ((r >> 3) & 31)        );
17*4882a593Smuzhiyun+}
18*4882a593Smuzhiyun+
19*4882a593Smuzhiyun inline static unsigned short make16color(unsigned char r, unsigned char g, unsigned char b)
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun     return (
22*4882a593Smuzhiyun@@ -313,6 +321,14 @@
23*4882a593Smuzhiyun     u_int16_t *s_fbbuff;
24*4882a593Smuzhiyun     u_int32_t *i_fbbuff;
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun+    int is_bgr555 = 0;
27*4882a593Smuzhiyun+    struct fb_var_screeninfo var;
28*4882a593Smuzhiyun+    getVarScreenInfo(fh, &var);
29*4882a593Smuzhiyun+    if(var.red.offset == 0 &&
30*4882a593Smuzhiyun+       var.green.offset == 5 &&
31*4882a593Smuzhiyun+       var.blue.offset == 10)
32*4882a593Smuzhiyun+	is_bgr555 = 1;
33*4882a593Smuzhiyun+
34*4882a593Smuzhiyun     switch(bpp)
35*4882a593Smuzhiyun     {
36*4882a593Smuzhiyun 	case 8:
37*4882a593Smuzhiyun@@ -325,15 +341,23 @@
38*4882a593Smuzhiyun 	case 15:
39*4882a593Smuzhiyun 	    *cpp = 2;
40*4882a593Smuzhiyun 	    s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short));
41*4882a593Smuzhiyun-	    for(i = 0; i < count ; i++)
42*4882a593Smuzhiyun-		s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
43*4882a593Smuzhiyun+	    if(is_bgr555)
44*4882a593Smuzhiyun+	    	for(i = 0; i < count ; i++)
45*4882a593Smuzhiyun+		    s_fbbuff[i] = make15color_bgr(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
46*4882a593Smuzhiyun+	    else
47*4882a593Smuzhiyun+	    	for(i = 0; i < count ; i++)
48*4882a593Smuzhiyun+		    s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
49*4882a593Smuzhiyun 	    fbbuff = (void *) s_fbbuff;
50*4882a593Smuzhiyun 	    break;
51*4882a593Smuzhiyun 	case 16:
52*4882a593Smuzhiyun 	    *cpp = 2;
53*4882a593Smuzhiyun 	    s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short));
54*4882a593Smuzhiyun-	    for(i = 0; i < count ; i++)
55*4882a593Smuzhiyun-		s_fbbuff[i] = make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
56*4882a593Smuzhiyun+	    if(is_bgr555)
57*4882a593Smuzhiyun+	    	for(i = 0; i < count ; i++)
58*4882a593Smuzhiyun+		    s_fbbuff[i] = make15color_bgr(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
59*4882a593Smuzhiyun+	    else
60*4882a593Smuzhiyun+	    	for(i = 0; i < count ; i++)
61*4882a593Smuzhiyun+		    s_fbbuff[i] = make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
62*4882a593Smuzhiyun 	    fbbuff = (void *) s_fbbuff;
63*4882a593Smuzhiyun 	    break;
64*4882a593Smuzhiyun 	case 24:
65