简析Etoys的多语言支持 之 字体

在Etoys中,字体显示有多种方式,如StrikeFont,TTCFont,在Linux下还可以使用Pango进行字体渲染,而在Squeak中也可以通过FT2Plugin插件用libfreetype库进行字体渲染。以下主要是介绍StrikeFont及TTCFont这两种机制,以及在多语言支持上的细节。

显示接口

不管是StrikeFont,还是TTCFont,它们最终提供给其它对象使用的接口是统一的,这样其它对象不需要关心当前使用的到底是StrikeFont还是TTCFont。这个统一接口是由AbstractFont类定义的。

其中一个接口是显示字符串。比如(StringMorph contents: ‘ab’) openInWorld这样一个显示StringMorph的动作,其中字符绘制的操作是在StringMorph>>drawOn:中处理的,其中调用了FormCanvas class>>drawString:from:to:in:font:color:,进而调用了AbstractFont的displayString:on:from:to:at:kern:baselineY:。

这只是字体显示字符串的入口,而真正完成显示操作的,是BitBit>>copyBits消息,这里不对此作详细的描述,简单说来,就是displayString消息利用StrikeFont>>glyphInfoOf:into:或TTCFont>>glyphInfoOf:into:从字体中得到需要显示的字符的点阵,这个点阵数据,在StrikeFont中是直接存放在那的,而TTCFont则是通过计算得到的。displayString在得到字符点阵后,通过BitBit>>copyBits消息将点阵信息拷贝到显示的媒介中。

可以看出,在显示接口上,是与多语言无关的,所有与多语言相关的信息都被包装在glyphInfoOf:into:中。

FontSet

在了解了显示字符的基本接口和原理后,我们再来看看StrikeFontSet及TTCFontSet这两个类,从它们的名称可以看出,这里是字体集的意思,但要注意,它们与StrikeFont还有TTCFont一样都是继承自AbstractFont,也有displayString:on:from:to:at:kern:baselineY和glyphInfoOf:into:等消息,所以对于其它使用它们的对象来说,和一般的字体是没有区别的。这里的字体集的概念是指同一字体名下同一大小不同语言字体的一个集合。它的fontArray实例变量就是根据各种语言的leading char对字体进行分别存放。在处理glyphInfoOf:into:消息时,首先根据leading char选择相应语言的字体,再读取相应的字符点阵。

TextStyle

TextStyle才是对同一字体不同大小组合的抽象,这里列出这个类常用的一些消息:

TextStyle default	-- 系统默认的TextStyle
TextStyle defaultFont	-- 默认TextStyle的默认字体
TextStyle named: 'abc'	-- 返回名称用abc的TextStyle
fontNamesAndSizes	-- 一个TextStyle中的所有字体
fontOfSize:		-- 返回一个TextStyle中指定大小的字体

字体转化

1. StrikeFont

在之前一篇文章中对如何将BDF字体转为StrikeFont作了说明,其中也提到希望能够将文泉驿点阵宋体加入到Squeak中,其实在Etoys中Yoshiki Ohshima已经做了一方面的工作。代码在StrikeFontSet class>>createExternalFontFileForUnicodeSimplifiedChinese:中。有兴趣的可以看一下代码,里面涉及如何在StrikeFont中组织多个编码段的字体。

2. TTCFont

而TTCFont的转化则是通过TTCFontSet class>>newTextStyleFromTTFile:的形式来实现。完整的一个示例如下:

TTCFontReader encodingTag: SimplifiedChineseEnvironment leadingChar.
TTCFontSet newTextStyleFromTTFile: 'C:\Windows\Fonts\simhei.ttf'.
(TTCFont allInstances select: [ :a | a familyName = 'BitstreamVeraSans' ]) do: [:i | i setupDefaultFallbackFontTo: (TextStyle named: 'SimHei')].
Advertisements
此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s