资源简介

本人在工作实践中写的一个汉字显示程序,在linux平台下,利用frambuffer显示设备来显示。用freetype2库来显示矢量汉字。程序带有汉字对齐、加粗、自动换行等功能。对于freetype2和frambuffer入门很有帮助。本程序已经经过试验验证。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_OUTLINE_H

typedef struct fbdev
{
    int fdfd; //open “dev/fb0“
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    long int screensize;
    char *map_fb; 
}FBDEV;
FBDEV fr_dev;

void init_dev(FBDEV *dev)
{
    FBDEV *fr_dev=dev;
    fr_dev->fdfd=open(“/dev/fb0“O_RDWR);
    printf(“the framebuffer device was opended successfully.\n“);
    ioctl(fr_dev->fdfdFBIOGET_FSCREENINFO&(fr_dev->finfo)); //获取 固定参数
    ioctl(fr_dev->fdfdFBIOGET_VSCREENINFO&(fr_dev->vinfo)); //获取可变参数
    fr_dev->screensize=fr_dev->vinfo.xres*fr_dev->vinfo.yres*fr_dev->vinfo.bits_per_pixel/8; 
    fr_dev->map_fb=(char *)mmap(NULLfr_dev->screensizePROT_READ|PROT_WRITEMAP_SHAREDfr_dev->fdfd0);
    printf(“init_dev successfully.\n“);
}

void clean_lcd()
{
int i;
for(i=0;i *((unsigned short int*)(fr_dev.map_fb+i)) = 255<<11|255<<5|255;
}

void draw_dot(FBDEV *devint xint y) //(x.y) 是坐标
{
    FBDEV *fr_dev=dev;
    int *xx=&x;
    int *yy=&y;    
    long int location=0;
    location=location=(*xx+fr_dev->vinfo.xoffset)*(fr_dev->vinfo.bits_per_pixel/8)+(*yy+fr_dev->vinfo.yoffset)*fr_dev->finfo.line_length;
    int b=0;
    int g=0;
    int r=0;
    unsigned short int t=r<<11|g<<5|b;
    *((unsigned short int *)(fr_dev->map_fb+location))=t;
}

FT_Face  face;
FT_Library    library;
int size;
FT_UInt       now_index;
FT_UInt       old_index;

void freetype_init()
{
    //FT_Library    library;
    //FT_Face       face;
    int err = FT_Init_FreeType(&library);
    if(err)
    {
        printf(“Init library failed\n“);
        return;
    }

    err = FT_New_Face(library“simsun.ttc“0&face);
    if(err == FT_Err_Unknown_File_Format)
    {
        printf(“the font is not supported\n“);
        return;
    }
    else if(err)
    {
        printf(“the font file can‘t open\n“);
        return;   
    }
}

void freetype_draw(wchar_t chint xint yint xwidthint xheight)
{
FT_Vector  delta;
now_index = FT_Get_Char_Index(facech);
    int err = FT_Load_Glyph(faceFT_Get_Char_Index(facech)FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP);
    if(err)
    {
        printf(“FT_Load_Glyph failed\n“);
        return;
    }
    FT_Outline_EmboldenXY(&face->glyph->outline xwidth*1.50);
    FT_Glyph glyph;
    err = FT_Get_Glyph(face->glyph&glyph);
    if(err)
    {
        printf(“FT_Get_Glyph failed\n“);
        return;
    }
    FT_Render_Glyph(face->glyph FT_RENDER_MODE_NORMAL); 
    FT_Glyph_To_Bitmap(&glyphFT_RENDER_MODE_NORMAL01);
    FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph;
    FT_Bitmap bitmap=bitmap_glyph->bitmap;
    


FT_BBox  bbox;
FT_Glyph_Get_CBox(glyph3&bbox);

FT_Get_Kerning(face old_index now_indexFT_KERNING_DEFAULT&delta);
x += delta.x>>6;

FT_Glyph_Metr

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5115  2012-08-23 18:00  ft_word\freetype_word.c

     文件      25700  2012-08-23 18:00  ft_word\main.o

     文件        281  2012-08-23 18:00  ft_word\Makefile

     文件      27968  2012-08-23 18:00  ft_word\test

    I..D...         0  2012-08-23 16:59  ft_word

----------- ---------  ---------- -----  ----

                59064                    5


评论

共有 条评论