DirectFB简单示例

转载 2011年01月18日 20:17:00

 

在上一篇文章中启动好了framebuffer,现在可以用这样一个简单的例子来检验下效果。

来自DirectFB官方网站的简单程序,在屏幕上画一条线。

 
编译后,执行 成功了。

 

Simple fullscreen application that draws a horizontal line.

代码如下:

#include <stdio.h>

#include <unistd.h>

#include <directfb.h>

 

static IDirectFB *dfb = NULL;

static IDirectFBSurface *primary = NULL;

static int screen_width = 0;

static int screen_height = 0;

 

#define DFBCHECK(x...)                                                  /

{                                                                       /

DFBResult err = x;                                              /

/

if (err != DFB_OK)                                              /

{                                                               /

fprintf( stderr, "%s <%d>:/n/t", __FILE__, __LINE__ );  /

DirectFBErrorFatal( #x, err );                          /

}                                                               /

}

 

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

DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height));

 

DFBCHECK (primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff));

DFBCHECK (primary->DrawLine (primary,

0, screen_height / 2,

screen_width - 1, screen_height / 2));

DFBCHECK (primary->Flip (primary, NULL, 0));

sleep(5);

 

primary->Release(primary);

dfb->Release(dfb);

return 23;

}

下面我们来看这个程序,前三行:

#include <stdio.h>

#include <unistd.h>

#include <directfb.h>

为头文件包含。第5到第8行:

static IDirectFB *dfb = NULL;

static IDirectFBSurface *primary = NULL;

static int screen_width = 0;

static int screen_height = 0;

为全局变量定义。第10到第19行为出错处理宏:

#define DFBCHECK(x...)                                                  /

{                                                                       /

DFBResult err = x;                                              /

/

if (err != DFB_OK)                                              /

{                                                               /

fprintf( stderr, "%s <%d>:/n/t", __FILE__, __LINE__ );  /

DirectFBErrorFatal( #x, err );                          /

}                                                               /

}

此宏定义在官方给的程序中很常见,确实也挺好用。第21到46行为主程序代码段。

 

其中,第23行:

DFBSurfaceDescription dsc;

为局部变量定义,dsc为平面属性描述变量,用以创建与其相匹配的平面。

 

第25到26行:

DFBCHECK (DirectFBInit (&argc, &argv));

DFBCHECK (DirectFBCreate (&dfb));

为DirectFB初始化函数,第25行用以初始化命令行参数,而第26行用以创建DirectFB的主接口。

 

第28到30行对平面属性进行了初始化,其中第28行:

DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));

设置了DirectFB的主接口的同步等级,DFSCL_FULLSCREEN与DFSCL_EXCLUSIVE相同,均为非共享的同步等级,在总接口使用CreateSurface方法创建平面时,将创建全屏平面。

 

第29到30行:

dsc.flags = DSDESC_CAPS;

dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;

说明了即将创建的平面的属性,在本例中,我们要创建一个可flip的主平面。

 

第32到34行:

DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));

DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));

DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height));

创建了一个平面,并对此平面作了相应的初始化操作。第33行获取了此平面(全屏主平面)的宽高值,第34行在平面上画了一个黑色(DirectFB系统默认颜色)的屏幕大小矩形,此函数是受stb225平台硬件加速支持的。

 

第36到41行:

DFBCHECK (primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff));

DFBCHECK (primary->DrawLine (primary,

0, screen_height / 2,

screen_width - 1, screen_height / 2));

DFBCHECK (primary->Flip (primary, NULL, 0));

sleep(5);

的功能为在屏幕正中心画一条横线,并显示5秒钟。第36行设置了线的颜色,第37到39行进行画线操作,将36行所设置颜色的线画到primary平面上,第40行将画有横线的平面显示出来,第41行,程序休眼5秒,即此线在屏幕上显示5秒。

 

第43到45行:

primary->Release(primary);

dfb->Release(dfb);

return 23;

程序作了相应的清理操作,而后退出。

 

DirectFB程序中,如果定义了接口,则一定需要使用相应的Release方法将此接口进行释放,否则可能引起内存泄漏问题,甚至可能破坏程序的稳定性。

DirectFB运行机制介绍

http://blog.csdn.net/absurd/article/details/2596080 DirectFBInit 这个函数其实并没有做什么特殊的初始化工作,只是加载了...
  • heyustudent
  • heyustudent
  • 2014年07月23日 14:35
  • 1214

directfb是Linux平台上一个图形系统

单芯片 IP/DVB 解决方案  丰富的外围借口:支持以太网( RJ45,10/100Mbs )、 MiniPci (支持无线网卡)、双路 DVB 输入(支持 DVB-C/T/S );具备 2 个串...
  • zhangliang_571
  • zhangliang_571
  • 2014年06月03日 15:27
  • 2941

DirectFB源代码阅读(三)线程及信号初始化

在使用DirectFB创建一个程序的时候,要执行两个初始化函数,上一篇文章讲了第一个DirectFBInit,下面几篇讲第二个DirectFBCreate. DirectFBCreate主要调用了三...
  • wujinting007
  • wujinting007
  • 2013年03月28日 10:19
  • 716

DirectFB 源码解读之初始化-1

转载时请表明原文出处(http://blog.sina.com.cn/wyw1976)及作者邮箱(wyw1976@gmail.com)   DirectFB就是一个全能系统,麻雀虽小五脏俱...
  • yongcai1
  • yongcai1
  • 2013年03月21日 15:46
  • 744

DirectFB的接口详解

1. 概述    ================      本文主要研究DirectFB及其向上向下的接口,顺带讲一下QT搭配DirectFB使用的一些笔记。    其他,如Direct...
  • yinjiabin
  • yinjiabin
  • 2012年06月18日 17:32
  • 15713

DirectFB代码导读

DirectFB代码导读  转载时请注明出处和作者联系方式作者联系方式:李先静  DirectFB是一个庞大的系统,对它进行彻底分析要花不少时间。幸好多数情况下,只要弄清楚它的基本架构,再重点读一些关...
  • absurd
  • absurd
  • 2006年07月30日 16:22
  • 19968

DirectFB教程导读-在屏幕中心画一条横线

DirectFB教程导读-在屏幕中心画一条横线2010-05-11 14:202009-11-23 15:21Simple fullscreen application that draws a ho...
  • zjr19850103
  • zjr19850103
  • 2011年03月16日 15:01
  • 1268

DirectFB 之 FillRectangle 绘制矩形

1. 函数原型解析 函数声明: DFBResult FillRectangle (     IDirectFBSurface    *  thiz,      int     x,      i...
  • iamonlyme
  • iamonlyme
  • 2014年01月06日 19:29
  • 1998

DirectFB移植(GUI arm linux DirectFB GTK tslib)

DirectFB移植1 前言      数年前,曾经开发过一个嵌入式的产品,如今市场依然存在,但由于电子产品的升级换代很快,许多元器件都采购不到了,为了延续产品的生命周期,计划在linux平台上开发新...
  • y296144646q
  • y296144646q
  • 2011年04月23日 15:58
  • 2928

GUI开发之DirectFB

原文 DirectFB 1. DirectFB概述 在嵌入式GUI中需要实现多种图形功能,包括图形绘制以及图形拷贝等。其中的许多功能需要进行大量的数据传递(如图形拷贝)或者需要进行大量的数值...
  • cjsycyl
  • cjsycyl
  • 2012年06月25日 10:20
  • 1069
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectFB简单示例
举报原因:
原因补充:

(最多只允许输入30个字)