1.將要顯示的圖片及其相關信息通過createimageprovider保存在一個imageprovider中
2. 通過getsurfacedescription函數將保存在imageprovider中的圖片信息提取出來,存於某surfacedescription中
3. 利用這個surfacedescription建立一個新的idirectfbsurface,將imageprovider中的圖片renderto到這個idirectfbsurface中
4. 使用fillrectangle清空屏幕,準備畫圖
5. 將後面生成的那個idirectfbsurface Blit到primary平面的指定區域
6. 使用Flip顯示結果
以下是一個典型的圖片顯示程序:
-----------------------------------------Makefile-----------------------------------------------------
all : main.c showImage.c showImage.h
gcc $^ `pkg-config --cflags --libs directfb`
-----------------------------------------main.c------------------------------------------------------
#include <stdio.h>
#include "showImage.h"
int main(int argc, char *argv[])
{
init_application(&argc, &argv);
if(argc < 2)
fprintf(stderr, "%s: 請指定要顯示的圖片名.\n", argv[0]);
showImage(argv[1]);
sleep(5);
return 0;
}
------------------------------------------showImage.h---------------------------------------------
#ifndef SHOWIMAGE_H_
#define SHOWIMAGE_H_
#include <directfb.h>
static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static int screen_width = 0;
static int screen_height = 0;
static IDirectFBSurface *logo = NULL;
static IDirectFBEventBuffer *events = NULL;
static IDirectFBImageProvider *provider = NULL;
static DFBSurfaceDescription sdsc;
static DFBResult ret = DFB_OK;
extern void showImage(char *imageName);
extern void init_application(int *argc, char **argv[]);
extern void exit_application(int status);
#endif /* SHOWIMAGE_H_ */
------------------------------------------showImage.c---------------------------------------------
#include "showImage.h"
#include <stdlib.h>
void showImage(char *iamgeName)
{
/*將經過初始化的primary的長寬信息賦予screen_width和screen_height
*primary佔滿全屏,則其長寬值也即屏幕像素值*/
primary->GetSize(primary, &screen_width, &screen_height);
//獲取provider,也即圖片的相關信息
provider->GetSurfaceDescription(provider, &sdsc);
//使用上面得到的sdsc來創建一個平面logo,這個平面的大小與圖片大小一致
dfb->CreateSurface(dfb, &sdsc, &logo);
//將圖片呈遞給剛纔建立的logo平面,如果大小不一,則進行縮放
provider->RenderTo(provider, logo, NULL);
//清空屏幕
primary->FillRectangle(primary, 0, 0, screen_width, screen_height);
//將圖片blit到平面
primary->Blit(primary, logo, NULL, (screen_width - sdsc.width) / 2,
(screen_height - sdsc.height) / 2);
//Flit整個屏幕
primary->Flip(primary, NULL, DSFLIP_WAITFORSYNC);
}
void init_application(int *argc, char **argv[])
{
//使用命令行參數初始化DFB
ret = DirectFBInit(argc, argv);
if(ret)
{
DirectFBError("DirectFBInit() failed.\n", ret);
exit_application(1); //請注意不同的錯誤對應不同的輸出
}
//創建總接口(IDirectFB *dfb)
ret = DirectFBCreate(&dfb);
if(ret)
{
DirectFBError("DirectFBCreate() faild.\n", ret);
exit_application(2);
}
//要求進行全屏顯示
dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN);
//對平面屬性(surface description)進行相應設置
sdsc.flags = DSDESC_CAPS;
sdsc.caps = DSCAPS_PRIMARY | DSCAPS_DOUBLE;
//創建最上層的primary平面
ret = dfb->CreateSurface(dfb, &sdsc, &primary);
if(ret)
{
DirectFBError("IDirectFB::CreateSurface() faild.\n", ret);
exit_application(3);
}
//創建一個鍵盤事件緩存
ret = dfb->CreateEventBuffer(dfb, &events);
if(ret)
{
DirectFBError("IDirectFB::CreateEventBuffer() faild.\n", ret);
exit_application(4);
}
//創建一個imageprovider
ret = dfb->CreateImageProvider(dfb, "./shot.png", &provider);
if(ret)
{
DirectFBError("IDirectFB::CreateImageProvider() faild.\n", ret);
// exit_application(5);
}
}
void exit_application(int status)
{
//先釋放資源
if(events)
events->Release(events);
if(provider)
provider->Release(provider);
if(primary)
primary->Release(primary);
if(dfb)
dfb->Release(dfb);
exit(status);
}