Uniscribe

整个系列文章都是个人对

http://msdn.microsoft.com/en-us/library/windows/desktop/dd374091(v=vs.85).aspx

微软官方Uniscribe使用说明的翻译,仅供学习参考之用。

 

Uniscribe是一系列用于处理Complex Script(复杂文字系统)和Fine Typography(高级文字排版,下称高级排版)的高级控制API。高级排版效果,不管是复杂文字还是简单文字(Simple Scripts),在显示和编辑时都需要进行特殊的处理,因为字符("Glyph")并不总是按照一种简单的方式来排列的。对复杂文字系统来说,Unicode标准中列出并编目了这些(字符的)图形和位置。

这篇文章讨论了高级排版和复杂文字系统处理的方方面面,如下:

关于Uniscribe

使用Uniscribe

Uniscribe参考

 

 

一、关于Uniscribe

Uniscribe是实现高级排版和处理复杂文字系统的方式之一。下面首先讨论复杂文字系统和它的一些特殊问题,然后再讨论一些其他处理复杂文字系统的标准方法。

关于复杂文字系统

复杂文字系统的处理

OpenType字体格式

Uniscribe术语

1. 关于复杂文字系统(About Complex Scripts)

复杂文字系统是SCRIPT_PROPERTIES的fComplex成员为TRUE的文字系统。这一部分详细说明了复杂文字系统可能会具备的一些特性。

双向显示(Bidirectional Rendering)

双向显示是对”从左到右“和”从右到左“两种文字方向显示的处理。例如,在阿拉伯语(Arabic)语系的双向显示中,文字的默认的显示方向是”从右到左“,但对一些数字来说却是”从左到右“的。处理复杂语言系统的时候必须要考虑到字符的逻辑顺序(按键输入的顺序)和图形显示顺序的差别。此外,处理程序还必须要很好地处理光标移动和击中测试。为了得到良好的显示效果,屏幕坐标和字符索引的映射还需要布局计算,例如选择文本和光标显示。

上下文相关图形(Contextual Shaping)

在上下文相关图形中,字符的形状会依赖于它前后的字符而发生改变。在一些英语的书写中,小写字母"l"形状会依赖于它前面的字符而发生变化,例如前面字符是"a"(从底部连接)或者字符"o"(从高一点的地方连接)。阿拉伯语是最能体现出上下文相关图形的语言。

联合字符(Combining Characters)

联合字符,又叫“连字”,是把一个字符同另外一个字符连在一起。阿拉伯语是一种含有大量联合字符的语言。例如字符"a"后面跟随一个”联合标记“,该标记表示渲染后就是"à"。Unicode的"U+0061-U+0300"段就需要做一些处理来保证”联合标记“能够正确地在字符"a"上面定位。

专门的断句和调整(Specialized Break and Justification)

有一些语言,像泰语,就有一些复杂的规则将语句在行间或者通过在行内调整文字来进行分段。

过滤非法的字符联合(Filtering for Illeagal Character Combination)

复杂语言系统,像泰语,在语言禁用特定的字符联合时,能够过滤出不合规范的字符联合。

后备字体(Font Fallback)

后备字体是一种非用户选择而是自动选择的一种字体,在Uniscribe中,当用户选择的字体不支持语言中全部或者部分的文字时,后备字体就通过ScriptStringAnalyse函数来应用后备字体,参见”使用后备字体“。

相关内容

关于Uniscribe

2. 复杂文字系统的处理(Complex Script Processing)

通过下面的方式,可以实现显示”高级排版效果或者复杂文字系统处理“:

文本函数(Text functions)

编辑控件(Edit controls)

富文本框控件(Rich edit controls)

Uniscribe

选择哪种方式取决于下面的因素:

文字或者语言的种类

实现程序的模式,如应用程序的文本布局和断行处理

更新已有的应用程序还是创建新的应用程序

一般来说,处理相对简单文字的应用程序可以选择任何一种方式,但是,对大多数要对复杂文字处理过程需要进行完全控制的应用程序来说,建议使用Uniscribe。

使用Text函数处理复杂文字系统(Complex Script Processing Using Text Functions)

那些基本上使用相同的字体、粗细、颜色等的文字,使用传统的书面文字和确定的行宽度的应用程序使用诸如TextOutExeTextOutTabbedTextOutDrawTextGetTextExtentExPoint之类的标准文本函数。这些函数是支持复杂文字系统处理和高级排版效果的。更多内容,请参照”字体和文字“。

正常来说,标准的文本支持对处理复杂文字系统的应用程序来说是透明的。然而,您应该清晰地认识到,在编写支持高级排版和复杂文字系统处理的应用程序时是要遵循一些特殊规则的:

1)您的应用程序需要在缓存中保存字符,并且一次显示一整行,而不是像用户输入时那样为每个字符都调用一次ExtTextOut。这样做能够让高级文字图形模块来按照上下文来重新排序并且生成正确的图形。

2)应用程序应当使用GetTextExtentExPoint来决定一行字符的行宽,而不是用缓存的字符宽度来计算,这是因为图形的宽度会被上下文所影响。

3)应用程序可以按照需求选择性地支持”从右到左“的阅读方式和右对齐

4)相对于简单文字系统的显示来说,复杂文字系统的高级排版和重新计算会有显著的性能增长。因此,为了避免出现性能问题,您的应用程序在显示结果并向用户交回控制权之前,不应该处理大量的文本。

使用编辑控件处理复杂文字系统(Complex Script Processing Using Edit Controls)

 标准的Windows编辑控件已经被扩展为支持多行文本和复杂文字系统。这些扩展支持输入和显示,同时在不同字符集的情况下能够正确地处理光标移动。像泰语和梵语。更多内容,请参考”编辑控件“。

使用富编辑控件处理复杂文字系统(Complex Script Processing Using Rich Edit Controls)

富编辑控件3.0是一系列利用Uniscribe来将文字系统和文本布局程序隔离接口的高级集合。即使这些应用程序的主要目的并不是进行文本布局,富编辑控件也是应用程序显示复杂文字系统最简便的方法。富编辑控件为Unicode多语言文字和简单的语言文字提供了快速和多样化的编辑能力。包括大量的消息处理和COM接口、文本编辑、格式化、换行、简单的制表布局、垂直布局、双向文本布局、印第安和泰语支持、类似Microsoft Word的用户界面和文档对象模型接口。

通过富编辑控件接口,应用程序可以使用富编辑控件的TextOut函数来自动的转换、绘制、定位和换行。更多信息,请参考"Rich Edit Controls"。

使用Uniscribe处理复杂文字系统(Complex Script Processing Using Uniscribe)

Uniscribe为涉及高级排版和复杂文字系统的处理提供了最广泛的支持。它支持已有的像阿拉伯语、梵语和泰语中的复杂规则,也能够处理像阿拉伯语和希伯来语这种“从右往左”的书写方式,也支持混合语言文字。Uniscribe也充分利用了OpenType字体的一些应用程序在控制精细排版效果时需要用到的特性。更多内容请参考“处理复杂文字系统”。

相关内容

关于Uniscribe

如何处理Complex Scripts

3. OpenType字体格式(OpenType Font Format)

基于Unicode的OpenType字体格式从TrueType字体格式扩展而来。OpenType允许从字体到图形的映射,支持图形的连接、定位、替换和其他替换。OpenType也包括二维的图形定位和图形连接,并且也包含了TrueType或者PostScript轮廓线。

OpenType中的布局特性是由脚本和语言组织的,这允许单个字体使用同样的脚本就可以支持多种书写系统。为了确保文本布局操作的一致性并且在应用程序和字体文件中避免不必要的开销,Uniscribe包含了许多文本布局和语言规则算法。这将字体的设计者从生成字体的脚本规则中解放出来。

应用程序可以提出特别的说明或者参考来指导Script布局,OpenTyoe甚至可以复制或者替换操作系统服务所使用的布局规则。

支持文本布局的操作系统服务的布局结构允许应用程序选择所要的布局信息来使用,并且选择如何去应用它。更多内容,请参考"Microsoft Typography Specifications overview"或者"OpenType 说明"

相关内容

关于Uniscribe

4. Uniscribe术语(Uniscribe Glossary)

ABC width

GDI中的ABC结构定义了ABC宽度,结构中包含了成员abcA、abcB和abcC,相当于Glyph或者Run的"A"、"B"和"C"的宽度。

宽度"A"表示相对于屏幕上Glyph或者Run相当于笔迹左边的Underhang(正数,也被称作为“间距”)或者Overhang(负数)。宽度"B"就是笔迹最左边到最右边的宽度,宽度"C"就是相对于笔迹最右边的Overhang。

