FreeType 矢量字体 测试移植(1)

之前有做过 ascii 和汉字库的字体点阵在lcd上显示的例子,都是按照指定大小的字库的点阵来显示的,所以一但选定了字体文件后,就固定了大小,不可变化,当然也可以存放各种 大小的字体文件,但这样的话就需要很多的空间,这种方法显然不好使,所以就引入了失量字体,关于字体的特点就不啰嗦了。可以去网上搜到很多说明。下面我们一步一步的来做实验测试了解失量字体的用法,先在PC机上测试,然后再移植到开发板上用lcd显示。

  一、首先我们要去获得失量字体的源码和一些文档,https://www.freetype.org/freetype2/docs/documentation.html 这里就是官网。然后按照他的文档来简单了解一下,同时还提供了一个C例子,分析例子,修改后可以先在PC机上测试。

  二、得到源码后,解压配置安装。列出步骤和命令。注意这是在PC机上运行的命令如果要在开发板上运行,要用交叉编译 还有配置也有不同

    ./configure    配置

    make      编译

    sudo make install  安装

  三、把源码例子拿过来编译

    gcc -o example example.c -I /usr/local/include/freetype2/ -lfreetype -lm

    /* -I /usr/local/include/freetype2/ 指定头文件目录       -lfreetype 指定库类型        -lm 指定数学库 */

    /* 这是大i                                                                     这是小L                               小L */

    如果没加会出错,不信可以先不加试一试然后一个一个加试下,这是方法,为什么我也不知道

    ./example ./simsun.ttc abc    执行就会打印出字体文件在终端上,但是看不到,因为源码里的设置太大了,要改小一些才可以

    在执行时需要一个字体文件,可以从C:\Windows\Fonts里找一个复制过去

    下面贴出一段在PC上显示代码 用FreeType官方例子稍改就可以了。

/* example1.c                                                      */
/*                                                                 */
/* This small program shows how to print a rotated string with the */
/* FreeType 2 library.                                             */

#include <stdio.h>
#include <string.h>
#include <math.h>

#include <ft2build.h>
#include FT_FREETYPE_H

/* 这里修改 原来是680 480 太大 */
#define WIDTH   80
#define HEIGHT  80

/* origin is the upper left corner */
unsigned char image[HEIGHT][WIDTH];

/* Replace this function with something useful. */

void
draw_bitmap( FT_Bitmap* bitmap, FT_Int x, FT_Int y)
{
    FT_Int  i, j, p, q;
    FT_Int  x_max = x + bitmap->width;
    FT_Int  y_max = y + bitmap->rows;

    /* for simplicity, we assume that `bitmap->pixel_mode‘ */
    /* is `FT_PIXEL_MODE_GRAY‘ (i.e., not a bitmap font)   */

    for ( i = x, p = 0; i < x_max; i++, p++ )
    {
        for ( j = y, q = 0; j < y_max; j++, q++ )
        {
          if ( i < 0 || j < 0 || i >= WIDTH || j >= HEIGHT )
            continue;

          image[j][i] |= bitmap->buffer[q * bitmap->width + p];
        }
    }
}

void show_image( void )
{
  int  i, j;

  for ( i = 0; i < HEIGHT; i++ )
  {
    for ( j = 0; j < WIDTH; j++ )
      putchar( image[i][j] == 0 ? ‘ ‘
                                : image[i][j] < 128 ? ‘+‘
                                                    : ‘*‘ );
    putchar( ‘\n‘ );
  }
}

