freetype矢量字体

常用API

1.FT_Init_FreeType函数是FreeType库中的一个函数,其作用是初始化FreeType库,并返回一个指向FT_Library对象的指针。下面是该函数的参数详解:

FT_Error FT_Init_FreeType(FT_Library *alibrary);
  • alibrary: 一个指向FT_Library对象指针的指针,用于存储初始化后的FreeType库对象。在函数调用结束后,该指针指向的对象将包含已初始化的FreeType库信息。如果函数调用成功,返回值为0,否则为一个非零的错误代码。

需要注意的是,FT_Init_FreeType函数不需要任何其他参数,因为它的作用是初始化FreeType库,而库的信息是固定的。该函数将初始化FreeType库,使其准备好用于后续的字体渲染和其他操作。

2.FT_New_Face函数是FreeType库中的一个函数,用于创建一个新的字体面对象,其参数详解如下:

FT_Error FT_New_Face(FT_Library library, const char* filepathname, FT_Long face_index, FT_Face *aface);
  • library: 一个已经初始化的FT_Library对象,指向已经初始化的FreeType库。
  • filepathname: 字体文件的路径和文件名。该参数可以是绝对路径,也可以是相对于当前工作目录的相对路径。注意,该路径必须是一个字符串。
  • face_index: 字体文件中的字体面索引,通常为0。当字体文件包含多个字体时,可以通过指定索引来选择特定的字体面。
  • aface: 一个指向FT_Face对象指针的指针,用于存储新创建的字体面对象。在函数调用结束后,该指针指向的对象将包含有关字体面的信息。如果函数调用成功,返回值为0,否则为一个非零的错误代码。

需要注意的是,FT_New_Face函数将根据提供的字体文件路径和文件名创建一个新的字体面对象,并将其存储在*aface指针中。该函数还可以通过face_index参数指定要选择的字体面。如果要加载字体数据的内存中,可以使用FT_New_Memory_Face函数来代替FT_New_Face函数,并提供字体数据的指针和大小作为参数。

3.FT_Set_Pixel_Sizes函数是FreeType库中的一个函数,用于设置字体面的像素尺寸,其参数详解如下:

FT_Error FT_Set_Pixel_Sizes(FT_Face face, FT_UInt pixel_width, FT_UInt pixel_height);
  • face: 一个已经初始化的FT_Face对象,指向一个已经加载的字体面。
  • pixel_width: 字体面的像素宽度,以像素为单位。通常,应用程序应该选择一个合适的像素大小,以便于在屏幕上或其他设备上正确呈现字体。
  • pixel_height: 字体面的像素高度,以像素为单位。与pixel_width类似,应用程序应该选择一个适当的像素大小以便于正确呈现字体。

需要注意的是,FT_Set_Pixel_Sizes函数将根据提供的像素宽度和高度,将字体面的像素尺寸设置为所需的大小。这对于在屏幕上呈现字体是非常重要的,因为字体必须与其他元素在屏幕上正确协调。函数调用成功返回0,否则返回一个非零错误代码。

显示单个字符并旋转实例代码:

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <sys/ioctl.h>
#include <wchar.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H int fd_fb; //文件描述符
int screen_size; //屏幕总字节数(framebuffer的大小)
struct fb_var_screeninfo var;
unsigned char *fb_base;
unsigned int line_width; //行字节
unsigned int pixel_width; //像素字节 void lcd_put_pixel(int x, int y, unsigned int color) {
unsigned char *add_8 = fb_base + y*line_width + x*pixel_width; //像素点对应的内存地址
unsigned short *add_16;
unsigned int *add_32; unsigned int red, green, blue; add_16 = (unsigned short*)add_8; //8位转换为16位
add_32 = (unsigned int*) add_8; switch(var.bits_per_pixel)
{
case 8:
{
/*代码*/
break;
}
case 16:
{
/* 32位转换为RGB565 */
red = (color >> 16) & 0xff; //保留17-24位
green = (color >> 8) & 0xff; //保留8-16位
blue = (color >> 0) & 0xff; //保留0-8位
color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3); //组合为16bit
*add_16 = color; //像素点对应的地址空间赋值
break;
}
case 32:
{
*add_32 = color;
break;
}
default:
printf("can't surport %dbpp\n", var.bits_per_pixel);
break;
} } 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; //printf("x = %d, y = %d\n", x, y); for ( j = y, q = 0; j < y_max; j++, q++ )
{
for ( i = x, p = 0; i < x_max; i++, p++ )
{
if ( i < 0 || j < 0 ||
i >= var.xres || j >= var.yres )
continue; //image[j][i] |= bitmap->buffer[q * bitmap->width + p];
lcd_put_pixel(i, j, bitmap->buffer[q * bitmap->width + p]);
}
}
} int main(int argc, char **argv)
{
wchar_t *chinese_str = L"樊"; FT_Library library; //freetype库对象
FT_Error error; //错误信息
FT_Face face; //字体面对象
FT_GlyphSlot slot; //关键点
int font_size = 24;
FT_Vector pen; //字符原点
FT_Matrix matrix; /* transformation matrix */
double angle; //角度 if(argc < 3) {
printf("Usage : %s <font_file> <angle> [font_size]\n", argv[0]);
return -1;
} angle = ( 1.0* strtoul(argv[2], NULL, 0) / 360 ) * 3.14159 * 2; //角度转弧度 if(argc == 4) {
font_size = strtoul(argv[3], NULL, 0); //提取数字(字符)
} /* 1.获取framebuffer描述符 */
fd_fb = open("/dev/fb0", O_RDWR); //可读可写
if(fd_fb == -1) {
printf("can not open /dev/fb0\n");
return -1;
} /* 2.获取屏幕可变参数 */
if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)) { //结构体名不是地址,需要取地址
printf("can not get var\n");
return -1;
} /* 3.计算framebuffer空间大小 **/
line_width = var.xres * var.bits_per_pixel / 8;
pixel_width = var.bits_per_pixel / 8;
screen_size = var.xres * var.yres * var.bits_per_pixel / 8; //单位:字节
fb_base = (unsigned char*)mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if(fb_base == (unsigned char*)-1) {
printf("can not mmap\n");
return -1;
} /* 清屏: 全部设为白色 */
memset(fb_base, 0, screen_size); error = FT_Init_FreeType(&library); //freetype库初始化
error = FT_New_Face(library, argv[1], 0, &face); //创建字体面对象
slot = face->glyph; //从字体面对象中获取关键点
error = FT_Set_Pixel_Sizes(face, font_size, 0); //设置字体面像素尺寸 /* 确定座标 */
pen.x = 0;
pen.y = 0; /* 设置矩阵 */
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 ); /* 设置形状 */
FT_Set_Transform( face, &matrix, &pen); error = FT_Load_Char(face, chinese_str[0], FT_LOAD_RENDER); //提取字渲染位图,字符的位图被存在slot->bitmap里 if(error) {
printf("FT_Load_Char error");
return -1;
} draw_bitmap(&slot->bitmap, var.xres/2, var.yres/2); munmap(fb_base , screen_size);
close(fd_fb); return 0;
}

嵌入式Linux—FreeType矢量字体的更多相关文章

  1. 使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果

    前言: Freetype是一个跨平台.开源的字体渲染器,网上很多文章介绍,本人就不啰嗦了.本文重点在于实现文章标题所属的各种效果,不是Freetype的基本使用方法介绍文档,所以对于Freetype不 ...

  2. 嵌入式linux GUI--DirectFB + GTK至尊秘笈

    前言 数年前,曾经开发过一个嵌入式的产品,如今市场依然存在,但由于电子产品的升级换代很快,许多元器件都采购不到了,为了延续产品的生命周期,计划在linux平台上开发新的版本.而在linux上的GUI上 ...

  3. Linux 桌面玩家指南:04. Linux 桌面系统字体配置要略

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  4. Linux 桌面系统字体配置要略

    字体显示效果测试 这一段是为了测试宋体字的显示效果,包括宋体里面自带的英文字体,“This is english,how does it look like?”.这一行是小字.后面几个字是加粗的宋体. ...

  5. 基于bootsplash的嵌入式linux启动画面定制

    来源: ChinaUnix博客 作者: ChinaUnix博客 发布时间:2007-01-01 16:29:00 摘 要:在基于linux的嵌入式仿真平台研发中,利用开源工具bootsplash能够定 ...

  6. 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)

    嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...

  7. 韦东山 嵌入式linux教程 笔记

    @ 目录 资源链接 一.常用命令 二.shell 三.如何更改PATH? 四.路径 五.vi编辑器 六.进阶命令 七.NAT配置网络 (第2篇-P34) 八.开发板挂载 Ubuntu 的 NFS 目录 ...

  8. 嵌入式Linux Qt移植详细过程

    嵌入式Linux下的Qt移植详细过程 开发说明 前段时间需要用开发板写一个下位机程序,是基于Linux系统,就想着用Qt来写,于是上网找教程看如何移植到开发板上.由于我不熟悉嵌入式Linux,加上网上 ...

  9. 嵌入式 Linux下永久生效环境变量bashrc

    嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...

  10. WPF自定义控件与样式(1)-矢量字体图标(iconfont)

    一.图标字体 图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap.但在C/S程序中使用还不多,字体图标其实就是把矢量图形打包到字体文件里,就像使用一般 ...

随机推荐

  1. QMetaObject::connectSlotsByName: No matching signal for xxx

    问题描述 这个问题是没有与 xxx 这个槽函数匹配的信号,但是我做了 QMetaObject::connectSlotsByName(this);, 自动连接.并且确保了函数名和信号名是没有错误的,还 ...

  2. javaweb string

    今天遇到一个跨域请求jsonp格式报错,其原因是其中一个参数过从我方数据库取出就带有换行格式的,类似于: 这条数据竟然自带格式换行. 而我们现常用的trim()只能去掉字符串的头部和尾部的空格, 而要 ...

  3. Referenced file contains errors (http://mybatis.org/dtd/mybatis-3-config.dtd). For more information, right click on the message in the Problems View and select "Show Details..."

    mybatis配置文件报错Referenced file contains errors mybatis的配置文件报错 The errors below were detected when vali ...

  4. 程序员面试干货:漫谈计算机网络:数据链路层 ----- 数据链路路在何方? --从点对点数据传输 到 "广泛撒网,重点捕获"的局域网

    面试答不上?计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽时间和我一起多学学它 深入浅出,用你的空闲时间来探索计算机网络的硬核知识! 博主的上篇连载文章<初识图像处理技术> 图像 ...

  5. pycharm 2021.2.1专业版破解

    1.网址:https://gitee.com/pengzhile/ide-eval-resetter 2.点击下载.下载后直接丢进pycharm中. 3.勾选.重启 .查看

  6. Windows下使用VSCode搭建IDA Python脚本开发环境

    由于本人是VSCode的重度沉迷用户,需要写代码时总会想起这个软件,因此选择在VSCode中搭建IDA Python的开发环境 本文适用的环境如下: 1.操作系统 windows 2.Python3 ...

  7. 如何使用Java获取货币符号?

    1. 前言 最近做了一个支付相关的需求,要求在收银台页面显示商品的价格时带上货币符号¥,类似下图中的格式: 最初我是用的下面这样的代码: System.out.println(Currency.get ...

  8. MySQL转义字符+存储过程的使用

    MySQL中大于,大于等于,小于,小于等于的转义写法 一.左边就是原来的符号,右边就是在mybatis中代替的符号 二.如何通过mysql的存储过程创建虚拟表(临时表),并插入1000条数据 这些表通 ...

  9. Golang Gorm 封装 分页查询 Where Order 查询

    说说为什么写Gorm,因为公司新项目需要,研究了下Go下的gorm.对于一个项目首先考虑的问题,就是封装一些常用的工具方法,例如多参数查询 where or Like 还有order by Limit ...

  10. cs231n__4.2 神经网络 Neural networks

    CS231n 学习笔记 4.2 神经网络 Neural networks 之前我们已经使用了 很多线性分类函数 现在我们不用单变换的: 我们首先有线性层,然后有这个非线性计算,继而在顶层再加入另一个线 ...