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.
#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
DFBSurfaceDescriptionFlags
<http://www.directfb.org/docs/DirectFB_Reference/types.html#DFBSurfaceDescriptionFlags>
*flags;* field validation
DFBSurfaceCapabilities
<http://www.directfb.org/docs/DirectFB_Reference/types.html#DFBSurfaceCapabilities>
*caps;* capabilities
int *width;* pixel width
int *height;* pixel height
DFBSurfacePixelFormat
<http://www.directfb.org/docs/DirectFB_Reference/types.html#DFBSurfacePixelFormat>
*pixelformat;* pixel format
void **data;* data pointer of existing buffer
int *pitch;* pitch of buffer
const DFBColor **entries;*
unsigned int *size;*
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?
regards
Animesh
_______________________________________________
directfb-users mailing list
directfb-users@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-users