下面的例图展示了同时拥有左边和右边Overhang的小写字母F。就是说"A"和"C"的宽度都是负数。可以在Underhang中查看正数的"A"和"C"宽度。

 

当2个或者更多的Glyph被当作整体一起显示的时候,通常只有最左边的Glyph的"A"宽度对整个Run生效,也只有最右边Glyph的宽度对整个Run生效。但也并不严格要求要按照这个规则。例如,当Run中第一个Glyph是一个较窄的字母,并且第二个Glyph是一个较宽的变音符号,并且他们被分开处理,那么变音符号就需要与字母扩展开。

advance width

Glyph的Advance Width是依照从起始点开始的书写方向来渲染的时候,渲染起始点到渲染下一个Glyph的距离。

bidirectional stack

bidirectional stack是一个5位的整数,它保存了在“从左往右”和“从右往左”的回绕等级。对于它从0开始表示从左往右。因此,偶数值就代表“从左往右”的文字,奇数值就代表“从右往左”的文字。SCRIPT_STATE结构中的uBidiLevel就表示了bidirectional stack。

bidirectional text

bidirectinal text包括了“从左往右”和“从右往左”,但在纯粹的“从右往左”的文字中有时也无法达到目的。所有的“从右往左”的文字需要使用bidirectional stack,因为默认的embedding level是0,它表示“从左往右”的文字。

cell width

应用程序可以通过为确定的Glyph调整cell width对齐文本。对于没有对齐的文本,Glyph的cell width等于它的advance width。

cluster

cluster是能够被图形化的最小的语言单位。在一些阿拉伯语和印第安语里,被用于表示每个字符(Unicode code point)的Glyph非常依赖于组成它周围code point的cluster,在这些语言里,应用程序可以直接通过查找cluster来将code point转换成合适的Glyph。而在另一些script里,像梵语,cluster里的图形顺序可能跟相应的Unicode code point顺序不同。更多内容请参照Microsoft typography网站里的Windows Glyph Process。

complex script

complex script是具备下列因素之一的一种script:

允许双向显示

有上下文相关图形

有联合字符

有特殊的断句和对齐规则

过滤非法联合字符

不被内部Windows内核支持,因此需要使用后备字体

在一些complex script中,glyph的顺序可能与他们代表的潜在Unicode字符顺序不同。更多详细内容请参考"关于Complex Scripts"。

在打印时,有时会需要像complex script一样处理手写体英语中的拉丁script。例如,在OPENTYPE_FEATURE_RECORD文档里描述的Stylistic Alternates特性,或者像"fi"那样简单的Glyph代表了2中或更多种关联字符连接。

embedding level

在bidirectional text中,embedding level是bidirectional stack的的索引。

font fallback

font fallback是一种在应用程序里由系统自动选择的而不是用户选择的字体。在Uniscribe中,当script中部分或者全部文字不被用户指定的字体支持时,font fallback就会被函数ScriptStringAnalyse应用。

glyph

glyph是字体中单独的显示单元。对于OpenType,这个单元被定义为outline。而对于其他类型的字体来说,glyph可能是被定义成位图或者一系列绘图命令,或者其他类似的。glyph不需要和单独的字符相关联,例如,"fi"连接代表了2个字符"f"和"i"。一个典型的由多个glyph组成一个单元的是越南语中的小写字母"o"就包含一个腭化符号和音调符号。

item

 

 

 

 

 

 

 

二、使用Uniscribe

1.缓存(Caching)

2.确定文字是否需要使用图形映射(Detemining If a Script Requires Glyph Shaping)

3.使用Uniscribe显示文字(Displaying Text with Uniscribe)

4.在双向文本中显示光标(Displaying the Caret in Bidirectional Strings)

5.管理光标位置和击中测试(Managing Caret Placement and Hit Testing)

6.处理复杂文字系统(Processing Complex Scripts)

7.将鼠标点击的X坐标转换为光标位置(Translating Mouse Hit X Offset to Caret Position)

8.使用字符集(Using Character Clusters)

9.使用后备字体(Using Font Fallback)

10.使用图形引擎(Using Shaping Engines)

11.使用ScriptStirng函数(Using the ScriptString Functions)

12.使用单词换行(Using Word Bread Points)

13.缓存(Caching)

1.缓存(Caching)

1.缓存(Caching)

 

 

 

 


 

三、Uniscribe参考

 

 

转载于:https://www.cnblogs.com/thexujie/p/3652487.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值