Attached my temporary DirectFB-1.1.1 patch for BGR24 color support for board based on AT91SAM9263 cpu

Work is in progress and and I'm still facing to some errors so any comment or help would be greatly appreciated.
TIA


Cordiali Saluti / Kindest Regards / mit freundlichen Grüssen
--
Marco Cavallini | KOAN sas | Bergamo - Italia
 embedded and real-time software engineering
Phone:+39-035-255.235 - Fax:+39-178-22.39.748
      http://www.KoanSoftware.com
 Meet us @ Embedded World 2008 - Nurenberg
  February 26-28, 2008      Hall 11 - 224
diff -urNp DirectFB-1.1.1-orig/include/directfb.h DirectFB-1.1.1-bgr24/include/directfb.h
--- DirectFB-1.1.1-orig/include/directfb.h	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/include/directfb.h	2008-02-08 14:40:51.000000000 +0100
@@ -1121,12 +1121,17 @@ typedef enum {
      DSPF_RGB444    = DFB_SURFACE_PIXELFORMAT( 26, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0 ),
 
      /* 16 bit   RGB (2 byte, nothing @15, red [EMAIL PROTECTED], green [EMAIL PROTECTED], blue [EMAIL PROTECTED]) */
-     DSPF_RGB555    = DFB_SURFACE_PIXELFORMAT( 27, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 )
+     DSPF_RGB555    = DFB_SURFACE_PIXELFORMAT( 27, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 ),
+
+	// TODO : verify
+     /* 24 bit   BGR (3 byte, blue [EMAIL PROTECTED], green [EMAIL PROTECTED], red [EMAIL PROTECTED]) */
+     DSPF_BGR24     = DFB_SURFACE_PIXELFORMAT( 28, 24, 0, 0, 0, 3, 0, 0, 0, 0, 0 )
+
 
 } DFBSurfacePixelFormat;
 
 /* Number of pixelformats defined */
-#define DFB_NUM_PIXELFORMATS            28
+#define DFB_NUM_PIXELFORMATS            29 	// was 28
 
 /* These macros extract information about the pixel format. */
 #define DFB_PIXELFORMAT_INDEX(fmt)      (((fmt) & 0x0000007F)      )
diff -urNp DirectFB-1.1.1-orig/include/directfb_strings.h DirectFB-1.1.1-bgr24/include/directfb_strings.h
--- DirectFB-1.1.1-orig/include/directfb_strings.h	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/include/directfb_strings.h	2008-02-08 11:35:30.000000000 +0100
@@ -33,6 +33,7 @@
      { DSPF_LUT2, "LUT2" }, \
      { DSPF_RGB444, "RGB444" }, \
      { DSPF_RGB555, "RGB555" }, \
+     { DSPF_BGR24, "BGR24" }, \
      { DSPF_UNKNOWN, "UNKNOWN" } \
 };
 
diff -urNp DirectFB-1.1.1-orig/src/core/surface_buffer.c DirectFB-1.1.1-bgr24/src/core/surface_buffer.c
--- DirectFB-1.1.1-orig/src/core/surface_buffer.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/core/surface_buffer.c	2008-02-08 11:35:30.000000000 +0100
@@ -628,6 +628,11 @@ dfb_surface_buffer_dump( CoreSurfaceBuff
                rgb   = true;
                break;
 
+		// TODO : verify
+          case DSPF_BGR24:
+               rgb   = true;
+               break;
+
           default:
                D_ERROR( "DirectFB/core/surfaces: surface dump for format "
                          "'%s' is not implemented!\n",
@@ -875,6 +880,12 @@ dfb_surface_buffer_dump( CoreSurfaceBuff
                          buf_p[n3+2] = data8[n3+0];
 #endif
                     }
+               case DSPF_BGR24:	// TODO : verify
+                    for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) {
+                         buf_p[n3+0] = data8[n3+2];
+                         buf_p[n3+1] = data8[n3+1];
+                         buf_p[n3+2] = data8[n3+0];
+                    }
                     break;
                case DSPF_RGB32:
                     for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) {
diff -urNp DirectFB-1.1.1-orig/src/gfx/convert.c DirectFB-1.1.1-bgr24/src/gfx/convert.c
--- DirectFB-1.1.1-orig/src/gfx/convert.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/gfx/convert.c	2008-02-08 11:35:30.000000000 +0100
@@ -65,6 +65,9 @@ dfb_pixelformat_for_depth( int depth )
                return DSPF_RGB18;
           case 24:
                return DSPF_RGB24;
+
+// TODO add DSPF_BGR24;
+
           case 32:
                return DSPF_RGB32;
      }
