本文是HarfBuzz系列的第二篇:本文概述 一、关键概念与结构 1.1 script 文字系统的类型 ,注意不是指语言,不同语言也可能属于同一类书写系统,比如:Hello→ Latin 世界 → Han あい → Hiragana 1.2 cluster 1.3 grapheme cluster与grapheme的区别: 1.4 blob 1.5 face face是不带字号、缩放和其他渲染参数的,因此face无法直接用于塑形。 1.6 font hb_shape() 接受的是 hb_font_t 对象 ,而不是 hb_face_t,这是因为 HarfBuzz 在计算字形位置和前进量时,需要知道字体的大小和比例。1.7 buffer 1.8 user data 1.9 小结 对象类型 (注意并非OOP中面向对象的概念)。对象采用引用计数方式管理生命周期 ,通过各种create() 方法构建,初始创建时,引用计数为1,通过 reference() 方法引用(引用计数+1),通过 destroy() 方法解除引用(引用计数-1),当引用计数为0时释放。生命周期管理 API 都是线程安全的 (除非你从源代码编译 HarfBuzz 时使用了HB_NO_MT配置标志),即便对象整体并非线程安全,引用(reference())或销毁(destroy())NULL 值也是允许的。二、塑形操作 1)字形替换 一对一替换(Simplified Forms) :根据feature、语言设置的不同,会进行简体 ↔ 繁体、半角 ↔ 全角、普通 ↔ 装饰体等的转换。比如在日文中会将标点符号「。」替换为它的全角版本「。」多对一替换/连字(Standard Ligatures) :比如把 f + i → 合成为 fi 连字一对多替换/分解(Glyph Composition/Decomposition) :把一个“复合”字形拆解成多个独立的字形,通常用于预处理阶段,主要为了后续定位、重音调整等更方便,一般不会影响最终的视觉效果;比如某些字体可能将预组合的 é 字形分解为 e + ´上下文替换(Initial Forms/Medial Forms/Final Forms/Isolated Forms) :根据字形在单词中的位置来替换,比如阿拉伯文字母 ه 会根据其在词首、词中、词尾或孤立出现,被替换为 هـ、ـهـ、ـه、ه 四种完全不同的形态辅音连缀(Conjunct Forms) :比如क + ् + ष 会被替换字形为 क्ष2)字形定位:不修改字形,但是会影响position 字距调整(Kern) :比如T与o 相邻时 o 的 x 偏移量为负,使它更靠近 T标记定位(Mark) :带重音符的如é,会将 ´ 的前进量设为 0,并设置 y_offset 使其移动到 e 的正上方草书连接 (Cursive Attachment) :在“草书”类文字中(如阿拉伯文 Arabic、叙利亚文 Syriac、南印度文等),字符之间并不是并排放置的,而是通过笔画自然地连接起来的3)字形重排 总结 一文读懂字符与编码 一文读懂字符、字形、字体 一文读懂字体文件 从0到1自定义文字排版引擎:原理篇 逆向分析CoreText中的字体级联/Font Fallback机制 新手小白也能看懂的LLDB技巧/逆向技巧 HarfBuzz概览 非专业程序员Ping  
            
        
 
   
        
        
        
        
        
        
 
 
 
  相关推荐