directfb研究

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

你可能感兴趣的:(linux,System,图形,layer,gtk,linux内核)