您的位置:首页 > 其它

DirectFB 源码解读之初始化-4

2013-03-21 16:14 281 查看
转载时请表明原文出处(http://blog.sina.com.cn/wyw1976)及作者邮箱(wyw1976@gmail.com)

 

 
上一节说到dfb_core_initialize()将完成各个核心部件的初始化。DFB中,将以下几个方面作为core part,即核心部件,它们是:
 
 clipboard:管理剪切板,DFB内部维护一块共享内存作为剪切板,并提供了GetClipboardData和SetClipboardData两个API给上层应用使用这个剪切板。

 

 colorhash:DFB支持RGB, 也支持颜色的Hash表, 创建surface时如果指定的pixel format是DSPF_LUT8 或DSPF_ALUT44 , 则该surface有关颜色的操作都是通过Hash 表。用户使用的一般步骤是:  

(1)创建一个surface(pixel format 必须为DSPF_LUT8 或DSPF_ALUT44)

(2)创建一个palette

(3)surface->setPalette

(4)surface->SetColor等颜色操作。

 

 surface: 写写画画的主战场。

 system:  前面已经讲过了,特指graphics system, 例如fb,X11等。

 input:    对各种外设的抽象,包括鼠标、键盘、滚轮等,注意是这里的input 概念与具体的输入驱动是不同的。在DFB包中有一个inputdrivers的目录包含了各种具体设备的驱动。而两者之间又是有关联的:上层应用在调用DFB中有关外设输入的接口,如CreateInputEventBuffer,总是先进入抽象层,再由此进入具体的设备。

 graphics:对各种gfx driver的抽象,与上面的input类似。

 screen:屏幕的抽象

 layer:层的抽象

 wm:窗口管理

 

几个容易混淆的概念:surface, screen, layer。

surface:是用户作图的一块方形区域,对应一块内存,用户可以任意创建多个surface,surface与屏幕没有任何联系。

screen:  就是用户看到的屏幕,实际上对应的是系统中特定的一块内存,写到这块内存的东西会自动显示到屏幕上,这块内存可以通过grahics system操作,如frame buffer等, DFB的用户并不能直接操作这块内存。surface 上的东西只有拷贝到这块内存中才会显示出来。

layer: 一般是一个与graphics driver 有关的物理特性,不同的硬件可能支持的layer个数不同,种类也不同。不同的layer对应不同的graphics card中的不同内存。一个典型的应用是下面的一个layer显示video, 上面的layer显示字幕。layers上的内容在现实到屏幕之前需要做混合等处理。

下面看看dfb_core_initialize()的源码【src\core\Core.c】:

 

 dfb_core_initialize( CoreDFB *core )

{

    

.........

     for (i=0; i<D_ARRAY_SIZE(core_parts); i++) {

          DFBResult ret;

          if ((ret = dfb_core_part_initialize( core, core_parts[i] ))) {

               dfb_core_shutdown( core, true );

               return ret;

          }

     }

     return DFB_OK;

}

 

这个函数及其调用的dfb_core_part_initialize()都很简单,就是调用各个core_part的初始化函数完成各个核心部件的初始化。

 

其中core_parts[]定义在同一文件中:

static CorePart *core_parts[] = {

     &dfb_clipboard_core,

     &dfb_colorhash_core,

     &dfb_surface_core,

     &dfb_system_core,

     &dfb_input_core,

     &dfb_graphics_core,

     &dfb_screen_core,

     &dfb_layer_core,

     &dfb_wm_core

};

 

可是搜遍了整个DFB源码,好像并没有这些core_part的定义,怎么回事呢?原来DFB是通过宏DFB_CORE_PART来定义这些core_part的。每一个核心部件的源码中都有一个DFB_CORE_PART, 例如:

DFB_CORE_PART( clipboard_core, ClipboardCore );【src\core\Clipper.c】

DFB_CORE_PART( graphics_core, GraphicsCore );【src\core\Gfxcard.c】

DFB_CORE_PART( input_core, InputCore );【src\core\Input.c】

等等。

 

这个宏实际上是定义了一些函数,也就是每个核心部件都需要实现的接口:

#define DFB_CORE_PART(part,Type)                                               \

......

CorePart dfb_##part = {                                                        \

     .name        = #part,                                                     \

                                                                               \

     .size_local  = sizeof(DFB##Type),                                         \

     .size_shared = sizeof(DFB##Type##Shared),                                 \

                                                                               \

     .Initialize  = (void*)dfb_##part##_initialize,                            \

     .Join        = (void*)dfb_##part##_join,                                  \

     .Shutdown    = (void*)dfb_##part##_shutdown,                              \

     .Leave       = (void*)dfb_##part##_leave,                                 \

     .Suspend     = (void*)dfb_##part##_suspend,                               \

     .Resume      = (void*)dfb_##part##_resume,                                \

}

通过这个宏定义,实现了各个不同的核心部件对外接口的统一。

 

现在再看dfb_core_part_initialize()就很简单了,它调用各个核心部件的Initialize()函数,也就是dfb_##part##_initialize(), 例如对于graphics_core, 就是dfb_graphics_core_initialize;对于input_core,就是dfb_input_core_initialize。从下一节开始,我们将选取几个核心部件看看其中它们初始化的流程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: