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. 工程坐标转换方法C#代码实现

    目录 1. 前言 2. 计算总体框架 3. C#代码实现 3.1 整体类的构建 3.2 椭球参数赋值 3.3 转换1.3(大地经纬度坐标与地心地固坐标的转换) 3.4 投影转换 3.5 转换2的实现( ...

  2. python重要内置模块

    目录 包的概念 包的具体使用 编程思想的转变 常用内置模块之collections模块 (收集) 常用内置模块之time模块 (时间) 常用内置模块之random模块 (随机) os模块 sys模块 ...

  3. 更强大的远程开发,Remote Tunnels 正式发布预览版!

    Visual Studio Code 的核心是一个代码编辑器,它通过我们的远程开发经验与其他环境集成,变得更加强大和灵活: 你可能没有想到,但 VS Code 有一个内置的命令行界面(CLI),可以让 ...

  4. 【Java】二分查找标准代码

    太菜了..写不出正确的... 干脆放一个标准代码,之后参考 boolean BinarySearch(int[] m){ int l=0,r=m.length-1;//减1相当于数组两头(lr都能指到 ...

  5. 深入理解Whitelabel Error Page底层源码

    深入理解Whitelabel Error Page底层源码 (一)服务器请求处理错误则转发请求url StandardHostValve的invoke()方法将根据请求的url选择正确的Context ...

  6. 发送http2请求

    有时服务器会检测http协议版本,有http/1.1和h2,requests发送的是http1.1的请求 # pip install httpx client = httpx.Client(http2 ...

  7. MongoDB 索引原理与索引优化

    转载请注明出处: 1.MongoDB索引 索引通常能够极大的提高查询的效率, 如果没有索引, MongoDB 在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率 ...

  8. snprintf拼接字符串

    例如编辑一个txt文档,不断将字符输入,最终形成一个长句子.可以看成是字符串的不断拼接.snprintf函数具有这个功能. #include<stdio.h> void main(void ...

  9. vue3学习第一天

    第一章 Options API与Composition API 重写双向绑定 vue2 基于Object.defineProperty()实现 vue3 基于Proxy proxy与Object.de ...

  10. scratch图形化编程教程

    1. scratch软件 市面上类似于scratch这种图形化编程的软件非常多,各个品牌的都有,而且每个品牌之后的风格.界面布局也是不同的,所以我会简单的列举一些对应软件. scratch3.0 优点 ...