DFB圖片顯示程序

0. 每個DFB程序都需要一個IDirectFB主接口,大部分程序還需要一個最上層的,用於顯示圖片或視頻的IDirectFBSurface,前者一般命名爲dfb,後者一般叫primary,當然也有不喜歡這樣取命字的。

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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章