Hi,
  My code is not working, it always crashes at the SetColorIndex giving the
following message

(#) DirectFBError [primary->SetColorIndex(primary, 0)]: Not supported!

Can anyone provide me with an working code or suggest any modification in
present code, so that SetColorIndex, can work.

Basicaly i am trying to do this.
1) Create on surface with Palette support.
2) Set the palette to the surface.
3) Then access a particular color in the Palette uing setcolorindex.
4) Draw a rectangle using that color.

Can anyone suggest where i am getting wrong.

regards
Animesh.

On Wed, Mar 19, 2008 at 8:20 PM, Denis Oliver Kropp <[EMAIL PROTECTED]>
wrote:

> animesh wrote:
> > Hi All,
> >     I am using DirectFB 1.0.1, and trying to run the following code.
> >     This code is the df_palette.c code that comes with the DirectFB
> > Examples, which i have modified a bit for seeing the use of
> SetColorIndex.
> >
> >     Can anyone tell me what is wrong in this code, and if nothing is
> > wrong then why i am getting the error.
> >     "SetColorIndex not supported."
> >
> >     What is the use of SetColorIndex?
> >     How can this code be modified to use SetColorIndex.
>
> SetColorIndex() saves finding the index by comparing each palette entry
> with the given color.
>
> Only surfaces with DSPF_*LUT* formats support it.
>
>  From looking at your I think this should work.
>
> >
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > #include <unistd.h>
> > #include <directfb.h>
> >
> > /* the super interface */
> > static IDirectFB            *dfb;
> >
> > /* the primary surface (surface of primary layer) */
> > static IDirectFBSurface     *primary;
> > static IDirectFBPalette     *palette;
> >
> > /* Input interfaces: device and its buffer */
> > static IDirectFBEventBuffer *events;
> >
> > static int screen_width, screen_height;
> >
> > /* macro for a safe call to DirectFB functions */
> > #define DFBCHECK(x...) \
> >
> > {                                                                      \
> >            err =
> > x;                                                            \
> >            if (err != DFB_OK)
> > {                                                \
> >               fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__
> > );           \
> >               DirectFBErrorFatal( #x, err
> > );                                   \
> >
> > }                                                                   \
> >         }
> >
> > static void
> > generate_palette()
> > {
> >      int       i;
> >      DFBResult err;
> >      DFBColor  colors[256];
> >
> >
> >      for (i=0; i<256; i++) {
> >           colors[i].a = 0xff;
> >           colors[i].r = i + 85;
> >           colors[i].g = i;
> >           colors[i].b = i + 171;
> >      }
> >
> >      DFBCHECK(palette->SetEntries( palette, colors, 256, 0 ));
> > }
> >
> > static void
> > rotate_palette()
> > {
> >      DFBResult err;
> >      DFBColor  colors[256];
> >
> >      DFBCHECK(palette->GetEntries( palette, colors, 256, 0 ));
> >
> >      DFBCHECK(palette->SetEntries( palette, colors + 1, 255, 0 ));
> >
> >      colors[0].r += 17;
> >      colors[0].g += 31;
> >      colors[0].b += 29;
> >      DFBCHECK(palette->SetEntries( palette, colors, 1, 255 ));
> > }
> >
> > static void
> > fill_surface( IDirectFBSurface *surface )
> > {
> >      DFBResult  err;
> >      int        x;
> >      int        y;
> >      void      *ptr;
> >      int        pitch;
> >      u8        *dst;
> >
> >      DFBCHECK(surface->Lock( surface, DSLF_WRITE, &ptr, &pitch ));
> >
> >      for (y=0; y<screen_height; y++) {
> >           dst = ptr + y * pitch;
> >
> >           for (x=0; x<screen_width; x++)
> >                dst[x] = (x*x + y) / (y+1);
> >      }
> >
> >      DFBCHECK(surface->Unlock( surface ));
> > }
> > int
> > main( int argc, char *argv[] )
> > {
> >      int                    quit = 0;
> >      DFBResult              err;
> >      DFBSurfaceDescription  sdsc;
> >      DFBColor  colors[256];
> >      int i;
> >
> >      colors[0].a = 0xff;
> >      colors[0].r = 0xff;
> >      colors[0].g = 0xff;
> >      colors[0].b = 0x00;
> >
> >      for (i=1; i<256; i++) {
> >           colors[i].a = 0xff;
> >           colors[i].r = i + 85;
> >           colors[i].g = i;
> >           colors[i].b = i + 171;
> >      }
> >
> >      DFBCHECK(DirectFBInit( &argc, &argv ));
> >
> >      /* create the super interface */
> >      DFBCHECK(DirectFBCreate( &dfb ));
> >
> >      /* create an event buffer for all devices */
> >      DFBCHECK(dfb->CreateInputEventBuffer( dfb, DICAPS_ALL,
> >                                            DFB_FALSE, &events ));
> >
> >      /* set our cooperative level to DFSCL_FULLSCREEN
> >         for exclusive access to the primary layer */
> >      dfb->SetCooperativeLevel( dfb, DFSCL_FULLSCREEN );
> >
> >      /* get the primary surface, i.e. the surface of the
> >         primary layer we have exclusive access to */
> >      sdsc.flags       = DSDESC_CAPS | DSDESC_PIXELFORMAT |
> DSDESC_PALETTE;
> >      sdsc.caps        = DSCAPS_PRIMARY;
> >      sdsc.pixelformat = DSPF_LUT8;
> >      sdsc.palette.entries = colors;
> >      sdsc.palette.size = 256;
> >
> >      DFBCHECK(dfb->CreateSurface( dfb, &sdsc, &primary ));
> >      primary->Clear( primary, 0, 0, 0, 0 );
> >
> >      primary->GetSize( primary, &screen_width, &screen_height );
> >
> >      /* get access to the palette */
> >      DFBCHECK(primary->GetPalette( primary, &palette ));
> >
> >      generate_palette();
> >      fill_surface( primary );
> >
> >      DFBCHECK(primary->SetColorIndex(primary, 0));
> >      primary->FillRectangle (primary, 10, 10, 240, 320);
> >
> >      primary->Flip (primary, NULL, 0);
> >
> >      while (!quit) {
> >           DFBInputEvent evt;
> >
> >           while (events->GetEvent( events, DFB_EVENT(&evt) ) == DFB_OK)
> {
> >                switch (evt.type) {
> >                     case DIET_KEYPRESS:
> >                          switch (evt.key_symbol) {
> >                               case DIKS_ESCAPE:
> >                                    quit = 1;
> >                                    break;
> >                               default:
> >                                    ;
> >                          }
> >                     default:
> >                          ;
> >                }
> >           }
> >      }
> >
> >      /* release our interfaces to shutdown DirectFB */
> >      palette->Release( palette );
> >      primary->Release( primary );
> >      events->Release( events );
> >      dfb->Release( dfb );
> >
> >      return 0;
> > }
> >
> > And one more doubt, In the documentation given in the following link.
> >
> >
> http://www.directfb.org/docs/DirectFB_Reference/types.html#DFBSurfaceDescription
> >
> >
> > The DFBSurfaceDescription, structure is having the following field, but
> > in the actual code,
> >     const DFBColor *entries;
> >     unsigned int size ;
> >     are part of the palette structure as you can seen in the above code:
> >     sdsc.palette.entries = colors;
> >     sdsc.palette.size = 256;
> >
> > Why is this ambiguity?
>
> The documentation generator needs to be fixed to handle nested structs.
>
> --
> Best regards,
>   Denis Oliver Kropp
>
> .------------------------------------------.
> | DirectFB - Hardware accelerated graphics |
> | http://www.directfb.org/                 |
> "------------------------------------------"
>



-- 
Regards,
Animesh Bhadra,
+91-9880868571
_______________________________________________
directfb-users mailing list
directfb-users@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-users

Reply via email to