DirectFB write surface buffer

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


效果截图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白錵錵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值