FreeType简介及在vs2010的编译使用
FreeType库是一个开源、高质量、可扩展、可定制、可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1、CID、CFF、Windows FON/FNT、X11 PCF等。
FreeType有两个License,一个是BSD-stype,它兼容GPLv3;另一个是GPLv2,在使用时可以根据需要选择其中一种。
FreeType特点:(1)、它使得客户应用程序可以方便地访问字体文件,无论字体文件存储在哪里,并且与字体格式无关;(2)、能方便地提取全局字体数据,这些数据普遍存在于一般的字体格式中(例如,全局度量标准、字符编码/字符映射表等);(3)、能方便地提取某个字符的字形数据(例如,度量标准、图像、名字等其它任何数据);(4)、具备访问字体格式特定的功能(例如,SFNT表、多重控制、OpenType轮廓表等)。
FreeType字体引擎执行流程:首先需要初始化FreeType库,然后依次根据字符的编码处理一个字符,把它转化为点阵的位图信息,最后根据字符的信息,在相应的地方把它显示出来。
字体是一组可以被显示和打印的多样的字符映像,在单个字体中共享一些共有的特性,包括外表、风格、衬线等。
字符映像叫做字形,根据书写、用法和上下文,单个字符能够有多个不同的映像,即多个字形。多个字符也可以有一个字形(例如Roman)。
每个字符映像都关联多种度量,被用来在渲染文本时,描述如何放置和管理它们。
字体轮廓的源格式是一组封闭的路径,叫做轮廓线。每个轮廓线划定字体的外部或内部区域,它们可以是线段或是Bezier曲线。
每个字形都有叫跨距和步进的距离,它们的定义是常量,但是它们的值依赖布局,同样的字形可以用来渲染横向或纵向文字。
字距调整指用来在一个文本串中调整重合字形的相对位置的特定信息。
FreeType轮廓:一个轮廓是2D平面上一系列封闭的轮廓线。每个轮廓线由一系列线段和Bezier弧组成,根据文件格式不同,曲线可以是二次和三次多项式,前者叫quadratic或conic弧,它们在TrueType格式中用到,后者叫cubic弧,多数用于Type1格式。每条弧由一系列起点、终点和控制点描述,轮廓的每个点有一个特定的标记,表示它用来描述一个线段还是一条弧。
边界框(bbox)是一个完全包含指定轮廓的矩形,所要的是最小的边界框。
控制框(cbox)是一个包含轮廓所有点的最小矩形,很明显,它包含bbox,通常它们是一样的。
一个位图和像素图通过一个叫FT_Bitmap的单一结构描述。
FreeType可以看作是一组组件,每个组件负责一部分任务,它们包括:(1)、客户应用程序一般会调用FT高层API,它的功能都在一个组件中,叫做基础层;(2)、根据上下文和环境,基础层会调用一个或多个模块进行工作,大多数情况下,客户应用程序不知道使用哪个模块;(3)、基础层还包含一组例程来进行一些共通处理,例如内存分配、列表处理、io流解析、固定点计算等,这些函数可以被模块随意调用,它们形成了一个底层基础API。
虽然FreeType是使用ANSI C编写,但是采用面向对象的思想,使这个库非常容易扩展,因此,有一些代码规约:(1)、每个对象类型/类都有一个对应的结构类型和一个对应的结构指针类型,后者称为类型/类的句柄类型;(2)、类继承通过将基类包装到一个新类中实现。
在FreeType中有若干种模块:(1)、渲染模块:用来管理可缩放的字形映像;(2)、字体驱动模块:用来支持一种或多种特定字体格式;(3)、助手模块:用来处理一些共享代码,通常被多个字体驱动,甚至是其它模块使用;(4)、autohinter模块:当一个字体驱动没有提供自己的hint引擎时,它可以在字形装载时处理各自的字形轮廓。
如果我们只希望对特定字体做简单的事情,则可以对FreeType进行裁决,有两种方式:(1)、修改/modules.cfg文件;(2)、修改/include/config/ftmodule.h文件。
下载的源代码中freetype-2.5.5,/builds/windows/vc2010目录下有配置好的vs2010工程,打开编译,将会在/objs/vc2010,Win32或x64目录里生成相应的freetype255.lib和freetype255d.lib相应静态库。由于后期可能需要对FreeType进行裁决,所以这里通过源码自己编译下:
1. 从https://sourceforge.net/projects/freetype/files/下载最新的稳定版本ft255,解压缩;
2. 新建一个libFreeType静态库工程,将/include和/src下的.h和.c文件加入到此工程中,除/src/tools目录下的.h、.c文件,/src下的其它大部分模块,每个模块仅添加一个模块名的.c文件即可,如autofit模块,仅添加autofit.h即可,因为此文件中include了此模块中相应的.c文件,还有另外一些.c文件需添加,ftbitmap.c、ftglyph.c、ftinit.c、ftsystem.c;
3. 将/include目录添加到C/C++ --> General --> Additional Include Directories;
4. 将FT2_BUILD_LIBRARY添加到C/C++ --> Preprocessor --> Preprocessor Definitions;
5. 新建一个FreeTypetest控制台工程,验证生成库的正确性,各个文件内容为(测试代码来自于http://www.freetype.org/freetype2/docs/tutorial/step1.html):
stdafx.h:
#pragma once#include "targetver.h"#include <stdio.h>//It contains various macro declarations that are later used to #include the
//appropriate public FreeType 2 header files.
#include "ft2build.h"
//FT_FREETYPE_H is a special macro defined in file ftheader.h. It contains some
//installation-specific macros to name other public header files of the FreeType 2 API.
#include FT_FREETYPE_H#include "ftglyph.h"
stdafx.cpp:
#include "stdafx.h"// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
#ifdef _DEBUG#pragma comment(lib, "../../../lib/dbg/x86_vc10/libFreeType[dbg_x86_vc10].lib")
#else#pragma comment(lib, "../../../lib/rel/x86_vc10/libFreeType[rel_x86_vc10].lib")
#endif
FreeTypetest.cpp:
#include "stdafx.h"
#include <iostream>using namespace std;int main(int argc, char* argv[])
{FT_Library library; /* handle to library */FT_Error error; FT_Face face; /* handle to face object *///1. Library Initialization//To initialize the FreeType library, create a variable of type FT_Library named, and call the function FT_Init_FreeType.error = FT_Init_FreeType(&library); if (error) { cout<<"an error occurred during library initialization"<<endl; return -1; } //2. Loading a Font Face//From a Font File, Create a new face object by calling FT_New_Face. A face describes a given typeface and style.char* filename = "../../../testdata/kaiu.ttf";error = FT_New_Face(library, filename, 0, &face);if (error == FT_Err_Unknown_File_Format) {cout<<"the font file could be opened and read, its font format is unsupported"<<endl;return -1;} else if (error) {cout<<"the font file could not be opened or read, or that it is broken"<<endl;return -1;}//3. Accessing the Face Data//A face object models all information that globally describes the face.//Usually, this data can be accessed directly by dereferencing a handle, like in face−>num_glyphs.FT_Long numGlygphs = face->num_glyphs;FT_Long numFaces = face->num_faces;FT_String* familyName = face->family_name;cout<<"num_glyphs = "<<numGlygphs<<", num_faces = "<<numFaces<<", family_name = "<<familyName<<endl;//4. Setting the Current Pixel Size//FreeType 2 uses size objects to model all information related to a given character size for a given face.//error = FT_Set_Pixel_Sizes(face, 0, 16);error = FT_Set_Char_Size(face, 50 * 64, 0, 100, 0); if (error) {cout<<"an error occurs when trying to set the pixel size to a value"<<endl;return -1;}//5. Loading a Glyph Image//Converting a Character Code Into a Glyph IndexFT_UInt charIndex = FT_Get_Char_Index(face, 65); //65 => 'A'//Once you have a glyph index, you can load the corresponding glyph imageerror = FT_Load_Glyph(face, charIndex, FT_LOAD_DEFAULT);if (error) {cout<<"an error occurs when trying to load the corresponding glgyh image"<<endl;return -1;}//6. Simple Text Renderingerror = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);if (error) {cout<<"an error occurs when trying to render glyph"<<endl;return -1;}FT_Glyph glyph;error = FT_Get_Glyph(face->glyph, &glyph);if (error) {cout<<"get glyph error"<<endl;return -1;}//convert glyph to bitmap with 256 gray FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, 0, 1); FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph; FT_Bitmap& bitmap = bitmap_glyph->bitmap; for (int i = 0 ; i < bitmap.rows; ++ i) { for (int j = 0 ; j < bitmap.width; ++ j) { //if it has gray > 0 we set show it as 1, 0 otherwise printf(" %d ", bitmap.buffer[i * bitmap.width + j] ? 1 : 0); } cout<<endl; }FT_Done_Glyph(glyph);FT_Done_Face(face);FT_Done_FreeType(library);cout<<"ok!"<<endl;return 0;
}
参考文献:
1. http://wenku.baidu.com/link?url=66OQSAxrwbLGuaeylVH-fyDm1KDEe9hEvreZKzkwuJVCNlOa1Tth598tEDzskuKvW6yrpl8qcym1BbCPJFS_W4xSTsRmNu18zVFyy_Hcgcu
2. http://www.docin.com/p-595358316.html
3. http://www.cnblogs.com/kex1n/archive/2010/11/24/2286445.html
GitHub:https://github.com/fengbingchun/FreeType_Test
相关文章:

firefox下的调试工具
2019独角兽企业重金招聘Python工程师标准>>> vue-devtools https://addons.mozilla.org/en-US/firefox/user/13100848/ 转载于:https://my.oschina.net/u/3371661/blog/3003299

NLP为RPA带来了什么价值?
什么是 RPA(Robotic Process Automation)?机器人流程自动化(RPA)是一种自动化工具,用于创建软件机器人的虚拟劳动力,从而优化和降低企业中端到端业务流程的成本。RPA 可以翻译成机器人流程自动化…

从原理到代码,轻松深入逻辑回归模型!
整理 | Jane出品 | AI科技大本营(ID:rgznai100)【导语】学习逻辑回归模型,今天的内容轻松带你从0到100!阿里巴巴达摩院算法专家、阿里巴巴技术发展专家、阿里巴巴数据架构师联合撰写,从技术原理、算法和工程…

JVM内存管理学习总结(一)
I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失。那么程序启动和程序终止就是JVM实例生命周期的两个边界,两个边界点可以这么理解&#…
开源库Simd在vs2010中的编译及简单使用
Simd是开源的图像处理库,它提供了很多高性能的算法,这些优化算法主要由SIMD指令来实现,包括SSE、SSE2、SSSE3、SSE4.1、SSE4.2、AVX等,此库可以应用在windows/linux 32bit/64bit等系统中。此库更新较频繁。此库的license是MIT。下…

Dubbo2.6.5+Nacos注册中心(代替Zookeeper)
在上一节的小栗子的基础上,只需要更改两个地方 第一个:父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-nacos</artifactId>…

Nginx(二) 配置与调试
nginx 主配置文件在安装目录下的conf中,名字为nginx.conf:主配置文件主要分为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和location&#x…

AI编程语言图鉴
作者 | 元宵大师责编 | 胡巍巍来源 | CSDN(CSDNnews)当前最炙手可热的领域非“人工智能”(Artificial Intelligence)莫属。其实,“人工智能”的火热并非一蹴而就,早在1956年“人工智能”概念就已经被提出了…

C++动态二维数组演示的代码
将代码过程中经常用到的代码珍藏起来,下边资料是关于C动态二维数组演示的代码。 #include <iostream> #include <string>using namespace std;{for( int i 0; i < x; i ){List[i] new int[y];for( int j 0; j < y; j ){List[i][j] 0;}}for( i…

linux发送email错误 501 Syntax: HELO hostname
2019独角兽企业重金招聘Python工程师标准>>> 查看你的hostname hostnamecentos58 然后vi /etc/hosts 添加hostname对应的ip 103.24.3.171 centos58 参考http://blog.csdn.net/tammy_zhu/article/details/5563383 转载于:https://my.oschina.net/u/257088/bl…

redux-thunk使用教程
从无到有一步一步创建一个react-redux、redux-thunk使用教程:本教程GitHub地址:https://github.com/chunhuigao/react-redux-thunk创建react工程在电脑上找一个文件夹,在命令窗使用create-react-app 创建我的react工程;这一步应该…

VLC SDK在VS2010中的配置及简单使用举例
1. 从http://www.videolan.org/vlc/download-windows.html下载vlc-2.2.0-win32.7z,解压缩;2. 新建一个VLCtest控制台工程;3. 将/vlc-2.2.0-win32/vlc-2.2.0/sdk/include添加到工程属性中,C/C -->General …

百万奖金悬赏AI垃圾分类,就问你来不来?
也许我们从来没有想过,看似简单的垃圾分类居然给“聪明”的人类带来如此大的困扰2019年7月1日,史称“最严格的垃圾分类法”《上海市生活垃圾管理条例》正式开始施行一夜之间上海人最常用的见面语从“侬好”变成了“侬是什么垃圾?”虽然只有可…

资质申报 - 系统集成企业资质等级评定条件(2012年修定版)
关于发布《计算机信息系统集成企业资质等级评定条件(2012年修定版)》的通知工信计资[2012]6号各省、自治区、直辖市、计划单列市工业和信息化主管部门、新疆生产建设兵团工业和信息化委员会、各级资质评审机构,各有关单…

@HostListener 可接收的事件列表
下面有一个文档详细介绍Angular 中的事件列表: https://github.com/angular/angular/blob/master/packages/compiler/src/schema/dom_element_schema_registry.ts#L78。 星号代表的是事件 (no prefix): property is a string.*: property represents an event.!: pr…

GraphSAGE: GCN落地必读论文
作者 | William L. Hamilton, Rex Ying, Jure Leskovec来源 | NIPS17导读:图卷积网络(Graph Convolutional Network,简称GCN)最近两年大热,取得不少进展。作为 GNN 的重要分支之一,很多同学可能对它还是一知…

Ubuntu14.04 32位上编译VLC2.2.0源码操作步骤
1. 首先安装必须的依赖软件,打开终端,执行:sudo apt-get install git libtool build-essential pkg-config autoconf2. 从 http://www.videolan.org/vlc/download-sources.html 下载vlc-2.2.0源码,将其存放到/home/spring/VLC目录…

根据PromiseA+规范实现Promise
Promise是ES6出现的一个异步编程的一个解决方案,改善了以往回调函数的回调地狱(虽然写起来也挺像的)。不会Promise的可以移步阮一峰的Promise,这里讲的非常清晰。 就现在的发展情况而言,Promise这种解决方案频繁的在我们的代码中出现…

黄浴:基于深度学习的超分辨率图像技术发展轨迹一览
作者 | 黄浴转载自知乎导读:近年来,使用深度学习技术的图像超分辨率(SR)取得了显著进步。本文中,奇点汽车自动驾驶首席科学家黄浴对基于深度学习技术的图像超分辨率技术进行了一次全面的总结,分析了这门技术…

Qt简介、安装及在Ubuntu14.04 32位上简单使用举例
Qt是一个跨平台的C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序。Qt是面向对象的框架,很容易扩展。Qt是一个C工具包,它由几百个C类构成,你在程序中可以使用这些类。Qt具有OOP的所有优点。 跨平台的…

FOSCommentBundle功能包:设置Doctrine ODM映射(投票)
原文出处:12b-mapping_mongodb.md原文作者:FriendsOfSymfony授权许可:创作共用协议翻译人员:FireHare校对人员:适用版本:FOSCommentBundle 2.0.5文章状态:草译阶段Step 12b: Setup MongoDB mapp…

Python最大堆排序实现方法
Python最大堆排序实现方法,具体代码如下: # -*- coding: utf-8 -*- def merge_sort(seq, cmpcmp, sentinelNone): """合并排序,伪码如下: MERGE(A, p, q, r) 1 n1 ← q - p 1 // 前个子序列长度 2 …

内含福利 | 世界人工智能大会:对话大咖,深挖机器学习的商业应用
机器学习作为人工智能时代的关键技术突破,已经在日常生活中广泛应用,给用户带来便利。越来越多的企业也通过机器学习,解决生产和经营中的难题。传统制造业:应用机器学习,部署系统异常检测方案,预测组件寿命…

windows7 64位操作系统上使vs2010和vs2013能够并存的处理方法
之前机子上是只安装有vs2010,后来在没有卸载vs2010的情况下想装个vs2013,使vs2010与vs2013同时并存在windows764位机上。需要依次安装cn_visual_studio_ultimate_2013_x86_dvd_3009109.iso、vs2013.2.iso和vc_mbcsmfc.exe。在安装过程中遇到的问题有: (…

Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0
Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0 昨晚Nacos社区发布了第一个生产级版本:0.8.0。由于该版本除了Bug修复之外,还提供了几个生产管理非常重要的特性,所以觉得还是有必要写一篇讲讲这次升级,在后续的…

awk命令使用和取出数据的最大值,最小值和平均值
得到取出数据的最大值:cat manager.txt |grep monitor|awk {print$9}|sort -rn|head -1得到取出数据的最小值:cat manager.txt|grep monitor |awk {print $9}|sort -n|head -1得到取出数据的平均值:cat manager.txt|grep monitor |awk {print…

windows7 64位机上CUDA7.0配置及在VS2010中的简单使用举例
1. 查看本机配置,查看显卡类型是否支持NVIDIA GPU,选中计算机--> 右键属性 --> 设备管理器 --> 显示适配器:NVIDIA GeForce GT 610,从https://developer.nvidia.com/cuda-gpus可以查到相应显卡的compute capabili…

用友云平台,真正的云原生架构,加速云应用落地
数字化经济的出现,企业需要通过新技术实现数字化转型,完成企业管理和业务模式变革。而云计算是数字化中尤为重要且能够更快实现的技术手段。真正的云应用必须是基于云原生架构的,PaaS是一个重要的步骤,因为这是云原生的第一接触点…

从ACM班、百度到亚马逊,深度学习大牛李沐的开挂人生
“大神”,是很多人对李沐的印象。作为一经推出便大受追捧的 MXNet 深度学习框架的主要贡献者之一,李沐功不可没。值得注意的是,这个由 DMLC(Distributed Machine Learning Community)打造的深度学习框架,创…

Linux基础介绍
Linux的创始人Linus Torvalds。Linux的官方标准发音为[linəks]。Linux和Unix是非常像的,Linux就是根据Unix演变过来的。Linux是免费的,其实只是说Linux的内核免费。在Linux内核的基础上产生了众多的Linux版本。Linux的发行版说简单点就是将Linux内核与应…