2.深入介绍字体
Symbian 操作系统可使用位图字体,相对于位图字体,字符位图以各种尺寸存储,也可使用可伸缩的字体,为其存储用于绘制字符的算法。位图字体以预先设置的尺寸范围进行存储。对于其他的尺寸,它们可通过算法进行缩放,但位图质量可能会受到影响。然而,顾名思义,可伸缩的字体可产生任意尺寸的字体,并且位图质量保持不变。
对于使用西方字符集的应用程序,可缩放字体无疑是有用的;而对于远东字符集,就存在天壤之别的差别了,因为即使是单一尺寸的字体信息也是非常丰富的。通过使用可缩放字体技术,只需要一种尺寸所对应的信息即可。可伸缩字体系统可处理其他的尺寸和针对打印机的光栅化。
人们已经发明了许多可伸缩字体系统,包括 Apple 的 TureType 和开放源代码的 FreeType。Symbian操作系统具有一个称为开放字体系统(Open Font System)的框架,该框架允许提供支持特殊系统的光栅化器插件程序DLL。这种插件程序读取字体文件,生成字符位图,然后将其作为位图字体准确地进行处理。
然而,可缩放字体并不总是必需的。例如,P800 只使用小的和固定数量的位图字体,因为P800 没有必要使用大型字符集的应用程序(如字处理器)。所有的应用程序一般都了解特定窗口部件(widget)所需的字体和尺寸。这样的字体可能是UID要求的,而不是与设备无关的TFontSpec规范要求的。这是一个有关优化的论题。
如果使用TFontSpec,客户不知道一个字体是来源于一个位图还是一个可伸缩字体光栅化器。一般总是使用我们前面已经见过的方法:
使用TFontSpec(及其支持类),以一种与设备无关的方式来指定字体;
通过 GetNearestFontInTwips()和 TFontSpec 使用 MGraphicsDeviceMap,最终将使用CGraphicsDevice来获得一个与设备相关的字体。
可以通过由CTypeFaceStore实现的字型存储(typeface store)来查找可用于某个设备上的字体。可以询问其中有多少种字型,遍历所有的字型,并获得它们的相关属性。UIQ 的 SDK 中的FontShell示例正是这样做的。
屏幕上(和离屏位图)的字体通过字体和位图服务器(FBS)进行管理。当使用GetNearestFont()或类似函数分配字体时,该函数将为设备创建一个小型客户端CFont*,同时确保该字体的位图可用于贴图到屏幕(或离屏位图)上。对于内置位图字体,字体位图可位于 ROM 中,在这种情况下,CFont*作为内存地址的句柄。对于这些字体来说,获得字体是系统开销很低的操作。作为另一种选择,将安装或生成的字体载入 RAM 中,并且开放其访问权限,从而所有的程序都可以有效地从共享堆中对其进行贴图。在这种情况下,CFont*充当堆中某地址的句柄。
释放字体的操作将释放客户端的CFont*。对于可安装的字体,该操作将使用次数递减,在使用次数到达0时释放该字体。可安装的字体是GetNearestFont()调用可能失败的主要原因(因为可能发生的内存溢出错误)。同样需要注意的是,为了释放内存,需要尽可能地释放字体。
有时,可能需要与设备相关的字体。例如,可能需要一个特殊像素尺寸的字体,但又想免去先从像素映射到缇、然后再返回到像素的麻烦。针对这一点,可以在大多数图形设备上使用GetNearestFontInPixels():它使用一种 TFontSpec 字体规范,但以像素为单位解释它的 iHeight,而不是使用缇为单位。另外,可能需要使用特殊符号中的特定字符。针对这种情况,则可以使用GetFontById(),该函数需要指定一个UID,而不是一个TFontSpec。 类似于字处理器的应用程序可能会使用大量的字体,因为这些应用程序中一般有许多字体可供选择,并且每一种字体都有各种各样的尺寸可供选择。
有时,通过 TFontSpec 表示的设备无关性并不是完全与设备无关。不能够依赖在任何设备上出现的任何特殊的字型。对应的,Symbian 应用程序通常将字体规范信息包含在资源文件中,从而应用程序的这一方面可被本地化:因为具有相应的FONT和NAMED_FONT资源结构。
另外,TFontSpec可以通过字型参数指定一种字体。比如,大部分西方地区的设备有sans serif字型,像 Arial 或者 SwissA。为避免硬性编码设备相关的这类名字,可以简单地设置字型的相称的参数,让其他的,包括名字,保持清晰。这可以通过调用TFontSpec::iTypeface.SetIsProportional (ETrue)实现。那么当需要某种给定尺寸的字体时,可以找到最好的匹配。但是也不能一刀切:各种远东地区应用程序也具有不同的文本布局约定。因此,如果需要支持远东地区,可能必须做更多的修改。不需要进行任何与字体相关的改动就可以支持基于Unicode的西方地区手机。
【责任编辑:
董书 TEL:(010)68476606】