Marco Cavallini [KOAN] wrote:
> 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

Gratias ago!

You're almost there outside of the software rendering code :)


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


=======> Correct.


+     /* 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" } \
  };


=======> File is generated automatically :)


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


=======> Correct, but shouldn't be separate.


+          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


=======> Shouldn't this be different from RGB24?

Anyhow, I think we can do a direct_memcpy() here :)


+                    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) {


Wait, looking at the RGB24 case, should this be endianness dependent?

                case DSPF_RGB24:
                     for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) {
#ifdef WORDS_BIGENDIAN
                          buf_p[n3+0] = data8[n3+0];
                          buf_p[n3+1] = data8[n3+1];
                          buf_p[n3+2] = data8[n3+2];
#else
                          buf_p[n3+0] = data8[n3+2];
                          buf_p[n3+1] = data8[n3+1];
                          buf_p[n3+2] = data8[n3+0];
#endif
                     }
                     break;


RGB24 is weird. Does anybody know which is the real standard byte order and 
endianness dependency?


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;
+


=======> RGB24/BGR24 depending on architecture or endianness?


            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 );


=======> Same comment as for dfb_surface_buffer_dump().


+               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);


=======> dito


+               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";

=======> We should make the function use an array and pixel format indices, but 
that's a different story :)


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    },


=======> Most common mistake, this needs to stay sorted!


       { "RGB32",    DSPF_RGB32    },
       { "RGB332",   DSPF_RGB332   },
       { "RGB444",   DSPF_RGB444   },
       { "RGB555",   DSPF_RGB555   },
       { "UYVY",     DSPF_UYVY     },
       { "YUY2",     DSPF_YUY2     },
-     { "YV12",     DSPF_YV12     },
+     { "YV12",     DSPF_YV12     }
  };


=======> One more perfectionist :-)


  #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") ;
+
+


=======> Looks like you had problems due to the unsorted array :)


       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;
+


=======> If image loading works, this is fine.


            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)


=======> What does fbset -i tell you?


+                       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

=======> Looks good.

+                    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;


=======> Same as for RGB24?


+               }
                 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;


=======> dito


+               }
                 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;

=======> Any packed 24 bit expert out there?

+
                                     case DSPF_RGB16:
                                          pixel = *(u16*)(data + 2 * wx +
                                                          pitch * wy);





=======> src/gfx/generic/generic.c  :-)


-- 
Best regards,
   Denis Oliver Kropp

.------------------------------------------.
| DirectFB - Hardware accelerated graphics |
| http://www.directfb.org/                 |
"------------------------------------------"

_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to