• 通过点阵字库把一个字母/汉字的字模取出来在LCD上显示,这种方式有个缺点:一旦选定了点阵文件后,这个文字的大小就定死了,不能对文字进行缩放
    • 矢量字体
      • 在矢量字体文件中,存的不再是字体具体的像素点阵,而是存储关键点(能够确定字体若干条曲线的关键点)
      • 显示时,使用数学曲线(贝塞尔曲线)进行描绘、连接关键点
      • image.png一个字体可能需要多条曲线构成所谓的“闭合曲线”,然后再在这些闭合曲线的区域内填充颜色
      • 填充闭合曲线的内部空间
    • freetype库就是用来处理矢量字体的

    freetype使用详解(中文):https://wenku.baidu.com/view/2d24be10cc7931b765ce155b.html

    • image.png字体设计师设计出字体的形状,程序员配合将字体的关键点及相对位置提取出来,制作为字库文件
    • image.png各种字库文件
    • image.png
    • 字库文件中存这字体的glyph 字形(关键点)
    • 想象一个文字的显示过程
      • 给定一个文字,’A’ :0x41 可以得到的是文字的编码(确定编码值)
      • 根据编码值去字体文件中找到”glyph” (字体文件是否支持GBK、Unicode等编码,由charmap字符映射表指出)
      • 字体文件中不但含有glyph,还可能还有多个charmap;支持多种编码
      • 设置字体大小
      • 用某些函数把glyph里的点缩放为设置的字体大小
      • 将字体转换为位图点阵(最终还是显示位图)
      • 在LCD上显示出字体
    • 写代码显示文字

      • 初始化:FT_Init_FreeType( &library )
      • 加载字体Face:
        • 从字体文件加载:FT_New_Face(打开字体文件)
        • 从内存加载:FT_New_Memory_Face
        • 从其他源加载:压缩文件、网络等
      • 访问Face单元
      • 设置当前像素大小(字体大小)
        • FT_Set_Char_Size()
        • FT_Set_Pixel_Sizes()
      • 选择charmap(可选,默认为Unicode码)

        1. error = FT_Select_CharMap(
        2. face, /* target face object */
        3. FT_ENCODING_BIG5 ); /* encoding */
      • 根据字符的编码值加载glyph

        • glyph_index = FT_Get_Char_Index( face, charcode ); 转换字符编码成glyph索引
        • 从Face中加载一个glyph

          1. error = FT_Load_Glyph(
          2. face, /* handle to face object */
          3. glyph_index, /* glyph index */
          4. load_flags ); /* load flags, see below */
        • 将glyph转换为位图

          1. error = FT_Render_Glyph(
          2. face->glyph, /* glyph slot */
          3. render_mode ); /* render mode */
      • 变换glyph

        • 移动
        • 旋转
          1. error = FT_Set_Transform(
          2. face, /* target face object */
          3. &matrix, /* pointer to 2x2 matrix matrix矩阵可以用来执行旋转角度 */
          4. &delta ); /* pointer to 2d vector delta偏移位置*/
    • FT_Load_Char( face, text[n], FT_LOAD_RENDER );等效于FT_Load_Glyph、FT_Get_Char_Index 、FT_Get_Load_Glyph三个函数,并且直接得到位图



    • image.png
    • 第一次编译时,使用的是GBK编码,提示错误
    • 第二次编译时,通过VSCode改成UTF-8编码保存,可以编译通过