zoukankan      html  css  js  c++  java
  • DirectFB 之 字体显示

          通过本文,可以简单地了解directfb字体内部运行机制。

    简介

          SetFont函数,是每次写字体前必须调用的一个函数,否则directfb程序将会报错。这个函数是将某种字体与某个surface相关联。

          GetAscender与GetHeight调用该函数可以有效的确定字体的ascend和fontheight,这两个函数函数有利于我们的排版。



    GetStringBreak (
     	IDirectFBFont   *	thiz,
     	const char	    *	text,
     	int	 	            bytes,
     	int	 	            max_width,
     	int	 	        *	ret_width,
     	int	 	        *	ret_str_length,
     	const char	 	**	ret_next_line
    );
          这个函数同样对我们很有用了,它可以确定某一行有多少个字符,该行是否写满,如果没有写满的话, ret_next_line返回下一行第一个字符指针。
          ret_str_length 返回字母个数,或者汉字的个数,你不能直接在DrawString()函数中直接使用这个值,否则有可能出错,解决的办法如下:假如你能确定你字符的编码方式的话,假如是ascii编码,你可以直接使用该值,如果是Unicode编码,你需要做*2操作,最直接的办法是 假如ret_next_line不为空的话,(ret_next_line-text)*sizeof(char)这个值直接可以用了,注意,一定是不为空时才能这样。
          通过这三个函数,你可以轻松的实现界面的字体设置,排版,换行功能。


    DFBResult DrawString ( 
       IDirectFBSurface    *  thiz,  
       const char    *  text,  
       int      bytes,  
       int      x,  
       int      y,  
       DFBSurfaceTextFlags      flags  
    ); 
    
          在指定位置根据指定的颜色,按照指定的对其方式flags画出某一个字符串text

    示例

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <directfb.h>
    
    static IDirectFB *dfb = NULL;
    static IDirectFBSurface *primary = NULL;
    
    static int screen_width = 0;
    static int screen_height = 0;
    
    static IDirectFBFont *font_decker = NULL;
    static IDirectFBFont *font_cuprum = NULL;
    static IDirectFBFont *font_monaco = NULL;
    static char *text1 = "DirectFB rulez! - decker.ttf";
    static char *text2 = "DirectFB rulez! - cuprum.otf";
    static char *text3 = "DirectFB rulez! - monaco.ttf";
    
    #define DFBCHECK(x...) {                                        
        DFBResult err = x;                                          
        if(err != DFB_OK) {                                         
            fprintf(stderr, "%s <%d>:
    	", __FILE__, __LINE__);    
            DirectFBErrorFatal(#x, err);                            
        }                                                           
    }
    
    int main(int argc, char **argv) {
        DFBFontDescription font_dsc;
        DFBSurfaceDescription dsc;
    
        DirectFBInit(&argc, &argv);
        DirectFBCreate(&dfb);
        dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN);
        dsc.flags = DSDESC_CAPS;
        dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
    
        dfb->CreateSurface(dfb, &dsc, &primary);
        primary->GetSize(primary, &screen_width, &screen_height);
    
        font_dsc.flags = DFDESC_HEIGHT;
        font_dsc.height = 48;
    
        DFBCHECK(dfb->CreateFont(dfb, "./data/decker.ttf", &font_dsc, &font_decker));
        DFBCHECK(dfb->CreateFont(dfb, "./data/Cuprum.otf", &font_dsc, &font_cuprum));
        DFBCHECK(dfb->CreateFont(dfb, "./data/Monaco.ttf", &font_dsc, &font_monaco));
    
        primary->SetColor(primary, 0x0, 0x0, 0x0, 0xff);
        primary->FillRectangle(primary, 0, 0, screen_width, screen_height);
        primary->SetColor(primary, 0x80, 0x0, 0x20, 0xff);
    
    
        primary->SetFont(primary, font_decker);
        primary->DrawString(primary, text1, -1, 30, 100, DSTF_LEFT);
    
        primary->SetFont(primary, font_cuprum);
        primary->DrawString(primary, text2, -1, 30, 200, DSTF_LEFT);
        
        primary->SetFont(primary, font_monaco);
        primary->DrawString(primary, text3, -1, 30, 300, DSTF_LEFT);
    
        primary->Flip(primary, NULL, 0);
        sleep(10);
    
        font_decker->Release(font_decker);
        font_cuprum->Release(font_cuprum);
        font_monaco->Release(font_monaco);
        primary->Release(primary);
        dfb->Release(dfb);
    
        return 0;
    }


  • 相关阅读:
    js中剩余参数
    css中 @mixin的使用
    前端Vue中常用rules校验规则
    vue 运行时报错: Cannot assign to read only property 'exports' of object 'Object'
    webpack 常用的loader
    二维码图片合成 ----合成图片以便微信长按保存(移动端)
    VUE中引入第三方JS
    小程序开发者工具--快捷键
    小程序注意事项
    webpack+ES6+less 开发环境搭建
  • 原文地址:https://www.cnblogs.com/youngerchina/p/5624448.html
Copyright © 2011-2022 走看看