引子
近一个月都在与字体打交道,查阅了不少资料。
发现海内很少有这方面的一些资源,有点新鲜。
故此,想稍微梳理一下这方面的一些资料以及信息,利便对这方面感兴趣的同伙参阅。
文字渲染的组成
文字渲染严酷意义上来说包罗几个主要的焦点模块,分别是:
1.字体光栅化 FreeType
它是一个软件字体引擎,它被设计成小巧、高效、可高度定制和可移植,同时能够天生高质量的输出(字形图像)。它还可以用于图形库、显示服务器、字体转换工具、文本图像天生工具和许多其他产品。
2.字体适配 Fontconfig
主要用于设置、定制治理系统里的字体,简朴的说就是通过给出的字体信息,例如粗体,斜体等,找到现有系统中最匹配的这些特征的字体文件。
3.Unicode文本双向算法 FriBidi
主要用来转换差别语系中存在的文本偏向问题,例如右向左的文本, 翻转后为左向右顺序的文本。
4.文字塑形HarfBuzz
HarfBuzz是一种文字塑形结构引擎(text shaping library),它主要将Unicode转换为花样准确且位置准确的字形输出。
简朴地说就是用于适配全世界差别语言的文字编码结构。
另一个异常着名库是ICU,而HarfBuzz的实现中将其作为第三方库引入
5.结构渲染Cairo或Skia Graphics Library
当你拿到字体字形的数据之后,毫无疑问,
一定是需要一个结构渲染引擎把这些文字在对应的位置上画出来。
在手机或者PC端的操作系统中我们看到的文字,是经由以上这个几个步骤处置之后才气正常且准确地出现出来。
而时至今日,文字已经没办法知足人人在网络上一些表达上的需要,
从通俗的文字,再到字符画,再到现在林林总总的emoji脸色。
文字渲染这个领域已经有了更多新的需求和出现。
那现代的文字渲染的架构是什么样的呢?
我们来看下安卓的文字绘制架构图:
此图摘自(https://medium.com/mindorks/deep-dive-in-android-text-and-best-practices-part-1-6385b28eeb94)
我们看到,字体光栅化接纳了FreeType,渲染接纳了Skia,结构塑形接纳了HarfBuzz和ICU,
他们最终通过一个名为Minikin库向外部提供能力。
那Minikin是个什么东西,它到底干了些啥呢?
Minikin 是一个安卓中实现的一个文本结构库,而且着名框架Flutter使用的libtxt结构引擎也是基于Minikin。
Minikin的代码堆栈: https://android.googlesource.com/platform/frameworks/minikin/
从其源代码中,可以大致看到,Minikin做了 字体治理,断句断行,emoji字符的判别,Unicode文本双向算法,结构以及丈量等。
可谓是麻雀虽小五脏俱全,真的是一份异常值得深入学习的资源。
当然有一个异常不友好的地方就是,它依托着FreeType,Skia,HarfBuzz,ICU四大库。
而这四大库,其中任何一个库学习起来都有够受的,就别提一共4个。
然则,若是要做好文字渲染这件事情,这就是必须越过的四座大山。
那若何入门是好?
一样平常情况下,若是我们只做中英文的文字渲染,我们暂时不思量 字体适配,Unicode文本双向,文字塑形结构。
那只要把重心放FreeType和Skia上就足够了。
也就是两个步骤:
1. 加载字体
2. 画出来
就是这样简朴粗暴。
为了利便人人学习和明了这方面的知识,博主为人人准备了两份代码。
1.移除FreeType的libpng第三方库,改用LodePng替换,主要是简化编译。
代码堆栈地址:
https://github.com/cpuimage/freetype
这里要弥补说明下,为什么FreeType用到了libpng。
由于大多数的emoji脸色是将PNG花样的图片直接嵌入到字体文件里。
然则由于png花样的图片体积太大,迁入到字体文件后,
整个字体文件过大,而且绘制还存在失真的问题。
为领会决上面提及的几个问题,
最新的emoji字体接纳的是SVG花样嵌入的思绪,利益就是体积小,且无损,
然则对于开发者的坏处就是,将SVG光栅化为图片,
至少需要一个svg引擎,操作起来真的贫苦。
而最新版的FreeType 2.10.2 还没有支持svg花样,不外已经有人在实验扩展这个功效了。
详情可参阅:
https://summerofcode.withgoogle.com/archive/2019/projects/6002250785226752/
2.浅易的文本绘制示例TinyText
这是博主将谷歌开源的一个物理引擎Tiny Differentiable Simulator中的文字绘制模块单独提取出来,
并接纳第三方库SDKpowervr-sdk-tools举行编译开发,
现在仅支持在Windows64位环境下编译,若是要适配其他操作系统,
自行替换第三方库powervr-sdk的其他系统版本即可。
代码堆栈地址:
https://github.com/cpuimage/TinyText
示例效果图如下:
编译环境可以参阅Windows下C,C++开发环境搭建指南
推荐一个可参阅学习的项目:
freetype-gl 这是一个异常值得参阅学习的项目,字体渲染涉及到的基本算法,都有了,而且照样纯C的代码。
深入字体渲染之抗锯齿
当然有绘制渲染,就一定存在抗锯齿的问题。
抗锯齿有好几种方案和思绪。
有两种主流的算法:
-
Signed distance fields 有向距离场
关于距离场的算法知识就不睁开细说了,
大伙可以参阅这个链接领会一下 https://zhuanlan.zhihu.com/p/26217154
基于距离场算法做抗锯齿有个坏处,由于距离是有强弱的,
若是距离场设置的半径过大,字体会出现得过渡平滑,
细节丢失,换句话说全是钝角没有锐角,会模糊失真。
但若是设置的半径过小,就没有抗锯齿的效果,
以是接纳距离场是需要举行参数适配的。
看图自行感受一下:
-
Vector textures 矢量纹理
思绪是基于贝塞尔曲线举行绘制。
简朴地讲就是将文字信息转为svg形貌花样,
然后举行光栅化绘制。
利益自然就是矢量化无损。
看图自行感受一下:
文字渲染若是细讲的话,很难三言两句就讲明了的。
以是博主这里为人人提供一些参考资料:
-
GPU text rendering with vector textures https://wdobbie.com/post/gpu-text-rendering-with-vector-textures/
-
Korok字体系统设计 https://zhuanlan.zhihu.com/p/36553076
-
Font Rendering is Getting Interesting https://aras-p.info/blog/2017/02/15/Font-Rendering-is-Getting-Interesting/
-
Drawing Text with Signed Distance Fields in Mapbox GL https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817
-
Techniques For Rendering Text With Webgl https://css-tricks.com/techniques-for-rendering-text-with-webgl/
-
Rendering Text in Metal with Signed-Distance Fields https://metalbyexample.com/rendering-text-in-metal-with-signed-distance-fields/
-
sdf-antialiasing https://drewcassidy.me/2020/06/26/sdf-antialiasing/
-
Font Bitmap vs SDF https://www.shadertoy.com/view/llK3Wm
以上,权当抛砖引玉之用。
授人以鱼不如授人以渔。
2020年,希望疫情早点竣事,人人恢复正常的工作和生涯。
世界和平,人们皆友好。
若有其他相关问题或者需求也可以邮件联系俺探讨。
邮箱地址是: gaozhihan@vip.qq.com
,欢迎进入欧博开户平台(Allbet Game):www.aLLbetgame.us,欧博开户平台开放欧博Allbet开户、欧博Allbet代理开户、欧博Allbet电脑客户端、欧博AllbetAPP下载等业务。
网友评论
最新评论
欧博电脑版我和我的小伙伴都喜欢。
@皇冠线上开户(www.huangguan.us) 每次训练建议完成3-5组动作,每组1分钟。这套动作简朴,对身体条件要求较低,适合无法完成小燕飞的暮年人。很不一般
很不一般
据今期《东周刊》封面报道,35岁的麦鼎力跟31岁简淑儿(Jessica)十指紧扣在西贡拍拖,更拍到二人当街缱绻,时代Derek从后熊抱女友,烟韧起来更在街上隔着口罩甜蜜咀嘴。报道又指Derek跟Jessica因与麦美恩、朱敏瀚和冯盈盈互助综艺节目《SUPER FIVE》结缘,Jessica约密友陈婉衡潜水时,Derek也有随行,两人黑暗拍拖至今已两个月。文:娱乐组图:《东周刊》强烈推荐!贼好看