int
main( int argc, char**  argv )
{
    FT_Library    library;
    FT_Face       face;

    FT_GlyphSlot  slot;
    FT_Matrix     matrix;                 /* transformation matrix */
    FT_Vector     pen;                    /* untransformed origin  */
    FT_Error      error;

    char*         filename;
    char*         text;

    double        angle;
    int           target_height;
    int           n, num_chars;

    if ( argc != 3 )
    {
    fprintf ( stderr, "usage: %s font sample-text\n", argv[0] );
    exit( 1 );
    }

    filename      = argv[1];                           /* first argument     */
    text          = argv[2];                           /* second argument    */
    num_chars     = strlen( text );
    /* 角度设为0不旋转 */
    angle         = ( 0.0 / 360 ) * 3.14159 * 2;      /* use 25 degrees     */
    target_height = HEIGHT;

    error = FT_Init_FreeType( &library );              /* initialize library */
    /* error handling omitted */

    error = FT_New_Face( library, filename, 0, &face );/* create face object */
    /* error handling omitted */
#if 0
    /* use 50pt at 100dpi */
    error = FT_Set_Char_Size( face, 50 * 64, 0,
                            100, 0 );                /* set character size */
    /* error handling omitted */
#else
    error = FT_Set_Pixel_Sizes(
              face,   /* handle to face object */
              0,      /* pixel_width           */
              16 );   /* pixel_height          */
#endif
    /* cmap selection omitted;                                        */
    /* for simplicity we assume that the font contains a Unicode cmap */

    slot = face->glyph;

    /* set up matrix */
    matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
    matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
    matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
    matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );

    /* the pen position in 26.6 cartesian space coordinates; */
    /* start at (300,200) relative to the upper left corner  */
    /* 这里也要改 因为上面改了 */
    pen.x = 0 * 64;
    pen.y = ( target_height - 40 ) * 64;

    for ( n = 0; n < num_chars; n++ )
    {
    /* set transformation */
    FT_Set_Transform( face, &matrix, &pen );

    /* load glyph image into the slot (erase previous one) */
    error = FT_Load_Char( face, text[n], FT_LOAD_RENDER );
    if ( error )
      continue;                 /* ignore errors */

    /* now, draw to our target surface (convert position) */
    draw_bitmap( &slot->bitmap,
                 slot->bitmap_left,
                 target_height - slot->bitmap_top );

    /* increment pen position */
    pen.x += slot->advance.x;
    pen.y += slot->advance.y;
    }

    show_image();

    FT_Done_Face    ( face );
    FT_Done_FreeType( library );

    return 0;
    }

/* EOF */

  上面显示了英文字符,通过执行程序时传进去的 abc 如果我们想显示中文怎么办呢,我们在源码里先定义一个字符串,再显示字符串 这里有一个地方要注意,字符串要以宽字符的方式定义保存,不能以 char *str = "矢量字体"; 这样的方式定义,因为中文是用二个字节保存的 英文是一个字节,如果一个字符串里又有中文又有英文就不好处理了。因此又引入了“宽字符” 宽字符怎么用,老办法 搜。wchar_t *str = L"矢量字体"; 这样定义 同时还有一个头文件要包含进去 #include <wchar.h> ,下面列出一个例子,同样是在上面的基础上改的。

  在这个例子里会出现编译时 提示无法转换字符集 error:converting to execution character set: Invalid or incomplete multibyte or wide character

  在指定字符输入输出字符集编译 gcc  -finput-charset=GBK -fexec-charset=UTF-8 -o example example.c -I /usr/local/include/freetype2/ -lfreetype -lm

这里列出源码

/* example1.c                                                      */
/*                                                                 */
/* This small program shows how to print a rotated string with the */
/* FreeType 2 library.                                             */

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <wchar.h>

#include <ft2build.h>
#include FT_FREETYPE_H

/* 这里修改 原来是680 480 太大 */
#define WIDTH   100
#define HEIGHT  100

/* origin is the upper left corner */
unsigned char image[HEIGHT][WIDTH];

/* Replace this function with something useful. */

void
draw_bitmap( FT_Bitmap* bitmap, FT_Int x, FT_Int y)
{
    FT_Int  i, j, p, q;
    FT_Int  x_max = x + bitmap->width;
    FT_Int  y_max = y + bitmap->rows;

    /* for simplicity, we assume that `bitmap->pixel_mode‘ */
    /* is `FT_PIXEL_MODE_GRAY‘ (i.e., not a bitmap font)   */

    for ( i = x, p = 0; i < x_max; i++, p++ )
    {
        for ( j = y, q = 0; j < y_max; j++, q++ )
        {
          if ( i < 0 || j < 0 || i >= WIDTH || j >= HEIGHT )
            continue;

          image[j][i] |= bitmap->buffer[q * bitmap->width + p];
        }
    }
}

