(1)创建一个surface(pixel format 必须为DSPF_LUT8 或DSPF_ALUT44)
(2)创建一个palette
(3)surface->setPalette
(4)surface->SetColor等颜色操作。
几个容易混淆的概念:surface,
surface:是用户作图的一块方形区域,对应一块内存,用户可以任意创建多个surface,surface与屏幕没有任何联系。
screen:
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。从下一节开始,我们将选取几个核心部件看看其中它们初始化的流程。