I. DirectFB可以用来做什么
DirectFB是图形API存在于Frame Buffer层之上与高级图形管理层如GTK+等之下的。它可以以很小的系统资源占用来提供图形硬件加速功能,提供类如多路a通道渲染模型等高级图像操作。它不修改Linux内核,除了标准C库没有其他库的依赖。应用在了基于Linux系统的DTV显示系统的研发和其他有关Linux显示界面的项目上。支持市面上绝大多数显示卡,支持键盘、鼠标、遥控器、游戏手柄、触摸屏等输入设备。支持JPEG、PNG、GIF、mpeg1/2、AVI、MOV、Flash、Video4Linux、DirectFB bitmap font和TrueType等音视频文件和字体。
关于DirectFB的介绍可以参考:
http://elinux.org/DirectFB
http://www.directfb.org/index.php
http://www.linuxgraphics.cn/directfb/overview.html
http://www.linuxgraphics.cn/directfb/about.html
http://www.directfb.org/docs/ELC2008/elc2008_directfb_gfx.pdf
上层API支持DirectFB的有:
XDirectFB、DirectFBGL、GTK+、DFBTerm、DFBSee、DFBPoint、MythTV、Qt on DirectFB、SDL(SimpleDirectmedia Layer)。
本文主要参考:
http://elinux.org/images/d/d4/Elc2008_directfb_gfx.pdf
II. DirectFB在系统中的位置
从结构来讲,对于一般的MMP,DTV和STB来说,上面两幅图是比较经典的结构。
DirectFB都处于QT,GTK+这样的高级GUI框架的下面,系统驱动的上面。
从功能方面来讲,下面两幅图比较形象的说明了DirectFB的主要作用:图形,文字的处理(DirectFB把TS经过Decoder处理之后的码
流,再加上图形和文字,一起传给视频的芯片)
III. DirectFB怎么使用
选择一个合适的DirectFB版本,下载并安装
DirectFB的代码可以从这里下载:http://www.directfb.org/index.php?path=Main%2FDownloads
建立DirectFB的配置文件directfbrc
DirectFB的配置可以参考,里面有对directfbrc的详细介绍
http://www.directfb.org/wiki/index.php/Configuring_DirectFB
中文的可以参考这里:
http://hi.baidu.com/weiliqun/blog/item/6f4ba4ebe601eee2cf1b3e57.html
运行DirectFB的例子程序,如果运行成功,则可以开始编写基于DirectFB的应用程序了。(有的平台需要写图形驱动)
但是 DirectFB自身并不提供图形控件,如果要实现菜单等效果,必须高级图形库(GTK+,QT)调用DirectFB来实现。
下面是一张DirectFB的例子的运行图片:
可以参考:
http://elinux.org/Porting_DirectFB
IV. DirectFB的结构
下图是一个更加细化的DirectFB的结构图:
对于上层的GUI高级框架来说,DirectFB是透明的。
对于底层的驱动来说,DirectFB里面负责和硬件打交道的显卡的驱动(gfxdriver)和显示系统(system),这里面gfxdriver是和
各个硬件平台相关的,有可能需要自己写。
为了更易于理解DirectFB,需要先介绍几个DirectFB里面的概念:
· Layers:代表互相独立的图形缓存。大多数嵌入式设备都有多个layer。多个layer根据对应的alpha值混合在一起,从而显示
出来。
· Surface:代表一块预留的内存,来保存像素数据。DirectFB中的Drawing,Bilitting操作就是基于surface的。Surface的内
存根据设定,可以从系统中分配,也可以从显卡的内存中分配。
· Primary Surface:代表一个特殊layer的特殊surface。如果primary surface是单缓冲的,任何对于primary surface的操作
都会直接反应到显示屏上。
· Subsurface:是一个surfac的子集,但是自身并不占有任何内存。
· Window/Windowstack:控制一个layer中的surface该显示什么。Window属于某个背景可以设定的layer。每个window有自己的
surface,window用这个surface来组合图像。
比如说下面这幅图,有三个layer,最下面的layer是一幅背景图,中间的layer是一个透明的带有一个“igel”的layer,最上面是
一个透明的带有subtitle的layer,最后我们在显示器中看到的就是各个layer的混合。
在比如说下面这幅图,lower layer是一个全屏模式的layer,它的背景图片渲染在自己的surface上面。Video area是一个
subsurface,用来显示video。Upper layer通过window stack/window来显示应用程序的内容,而且upperlayer是一个透明的
layer,这样混合之后,可以透过上面的layer看到下面的video。
下面在来看看DirectFb的内部具体构造,如下图所示:
下面在看看DirectFB内部各个接口如何工作的,一般还是分为data,event(蓝色部分),和GUI(土黄色部分)。各个接口在
IDirectFB的管理下,接受event,处理数据,最后通过layer显示出来。
V. DirectFB代码导读
从这节开始,开始说说DirectFB的代码。
这部分主要来自:http://blog.csdn.net/absurd/article/details/1001641。
1》 基本库函数。这部分代码在lib目录下,它分为三个部分:
direct: 里面是一些公共函数,其中包括哈希表、链表、线程、调试信息、
signal处理、优化过的memcpy和平台相关的一些函数。
fusion:它有两个版本,一个是针对单进程的,要求所有应用程序在一个进程中
运行,这相对来说比较简单。另外一个是针对多进程的,应用程序可以在多个进程
中运行。它实现了一些进程间通信机制,其中包括互斥、共享内存、共享内存中的
vector实现、带引用计数的内核对象和reactor等。多进程版本还需要一个内核模块
linux-fusion的支持。
voodoo: 不清楚(若那位高手知道,请补充一下,谢谢)。
2》 对第三方组件库的包装。这部分代码在interfaces目录下。Interfaces可能
会引起别人的误解,因为它并不是DFB对外提供的接口,而是把第三方组件纳入DFB
的接口。它包括三类:
字体。字体有点阵字体和矢量字体之分,矢量字体又有诸如truetype之类
几种格式。前者可能比较简单,而后者的处理相当复杂,要借助如freetype
等第三方程序库来实现。DFB定义了IDirectFBFont接口来处理字体,在第三
方字体程序库上加上一个adapter就可以在DFB中使用了。
图片。图片格式的种类很多,像BMP之类的位图处理可能比较简单,而像
JPG和PNG等的图片,采用了高级的压缩技术,解压算法比较复杂,通常需要
第三方程序库的支持。DFB定义了IDirectFBImageProvider接口来处理图
片,在第三方图片程序库上加上一个adapter就可以在DFB中使用了。
视频。视频格式更多,解压算法也更复杂,自然也要借助第三方库来实
现。DFB定义了IDirectFBVideoProvider接口来处理视频,在第三方视频程
序库上加上一个adapter就可以在DFB中使用了。
3》 核心代码。这部分代码在src目录下。它可以分为两大类:
核心组件。DFB的core由多个部分组成,每个部分称为一个core_part,都实现
同一个接口CorePart。这个接口并不描述它们的功能,而是用于管理的。
核心组件包括下面几个组件:
dfb_core_clipboard:剪切板。
dfb_core_colorhash:调色板。
dfb_core_gfxcard:图形卡,主要完成基本的绘图功能,如绘直线、填充等等。
dfb_core_input:输入设备。
dfb_core_layers:分层功能,好像要硬件支持,通常都只有一个层。
dfb_core_screens:逻辑屏幕(可能像X一样支持多个屏幕吧,不太清楚,有时间再研究)。
dfb_core_system:显示输出,把gfxcard绘制后的图形数据输出到屏幕上,即可以
通过fbdev输出到本机屏幕上,也可以通过sdl/x11/vnc输出到远程主机的屏幕上。
对于像sdl/x11等,也包括对输入事件的处理。
dfb_core_wm:窗口管理器。
以上这些core_part,有的是直接实现的,比如clipboard。有的只是一层包装,具
体的实现在一个独立的共享库中,在运行时通过参数来控制加载具体的实现,如system。
对外接口。这主要是给上层应用程序使用的。其中包括:
IDirectFBInputDevice:输入设备
IDirectFBScreen:屏幕。
IDirectFBSurface:绘图表面。
IDirectFBPalette:调色板。
IDirectFBFont:字体
IDirectFBImageProvider:图片
IDirectFBVideoProvider:视频
IDirectFBWindow:窗口
DirectFBEventBuffer:事件缓冲
4》 窗口管理器。这部分代码在wm目录下。DFB实现了两个窗口管理器。
default:实现了基本的窗口管理功能,支持一些快捷键。
unique:功能也很弱,不过架构还可以,加入自己的功能很方便。
5》输入设备。这部分代码在inputdrivers目录下。其实这些代码并不是真正的驱动,只是一个adapter层,它把从linux设备文件
读到的事件,转换成DFB自己的事件格式,然后调用dfb_input_dispatch把事件分发出去。
6》输出设备。这部分代码在system目录下。这也是一个adapter层,主要对显示设备的抽象,有的也包括对输入事件的处
理。其中包括:
fbdev: 输出到frame buffer。
osx: 输出到mac os上。
vnc:输出到VirtualNetwork Computing(类似于微软远程桌面的一个协议)。
x11:输出到XWindow上,在0.9.24仍然有问题,建议使用SDL。
sdl:输出到SimpleDirectMedia Layer。
对于细节,可以参考:http://ishare.down.sina.com.cn/18355655.pdf?ssig=aaQ6Jy9kO%
2F&Expires=1315670400&KID=sina,ishare&ip=1315552018,210.22.22.
VI. DirectFB定制开发
有时候我们需要把DirectFB移植到特殊的平台上面,这样我们需要写一些特有的驱动。
我们可以定制的模块有:
· System(可选),位于sytems/*目录下面
· Graphics Devices
· Graphic Drivers,位于gfxdrivers/目录下面
· Screens
· Layers
要实现每一个模块,我们必须实现一些接口,以被DirectFB内部调用。下图列举了我们需要实现的函数:
这部分可以参考:
http://www.directfb.org/docs/ELCE2007/elce2007_directfb_gfx.pdf
http://www.linuxgraphics.cn/directfb/our_experience_on_directfb_in_embedded_app_dev.html
VII. DirectFB上层的GUI框架简介与对比
这部分可以参考:
http://www.slideshare.net/guestbd40369/graphical-libraries
首先说说传统的GTK和QT
另外还有比较先进的:
Disko:http://www.diskohq.com/
基于Disko的应用:http://wiki.morphine.tv/tiki-custom_home.php
FTK: http://code.google.com/p/ftk/
VIII. 本文全部的参考:
· elce2007_directfb_gfx:http://www.directfb.org/docs/ELCE2007/elce2007_directfb_gfx.pdf
· CELF_2005_DFB_Slides:http://www.directfb.org/docs/CELF/CELF_2005_DFB_Slides.pdf
· DirectFB_improve:http://elinux.org/images/4/4a/Directfb_improve.pdf
· DirectFb源码解读:http://ishare.down.sina.com.cn/18355655.pdf?ssig=JAx%2BxQXrbE&Expires=1315584000&KID=sina,ishare&ip=1315470750,210.22.22.
· DirectFb概览:http://directfb.org/docs/DirectFB_overview_V0.2.pdf
· 李先静博客:http://blog.csdn.net/absurd/article/details/1001641
· 嵌入式图形:http://www.linuxgraphics.cn
· Embedded Linux Wiki :ttp://elinux.org/DirectFB
· directFB官网:http://www.directfb.org/index.php
· Disko:http://www.diskohq.com/
· FTK:http://code.google.com/p/ftk/
· morphine.tv:ttp://wiki.morphine.tv/tiki-custom_home.php