DirectFB提供很多API帮助绘制图形,另外可以直接操作显示缓冲区来绘制图像。
#include <stdio.h>
#include <unistd.h>
#include <directfb.h>
#define DFBCHECK(x...) \
{ \
DFBResult err = x; \
\
if (err != DFB_OK) \
{ \
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
DirectFBErrorFatal( #x, err ); \
} \
}
static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static int screen_width = 0;
static int screen_height = 0;
int main (int argc,char**argv)
{
DFBSurfaceDescription dsc;
DFBCHECK (DirectFBInit (&argc, &argv));
DFBCHECK (DirectFBCreate (&dfb));
DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
dsc.flags = DSDESC_CAPS;
dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));
DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
int height = screen_height;
int width = screen_width;
printf("width:%d,height:%d\n",width,height);
int buffer_size = height * width;
unsigned char* buffer = malloc(buffer_size);
memset(buffer,0,buffer_size);
char* pdata = buffer;
while(height--){
int w;
int area = height / 100;
for(w = 0;w < width;w++)
{
int mode = area % 3;
unsigned short val;
switch(mode){
case 0:
val = 0xf203;
break;
case 1:
val = 0x908f;
break;
case 2:
val = 0xffa1;
break;
}
*(pdata+w) = val;
}
pdata+=width;
}
int i;
int data_pitch;
void* data= NULL;
int ret = primary->Lock(primary,DSLF_WRITE,(void*)&data,&data_pitch);
int offset = (data_pitch - width) / 2;
for(i =0;i<screen_height;i++){
memcpy(data + offset,buffer + i * width,width);
data+=data_pitch;
}
primary->Unlock(primary);
DFBCHECK (primary->Flip(primary,NULL,0));
sleep(3);
tag_end:
free(buffer);
primary->Release (primary);
dfb->Release(dfb);
return 23;
}
效果截图: