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。从下一节开始,我们将选取几个核心部件看看其中它们初始化的流程。
上一节说到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。从下一节开始,我们将选取几个核心部件看看其中它们初始化的流程。
相关文章推荐
- DirectFB 源码解读之初始化-10
- DirectFB 源码解读之初始化-10
- DirectFB 源码解读之初始化-1
- DirectFB 源码解读之初始化-2
- DirectFB 源码解读之初始化-3
- DirectFB 源码解读之初始化-5
- SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化
- SpringMVC源码之解读DispatcherServlet初始化流程
- DirectFB 源码解读之gfx硬件加速如何工作
- jpcsp源码解读之二:main函数与jpcsp的初始化流程
- Spring源码解读——Spring容器初始化 1
- Spark源码解读之SparkContext初始化
- DirectFB 源码解读之外设输入处理流程
- DirectFB 源码解读之双缓存实现
- 源码解读----之_k-means++初始化质心的方法(被k_means调用)
- Spring源码解读-Spring IoC容器初始化之资源注册
- SpringMVC源码解读 - HandlerMapping - RequestMappingHandlerMapping初始化
- DirectFB 源码解读之双缓存实现
- Spring源码解读-Spring IoC容器初始化之资源定位
- struct2源码解读(2)之struct2初始化