@@ -106,6 +109,9 @@ dfb_color_to_pixel( DFBSurfacePixelForma
           case DSPF_ARGB6666:
                pixel = PIXEL_RGB18( r, g, b );
                break;
+          case DSPF_BGR24: // TODO : complete this
+               pixel = PIXEL_RGB32( r, g, b );
+               break;
           case DSPF_RGB24:
           case DSPF_RGB32:
           case DSPF_ARGB:
@@ -188,6 +194,12 @@ dfb_pixel_to_color( DFBSurfacePixelForma
                ret_color->b = (pixel & 0x0000ff);
                break;
 
+          case DSPF_BGR24:	// TODO : complete this
+               ret_color->r = (pixel & 0xff0000) >> 16;
+               ret_color->g = (pixel & 0x00ff00) >>  8;
+               ret_color->b = (pixel & 0x0000ff);
+               break;
+
           case DSPF_AiRGB:
                ret_color->a = (pixel >> 24) ^ 0xff;
                ret_color->r = (pixel & 0xff0000) >> 16;
@@ -224,6 +236,9 @@ dfb_pixelformat_name( DFBSurfacePixelFor
           case DSPF_RGB24:
                return "RGB24";
 
+          case DSPF_BGR24:
+               return "BGR24";
+
           case DSPF_RGB32:
                return "RGB32";
 
diff -urNp DirectFB-1.1.1-orig/src/idirectfb.c DirectFB-1.1.1-bgr24/src/idirectfb.c
--- DirectFB-1.1.1-orig/src/idirectfb.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/idirectfb.c	2008-02-08 11:35:30.000000000 +0100
@@ -493,6 +493,7 @@ IDirectFB_CreateSurface( IDirectFB      
           case DSPF_RGB16:
           case DSPF_RGB18:
           case DSPF_RGB24:
+          case DSPF_BGR24:
           case DSPF_RGB32:
           case DSPF_RGB332:
           case DSPF_UYVY:
diff -urNp DirectFB-1.1.1-orig/src/misc/conf.c DirectFB-1.1.1-bgr24/src/misc/conf.c
--- DirectFB-1.1.1-orig/src/misc/conf.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/misc/conf.c	2008-02-09 18:02:30.000000000 +0100
@@ -200,13 +200,14 @@ static const FormatString format_strings
      { "RGB16",    DSPF_RGB16    },
      { "RGB18",    DSPF_RGB18    },
      { "RGB24",    DSPF_RGB24    },
+     { "BGR24",    DSPF_BGR24    },
      { "RGB32",    DSPF_RGB32    },
      { "RGB332",   DSPF_RGB332   },
      { "RGB444",   DSPF_RGB444   },
      { "RGB555",   DSPF_RGB555   },
      { "UYVY",     DSPF_UYVY     },
      { "YUY2",     DSPF_YUY2     },
-     { "YV12",     DSPF_YV12     },
+     { "YV12",     DSPF_YV12     }
 };
 
 #define NUM_FORMAT_STRINGS D_ARRAY_SIZE(format_strings)
@@ -247,6 +248,10 @@ dfb_config_parse_pixelformat( const char
      format_string = bsearch( format, format_strings,
                               NUM_FORMAT_STRINGS, sizeof(FormatString),
                               format_string_compare );
+
+printf("Parsing |%s| = %d\n", format, format_string ? "OK" : "Fail") ;
+
+
      if (!format_string)
           return DSPF_UNKNOWN;
 
diff -urNp DirectFB-1.1.1-orig/src/misc/gfx_util.c DirectFB-1.1.1-bgr24/src/misc/gfx_util.c
--- DirectFB-1.1.1-orig/src/misc/gfx_util.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/misc/gfx_util.c	2008-02-08 11:35:30.000000000 +0100
@@ -190,6 +190,14 @@ static void write_argb_span (u32 *src, u
                }
                break;
 
+          case DSPF_BGR24:	// TODO: verify
+               for (i = 0; i < len; i++) {
+                    *d++ = src[i];
+                    *d++ = src[i] >> 8;
+                    *d++ = src[i] >> 16;
+               }
+               break;
+
           case DSPF_RGB32:
           case DSPF_ARGB:
                direct_memcpy( d, src, len*4 );              
diff -urNp DirectFB-1.1.1-orig/systems/fbdev/fbdev.c DirectFB-1.1.1-bgr24/systems/fbdev/fbdev.c
--- DirectFB-1.1.1-orig/systems/fbdev/fbdev.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/systems/fbdev/fbdev.c	2008-02-09 11:49:32.000000000 +0100
@@ -1505,9 +1505,11 @@ static DFBSurfacePixelFormat dfb_fbdev_g
                break;
 
           case 24:
-               if (dfb_fbdev_compatible_format( var, 0, 8, 8, 8, 0, 16, 8, 0 ))
+	       if (dfb_fbdev_compatible_format( var, 0, 8, 8, 8, 0, 16, 8, 0 ))
                     return DSPF_RGB24;
-
+		if (dfb_fbdev_compatible_format( var, 0, 8, 8, 8, 8, 16, 0, 0 )) // BGR24 (MCK)
+			printf("(MCK)  modified DSPF_RGB24 / DSPF_BGR24\n") ;
+                    return DSPF_BGR24;
                break;
 
           case 32:
@@ -1749,6 +1751,16 @@ dfb_fbdev_set_mode( CoreSurface         
                case DSPF_RGB332:
                     break;
 
+               case DSPF_BGR24:
+			// TODO : verify colors here
+                    var.red.length    = 8;
+                    var.green.length  = 8;
+                    var.blue.length   = 8;
+                    var.red.offset    = 0;
+                    var.green.offset  = 8;
+                    var.blue.offset   = 16;
+                    break;
+
                case DSPF_ARGB1666:
                     var.transp.length = 1;
                     var.red.length    = 6;
@@ -2078,6 +2090,7 @@ static DFBResult dfb_fbdev_set_gamma_ram
                blue_size  = 32;
                break;
           case DSPF_RGB24:
+          case DSPF_BGR24:
           case DSPF_RGB32:
           case DSPF_ARGB:
                red_size   = 256;
diff -urNp DirectFB-1.1.1-orig/tools/directfb-csource.c DirectFB-1.1.1-bgr24/tools/directfb-csource.c
--- DirectFB-1.1.1-orig/tools/directfb-csource.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/tools/directfb-csource.c	2008-02-08 14:49:03.000000000 +0100
@@ -63,7 +63,8 @@ static struct {
      { DSPF_RGB16,    "RGB16"    },
      { DSPF_RGB332,   "RGB332"   },
      { DSPF_A8,       "A8"       },
-     { DSPF_LUT8,     "LUT8"     }
+     { DSPF_LUT8,     "LUT8"     },
+     { DSPF_BGR24,    "BGR24"    }
 };
 static int n_pixelformats = D_ARRAY_SIZE( pixelformats );
 
@@ -362,6 +363,10 @@ static DFBResult load_image (const char 
                     png_set_strip_alpha (png_ptr);
                     src_format = DSPF_RGB24;
                }
+               else if (dest_format == DSPF_BGR24) { // TODO : verify and complete
+                    png_set_strip_alpha (png_ptr);
+                    src_format = DSPF_BGR24;
+               }
                break;
        }
 
diff -urNp DirectFB-1.1.1-orig/tools/mkdfiff.c DirectFB-1.1.1-bgr24/tools/mkdfiff.c
--- DirectFB-1.1.1-orig/tools/mkdfiff.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/tools/mkdfiff.c	2008-02-08 11:35:30.000000000 +0100
@@ -156,6 +156,10 @@ load_image (const char            *filen
                     png_set_strip_alpha (png_ptr);
                     src_format = DSPF_RGB24;
                }
+               else if (dest_format == DSPF_BGR24) { // TODO : verify and complete
+                    png_set_strip_alpha (png_ptr);
+                    src_format = DSPF_BGR24;
+               }
                break;
        }
 
diff -urNp DirectFB-1.1.1-orig/wm/default/default.c DirectFB-1.1.1-bgr24/wm/default/default.c
--- DirectFB-1.1.1-orig/wm/default/default.c	2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/wm/default/default.c	2008-02-08 11:35:30.000000000 +0100
@@ -494,6 +494,11 @@ window_at_pointer( CoreWindowStack *stac
 #endif
                                         break;
 
+                                   case DSPF_BGR24:	// TODO: complete
+                                        p = (data + 3 * wx + pitch * wy);
+                                        pixel = (p[2] << 16) | (p[1] << 8) | p[0];
+                                        break;
+
                                    case DSPF_RGB16:
                                         pixel = *(u16*)(data + 2 * wx +
                                                         pitch * wy);
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to