void show_image( void )
{
  int  i, j;

  for ( i = 0; i < HEIGHT; i++ )
  {
    for ( j = 0; j < WIDTH; j++ )
      putchar( image[i][j] == 0 ? ‘ ‘
                                : image[i][j] < 128 ? ‘+‘
                                                    : ‘*‘ );
    putchar( ‘\n‘ );
  }
}

int
main( int argc, char**  argv )
{
    FT_Library    library;
    FT_Face       face;

    FT_GlyphSlot  slot;
    FT_Matrix     matrix;                 /* transformation matrix */
    FT_Vector     pen;                    /* untransformed origin  */
    FT_Error      error;

    char*         filename;
    char*         text;

    double        angle;
    int           target_height;
    int           n, num_chars;

    wchar_t *chinese_str = L"矢量字体";

    /* 把参数改为2个 */
    if ( argc != 2 )
    {
        fprintf ( stderr, "usage: %s font \n", argv[0] );
        exit( 1 );
    }
    /* 注释掉这两行 */
    filename      = argv[1];                           /* first argument     */
//    text          = argv[2];                           /* second argument    */
//    num_chars     = strlen( text );
    /* 角度设为0不旋转 */
    angle         = ( 0.0 / 360 ) * 3.14159 * 2;      /* use 25 degrees     */
    target_height = HEIGHT;

    error = FT_Init_FreeType( &library );              /* initialize library */
    /* error handling omitted */

    error = FT_New_Face( library, filename, 0, &face );/* create face object */
    /* error handling omitted */
#if 0
    /* use 50pt at 100dpi */
    error = FT_Set_Char_Size( face, 50 * 64, 0,
                            100, 0 );                /* set character size */
    /* error handling omitted */
#else
    /* 直接用这个函数设字像素大小 */
    error = FT_Set_Pixel_Sizes(
              face,   /* handle to face object */
              0,      /* pixel_width           */
              24 );   /* pixel_height          */
#endif
    /* cmap selection omitted;                                        */
    /* for simplicity we assume that the font contains a Unicode cmap */

    slot = face->glyph;

    /* set up matrix */
    matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
    matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
    matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
    matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );

    /* the pen position in 26.6 cartesian space coordinates; */
    /* start at (300,200) relative to the upper left corner  */
    /* 这里也要改 因为上面改了 */
    pen.x = 10 * 64;
    pen.y = ( target_height - 40 ) * 64;
    /* man wcslen man strlen 去找到用法 得到字符串长度 */
    for ( n = 0; n < wcslen(chinese_str); n++ )
    {
    /* set transformation */
    FT_Set_Transform( face, &matrix, &pen );

    /* load glyph image into the slot (erase previous one) */
    /* 直接显示字符串不使用传入参数 */
    error = FT_Load_Char( face, chinese_str[n], FT_LOAD_RENDER );
    if ( error )
      continue;                 /* ignore errors */

    /* now, draw to our target surface (convert position) */
    draw_bitmap( &slot->bitmap,
                 slot->bitmap_left,
                 target_height - slot->bitmap_top );

    /* increment pen position */
    pen.x += slot->advance.x;
    pen.y += slot->advance.y;
    }

    show_image();

    FT_Done_Face    ( face );
    FT_Done_FreeType( library );

    return 0;
    }

/* EOF */

通过上面的测试,下面总结一下freetype字体的用法,和一些注意事项。参考官方文档。后面会慢慢增加对FreeType的测试代码。

原文地址:https://www.cnblogs.com/x2i0e19linux/p/11774115.html

时间: 2024-10-11 01:34:48

FreeType 矢量字体 测试移植(1)的相关文章

freetype显示矢量字体 -- 在LCD上测试

配置交叉编译工具连我的环境变量:/home/usr/local/arm/4.3.2/bin 解压freetype-2.4.10.tar.bz2 进入配置交叉编译工具:./configure --host=arm-linux编译  make 暂时安装到当前目录下tmp目录make DESTDIR=$PWD/tmp install 拷贝库文件到交叉编译器里:把tmp/usr/local/lib/*  复制到 /home/usr/local/arm/4.3.2/arm-none-linux-gnuea

在开发板上实现矢量字体显示

对于开发板实现显示矢量字体,同样PC机一样,我需要字体文件,这里选择simsun.ttc(新宋体). 1)初始化库  FT_Init_FreeType( &library ); /* initialize library */ 2)create face object  FT_New_Face( library, argv[1], 0, &face ); 3)设置字体大小 FT_Set_Pixel_Sizes(face, 24, 0); 4)设置坐标 pen.x = 0 * 64; pen

