在介绍如何使用和显示Symbian OS 中的字体之前,我想应该先了解一下有关字体一些基本概念相关知识。
Font 、typeface and glyph
Font是一套字符集,包括字母、数字和符号等,它有一定的高度,用点、缇或其他设备无关的单位来衡量。Typeface是一组相关字体的各种尺寸的集合,集合中的所有type共享Typeface名字和Typeface属性。
Font 和typeface 都是印刷术语,关于印刷术语可以分为4F:
Foundry:翻译过来是铸造,翻砂的意思。在这里就是字体的设计制造商。如方正集团(设计开发字体、印刷排版)。
Family:来自同一制造商的相关字体(typeface)。如方正宋体、方正楷体。
Face::字形,如粗体、斜体等。
Font::一个特定大小的typeface。如方正宋斜体五号,就是一个font。
字体类型设计者设计 typeface, 如Swiss,Arial; 所以typeface是一种设计类型;一个typeface加上字形(style)字号(size)就是一个字体(font)。
Glyph是一个字的不同字形,也就是字符的样子。不同字形的内码和一个字的内码相同。这在复杂文字中使用的比较广泛。譬如,蒙古文字母有独立、前中后、以及很多特殊变化。但是内码只有独立字母,其他的不同变化,还是使用独立字母的内码,它们会根据设置,自动或手动的使用。在OpenType中Glyph比较多。
在Symbian OS中,字体相关的类处理字体是用抽象的设备无关的方法,从而在不同设备上实现所见即所得。抽象的字体通过各种组件被映射到设备字体,这些组件通常是FBserver(font and bitmap server) 和打印设备。
位图字体(Bitmap font) 和 全真字体(TrueType font)
Symbian OS中支持位图字体和全真字体。下面是这两种字体的基本介绍(来自维基百科)。
位图字体(bitmap font)也叫点阵字体,其中每个字形都以一组二维像素信息表示。这种文字显示方式于较早前的电脑系统(例如未有图形接口时的 DOS 操作系统)被普遍采用。由于位图的缘故,点阵字体很难进行缩放,特定的点阵字体只能清晰地显示在相应的字号下,否则文字只被强行放大而失真字形,产生成马赛克式的锯齿边缘。但对于字号 8-14px 的尺寸较小的汉字字体(即现今操作系统大多采用的默认字号)现今亦仍然被使用于荧幕显示上,能够提供更高的显示效果;不过现今该种点阵字体主要只作为“辅助”的部分,当使用者设定的字体尺寸并没有拥有位图像时,字体便会以向量图象方式显示;而当打印时,印有字体无论大小亦会使用向量字型打印。
TrueType是由Apple公司和Microsoft公司联合提出的一种新型数学字形描述技术。它用数学函数描述字体轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。TrueType采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,其特点是:TrueType既可以作打印字体,又可以用作屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。但相对PostScript字体来说,其质量要差一些。特别是在文字太小时,就表现得不是很清楚。
TrueType字体,中文名称全真字体。它具有如下优势:①真正的所见即所得字体。由于TrueType字体支持几乎所有输出设备,因而无论在屏幕、激光打印机、激光照排机上,还是在彩色喷墨打印机上,均能以设备的分辨率输出,因而输出很光滑。②支持字体嵌入技术。存盘时可将文件中使用的所有TrueType字体采用嵌入方式一并存入文件之中,使整个文件中所有字体可方便地传递到其它计算机中使用。嵌入技术可保证未安装相应字体的计算机能以原格式使用原字体打印。③操作系统的兼容性。MAC和PC机均支持TrueType字体,都可以在同名软件中直接打开应用文件而不需要替换字体。
使用字体
在Symbian OS中选择使用字体时,有两种方式,一是使用Symbian OS自带的字体(native font),另一种是使用开放字体系统(Open font system)。无论使用哪种方式,一旦选定了字体,在绘画字体时都是一样的。所以在介绍绘画字体前,先介绍一下Symbian OS中的开放字体系统。
Symbian OS中开放字体系统是一个系统框架,它允许FBServer使用光栅插件。所谓光栅插件,实际上是一个dll文件,用来识别和读取字体文件中特定格式的字体,提供字符位图给FBServer。有了开放字体系统,就使得Symbian OS支持更多字体成为可能。一种字体文件是否支持取决于光栅插件。
开放字体系统对用户是不可见的,一旦光栅插件被安装,使用方法和Symbian OS自带的字体完全一样。
开放字体系(Open font system)的实现
Symbian OS中开放字体系统使得Symbian OS支持更多字体,这些字体是用户自定的。要使用自定义的字体,需要具备两个条件:自定义的字体文件和光栅插件。用户自己定义字体或使用其他bdf(Adobe’s Bitmap Distribution Format)文件,自己实现光栅插件来进行字体的识别。
字体文件
Symbian OS 中有自己的字体文件格式gdr。无论是根据字体定义文件的语法定义的文本文件,还是其他的bdf文件,都要使用Symbian提供的字体工具(fnttran.exe)来编译转化为gdr文件才能最终使用。至于如何定义和如何转化字体,这里就不一一介绍了,查看Symbian相关文档即可。
光栅插件(rasterizer plugin)
准备好自己的字体文件(gdr)后,就可以直接加载并使用。但如果是系统无法识别的字体,还要自己实现光栅插件。
Symbian OS中用这几个类来完成光栅插件的实现:COpenFontRasterizer, COpenFontFile 和COpenFont。这三个类都是抽象类,要实现光栅插件就需要分别从这三个类派生自己的类来实现。下面列出一个光栅插件实现的主要步骤:
l 创建一个DLL工程,这个DLL文件的第一个导出函数是一个工厂函数,这个函数的返回值是COpenFontRasterizer
指针,也就是要在这个工厂函数中创建COpenFontRasterizer
对象并返回。当FBServer开始运行时,系统会调用光栅插件的这个工厂函数生成光栅对象。
l 光栅对象是用来加载和识别字体文件的。在实现COpenFontRasterizer
的派生类时,必须实现COpenFontRasterizer
中的纯虚函数NewFontFileL,这个函数创建一个COpenFontFile派生类的对象并返回;当FBServer运行时,系统会调用NewFontFileL来生成COpenFontFile派生类对象。
l COpenFontFile对象拥有字体文中所有的typeface信息,并进行管理。它可以根据需要创建COpenFont派生类对象。
l COpenFont对象主要是在字体中为字符创建glyphs,这个过程就叫做光栅化(rasterization)。
l 方便起见,COpenFontRasterizerContext类提供一些光栅化操作函数。
下面是以上步骤的代码段:
//factory function,工厂函数
EXPORT_C COpenFontRasterizer* CreateRasterizerDllL()
{
return new(ELeave) CRasterizerExample;
}
//override NewFontFileL function,实现COpenFontRasterizer 的纯虚函数
COpenFontFile* CRasterizerExample::NewFontFileL(TInt aUid, const TDesC &aFileName, RFs &aFileSession)
{
return new (ELeave) CCMyFontFile(aUid,aFileName,aFileSession);
}
void CCMyFontFile::GetNearestFontInPixelsL(RHeap *aHeap, COpenFontSessionCacheList *aSessionCacheList, const TOpenFontSpec &aDesiredFontSpec, TInt aPixelWidth, TInt aPixelHeight, COpenFont *&aFont, TOpenFontSpec &aActualFontSpec)
{
...
aFont=new (ELeave) CCMyOpenFont(aHeap,aSessionCacheList,this);
...
}
void CCMyOpenFont::RasterizeL(TInt aCode, TOpenFontGlyphData *aGlyphData)
{
//这里实现光栅化操作
}
这些代码是光栅插件的主要代码框架,至于如何进行光栅化,就要看你的字体文件的具体定义了。
【待续】