DirectFB 源码解读之初始化-4

转载时请表明原文出处(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。从下一节开始,我们将选取几个核心部件看看其中它们初始化的流程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值