DirectFB 之 字体显示(2)

框架


示例代码

/**********************************************
 * Author: younger.liucn@hotmail.com
 * File name: dfbFont.c
 * Description:  dfbFont
 * Version, Desc
 *  1.1    Created
 *  1.2    add config
 **********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

#include <time.h>
#include <sys/time.h>
#include <directfb.h>

#include "dfbFont.h"

/* config information */


/*********************************************************
 * log flags and func of debug and error infor.[Begin]
 ********************************************************/
//#define DFB_SYS_LAYER
//#define _DFB_DEBUG_

#define DFB_FONT_TYPE_1 "/home/liuyiy/DFB/Font/data/decker.ttf"

#define WINDOW_TEXT_LEN_X_PER	(0.5)
#define WINDOW_TEXT_LEN_Y_PER	(0.1)
#define WINDOW_TEXT_OFFSET_X_PER	(0.25)
#define WINDOW_TEXT_OFFSET_Y_PER	(0.75)

#ifdef _DFB_DEBUG_
#define DFB_DEBUG(format, ...)    do {       
    printf("[BootAnimation:%4dL]DEBUG: "format, __LINE__, ##__VA_ARGS__);  
} while (0)
#else
#define DFB_DEBUG(format, ...)    do {} while (0)
#endif

#define DFB_NOTICE(format, ...)    do {       
    printf("[BootAnimation:%4dL]INFO: "format, __LINE__, ##__VA_ARGS__);  
} while (0)

#define DFB_ERROR(format, ...)    do {       
    printf("[BootAnimation:%4dL]ERROR: "format, __LINE__, ##__VA_ARGS__);  
} while (0)
/*********************************************************
 * log flags and func of debug and error infor.[End]
 ********************************************************/

/*********************************************************
 * Data structure and Global variants [Begin]
 ********************************************************/
/* 使用directFB画图所需的四个DFB资源 */
struct AnimationDsc {
    IDirectFB               *dfb;
    IDirectFBDisplayLayer	*layer;
    IDirectFBWindow			*window;
    IDirectFBSurface		*surface;
    IDirectFBFont 			*font;
};
static struct AnimationDsc badsc;


static char *testString = "Hello world! This is DirectFB!";
/*********************************************************
 * Data structure and Global variants [End]
 ********************************************************/
 
/*********************************************************
 * Some functions help animation [Begin]
 ********************************************************/

/*********************************************************
 * Some functions help animation [End]
 ********************************************************/

void freeResources()
{
    /* Release the window's surface. */
    if(badsc.surface)
        badsc.surface->Release(badsc.surface);
    /* Release the window. */
    if (badsc.window)
        badsc.window->Release(badsc.window);
    /* Release the layer. */
    if (badsc.layer)
        badsc.layer->Release(badsc.layer);

    badsc.dfb->Release(badsc.dfb);

    return ;
}

static void initResources(int argc, char **argv)
{
    DFBResult ret;
    badsc.window	= NULL;
    badsc.surface	= NULL;
    badsc.dfb	    = NULL;
    IDirectFB *dfb  = NULL;
    DFBWindowDescription	desc;
    DFBDisplayLayerConfig	config;

	/* 初始化DirectFB */
    DirectFBInit(&argc, &argv);
    DirectFBCreate(&dfb);
    if (!dfb) {
        DFB_ERROR("directfb interface is NULL
");
        return ;
    }
    badsc.dfb = dfb;

    /* 初始化 display layer:其中DFB_LAYERID_USING设置为0.*/
    ret = badsc.dfb->GetDisplayLayer(badsc.dfb, DFB_LAYERID_USING, &(badsc.layer));
    if(ret != (DFBResult)DFB_OK) {
        DFB_ERROR("Get layer(%d) failed!
", DFB_LAYERID_USING);
        goto fail;
    } else {
        DFB_DEBUG("Get layer(%d) independently.
", DFB_LAYERID_USING);
    }

    /* 获取display layer的配置,. */
    badsc.layer->GetConfiguration(badsc.layer, &config);

    /* 设置window参数,并创建Window */
    desc.flags   = (DFBWindowDescriptionFlags)(DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS | DWDESC_OPTIONS);
    DFB_NOTICE("Layer Screen width %d, height %d !
", config.width, config.height);
    desc.posx    = WINDOW_TEXT_OFFSET_X_PER * config.width;
    desc.posy    = WINDOW_TEXT_OFFSET_Y_PER * config.height;
    desc.width   = WINDOW_TEXT_LEN_X_PER * config.width;
    desc.height  = WINDOW_TEXT_LEN_Y_PER * config.height;
    desc.caps    = (DFBWindowCapabilities)(DWCAPS_NODECORATION);
    desc.options = (DFBWindowOptions) (DWOP_GHOST);
    ret = badsc.layer->CreateWindow(badsc.layer, &desc, &(badsc.window));
    if(ret != (DFBResult)DFB_OK) {
        DFB_ERROR("Create window failed!
");
        goto fail;
    }

	/* 设置透明度 */
    ret = badsc.window->SetOpacity(badsc.window, 0xFF);
    if(ret != (DFBResult)DFB_OK) {
        DFB_ERROR("SetOpacity failed!
");
        goto fail;
    }

    /* 获取window的surface. */
    ret = badsc.window->GetSurface(badsc.window, &(badsc.surface));
    if(ret != (DFBResult)DFB_OK) {
        DFB_ERROR("SetOpacity failed!
");
        goto fail;
    }

    return ;
fail:
    freeResources();
    return ;
}


/* font init */
static initFont()
{
    DFBFontDescription font_desc;
    font_desc.flags = DFDESC_HEIGHT;
    font_desc.height = 30;
	badsc.dfb->CreateFont(badsc.dfb, DFB_FONT_TYPE_1, &font_desc, &badsc.font);

	return ;
}

static void flipText(IDirectFBFont* font, IDirectFBSurface* surface, char* str) {
    int w = 0, h = 0;

    surface->GetSize(surface, &w, &h);
    surface->Clear(surface, 0x0, 0x0, 0x0, 0xff);
    surface->SetFont(surface, font);
	/* 设置前景颜色 */
    surface->SetColor(surface, 0x00, 0xFF, 0x00, 0xFF);
    surface->DrawString(surface, str, strlen(str), w / 2, h / 2, DSTF_CENTER);
    /* 变换、更新surface buffer */
	surface->Flip(surface, NULL, DSFLIP_WAITFORSYNC);
	return ;
}

static void doMovie()
{
    int ret = 0, i = 0;
    int width = 0, height = 0;
    struct timespec before_draw, after_draw;
    unsigned long elapsed_msec = 0, total_msec = 0;
    IDirectFBSurface *primary = badsc.surface;
    IDirectFBSurface *bg_sfc = NULL;

    DFB_NOTICE("Animation start ...
");
	flipText(badsc.font, primary, testString);
	usleep(2*1000*1000);

out:
    primary->SetColor(primary, 0, 0, 0, 0);
    primary->Clear(primary, 0, 0, 0, 0);
    primary->Flip(primary, NULL, DSFLIP_WAITFORSYNC);
    DFB_NOTICE("Animation exit with black screen...
");

    return ;
}
int main(int argc, char **argv)
{
    DFB_NOTICE("Animation entry.
");
    initResources(argc, argv);
	initFont();
    doMovie();
    freeResources();

    DFB_NOTICE("Animation exit.
");
    return 0;
}


作者:Younger Liu,

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。


原文地址:https://www.cnblogs.com/youngerchina/p/5624447.html