Font Awesome 4.0.3 提供了369个网页常用的矢量字体图标

Font Awesome 为您提供了一套可缩放的字体矢量图标,可以快速自定义图标的大小,颜色,阴影,这些都可以通过CSS来实现,无需任何的JS代码哦. 一,主要特点如下: 1,一个字体,369个图标 2,无需要使用JavaScript 3,通过CSS自定义图标的大小,颜色,阴影 4,用户界面友好 5,支持 Internet Explorer 7 浏览器 6,能够在 Retina 屏幕完美呈现 7,和其它图标字体不同,兼容屏幕阅读器 8,可扩展性强 9,文档完善 10,免费 二,图标类型下面简单罗

UWP 矢量字体图标(iconfont)使用

本文使用 阿里巴巴开源字体: 选择矢量字体图标: 查看或编辑 Unicode编码 或字体名称 下载到本地,添加到uwp项目 代码中写法 Text:Unicode编码 FontFamily:文件路径#字体名称 效果图: 参考资料 http://www.alessiosimoni.com/custom-fonts-in-windows-10-uwp/ http://www.cnblogs.com/anding/p/4961215.html

矢量字体图标

1.首先使用 iconfont.cn在线生成矢量图标 2.然后,将生成的矢量字体下载到本地,使用font-face在网页上定义该矢量图标对应的字体,最后引用该自定义的字体. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>矢量字体图标应用</title> <style> /*font-face

windows矢量字体点阵数据的提取(转)

源:windows矢量字体点阵数据的提取 1.提取原理 在windows系统当中提取矢量字体的字模有很多方法,下面介绍一种利用GetGlyphOutline来实现字模点数数据的提取. GetGlyphOutline是windows系统的API函数,利用这个函数,可以方便快捷提取矢量字体字符点阵数据,并且可以很好的支持从文本文件中读取字符.面对用大量字符数据输入时,获取点阵数据所需要的时间量也是很少. GetGlyphOutline函数声明如下: DWORD GetGlyphOutline( HD

基于svg生成iconfont矢量字体图标

对于前端开发,图标是前端页面不可缺少的元素,他能更让前端页面更加丰富.前端页面的初期都是使用图片,对于小的图标使用图片拼成雪碧图不仅影响前端开发的效率,而且图片文件相对较大也会影响网页加载的速度.ionfont字体图标相较于图片他的优势就是文件大小极小,几百个图标才几十上百kb,但是换成图片可能已经有几mb了,其次制作简单,只需UI提供svg图标可以通过工具自动生成字体文件,或者网上有很多免费的图标库可以自动生成矢量字体文件,例如阿里巴巴矢量字体库.但是iconfont字体图标因为他就像字体一样

freetype显示矢量字体 -- 在PC上测试初步使用

解压freetype-2.4.10.tar.bz2, 重命名为freetype-2.4.10_pc放入01th_pc目录下. 进入目录配置:./configure 编译:make 安装:sudo make install 编译应用程序:example.cgcc -o example1 example1.c -I /usr/local/include/freetype2 -lfreetype -lmgcc编译参数设置           -I     +头文件目录             库文件 

如何应用Font Awesome矢量字体图标

Font Awesome 是一套专门为 Twitter Boostrap 设计的图标字体库.这套图标字体集几乎囊括了网页中可能用到的所有图标,除了包括 Twitter Boostrap 的默认图标外,还有社交网络图标.Web 应用程序图标和编辑器图标等等,可以免费用于商业项目. 可以到官方站点查看更详细的信息和使用样例. 下面仅记录使用步骤: 1.到官网上下载最新版本的Font Awesome. 2.解压文件,将其中的css和fonts文件夹拷贝到项目中,其中css文件夹中有两个css文件(fo