DirectFB学习笔记一

本文记录directfb程序的基本操作流程。

1、首先创建一个directfb对象:DirectFBInit(&argc,&argv)初始化然后创建DirectFBCreate(&dfb)。

2、由directfb对象创建界面surface:dfb->CreateSurface(dfb,&dsc,&primary),primary就是我们的绘图面。

3、绘图:首先要画一个背景,一般是primary->FillRectangle然后在背景上画图。每次画图前最好都要setcolor一下,改变画笔的颜色。

4、将图画展现出来:flip函数将画面显示到界面上。

参考示例:画一条直线

转至http://blog.csdn.net/wangjijian/article/details/6150808

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方法将此接口进行释放,否则可能引起内存泄漏问题,甚至可能破坏程序的稳定性。

时间: 2024-10-11 18:13:45

DirectFB学习笔记一的相关文章

DirectFB学习笔记二

本篇目的,画一个方框,在方框上画一串字符. 实现步骤:首先创建IDirectFB接口,通过它再创建要显示的表面surface,同时创建字体font,绘制字符必须要设置绘制的字体,否则绘制不成功.然后清理窗口,将整个surface填充为黑色,最后绘制方框和字符. #include<stdio.h>#include<unistd.h>#include<directfb.h> static IDirectFB *dfb = NULL;static IDirectFBSurfa

DirectFB学习笔记三

本篇目的,通过键盘的esc键控制程序退出.学习输入设备产生事件,接收事件,产生反应. 首先获取输入设备 IDirectFBInputDevice *keyboard = NULL; dfb->GetInputDevice(dfb,DIDID_KEYBOARD,&keyboard); 将输入事件连接到事件buffer中 IDirectFBEventBuffer *buffer = NULL; keyboard->CreateEventBuffer(keyboard,&buffer

DirectFB学习笔记四

本篇目的,实现按钮的点击事件捕获,也就是鼠标点击,如果点击在方框范围内,则响应,在方框外,则忽略. 由于鼠标移动和点击都会产生事件,因此,我们可以在鼠标移动的时候记录坐标,在点击时比较坐标是否在方框范围内从而判断是否点击的按钮. 首先和上篇一样创建事件buffer,获取事件event. if(event.type == DIET_AXISMOTION)//如果是鼠标移动事件 { switch(event.axis)//判断event中记录的是x坐标的事件还是y坐标的事件 { case DIAI_

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.