在介绍如何使用和显示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)

{

//这里实现光栅化操作

}

这些代码是光栅插件的主要代码框架,至于如何进行光栅化,就要看你的字体文件的具体定义了。

【待续】

Symbian OS应用编程图形篇之字体(1)相关推荐

  1. Symbian OS应用编程图形篇之架构

    Symbian OS 9.5 版本中引入了ScreenPlay技术.ScreenPlay是一个新的图形架构,它可以使智能手机制造商充分利用软件性能的提升.硬件的加速及第三方的图形引擎.ScreenPl ...

  2. Symbian OS C++程序员编码诀窍

    版权©属于诺基亚公司( 2003年),诺基亚公司保留全部权利 "诺基亚"及"诺基亚科技以人为本"是诺基亚公司的注册商标.Java和所有基于Java的标志是Sun ...

  3. 跟着Code走,详解Symbian OS API调用过程

    作为一个被Symbian开发折磨过的人,当得知Symbian开源时,忍不住马上跑到developer.symbian.org上瞧一瞧,看看自己具体是怎样被折磨的.看了一段时间之后,想想还是把有些东西记 ...

  4. Shell编程进阶篇(完结)

    1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或 ...

  5. Symbian OS 精要

    一般诀窍 1.'Symbian 开发师网络'提供大量信息资源,协助您为 Symbian OS 操作系统编写应用程序.您应经常访问 www.symbian.com/developer 网站以便获取最新的 ...

  6. Symbian C++手机编程中字符串处理

    Symbian C++ 手机编程中的字符串处理和标准 C/C++ 有很大的不同,它提供了一种安全.有效的机制来处理串和二进制数. 通过比较C相对于Symbian OS中对串的不同处理来认识描述符,字符 ...

  7. symbian OS 简单介绍

    symbian OS 就是symbian操作系统. 1 什么是symbian? 也被称作EPOC系统,这是最早由Psion公司开发的一个专门应用于手机等移动设备的操作系统.目前由诺基亚.爱立信.松下. ...

  8. Symbian OS

    目录·Symbian 概述 ·基于Symbian的UI ·Nokia开发的UI平台 ·UIQ开发的UI平台 ·Symbian智能手机 ·Series 60界面介绍 ·Symbian的特点 ·Symbi ...

  9. Symbian OS简介

    原文地址:http://blog.csdn.net/wh_xiexing/archive/2007/11/15/1887002.aspx 1.1.    Symbian系统简介        当前有很 ...

最新文章

  1. Jenkins连接TFS出现错误:“jenkins com.microsoft.tfs.core.exceptions.TECoreException”的问题收集...
  2. navicat 批量插入 测试数据
  3. 普通路由器改4g路由器_4G工业路由器助力叉车锂电池监测
  4. HDU 1151 Air Raid
  5. 我的CSS样式记事本(1)
  6. merge规则 python_用Python处理PDF
  7. XGBoost算法原理
  8. Ubuntu 安装 brightness-controller 调节显示亮度
  9. linux用户权限不够解析及解决方案
  10. 20155311《网络对抗》信息搜集与漏洞扫描
  11. 如何登录锐捷设备(业务软件篇)
  12. 华为服务器如何重新安装系统教程,华为服务器重新安装系统
  13. 删库跑路技巧 删库跑路命令
  14. 《盟威软件快速开发平台》开发
  15. HEVC码率控制代码分析
  16. 常用计算机控制芯片有哪些,电脑基本芯片的认识的常用知识介绍
  17. 平板电脑做linux服务器,平板电脑安装Ubuntu教程-以V975w为例,Z3735系列CPU通用
  18. pc控制android源码,pc 通过vnc控制android
  19. opencv 锐化 java_Java Opencv 实现锐化
  20. 二类电商网页设计_用类设计网页

热门文章

  1. 财务信息化市场已经被瓜分完了吗?
  2. 好用的甘脑图软件分享
  3. VGG(visual geometry group,超分辨率测试序列)
  4. Dev-Control-gridview的属性说明
  5. Java8新特性之consumer的用法
  6. Java | cst_时间格式中的CST和sat是什么
  7. 您的下个中文网站可以使用的5个高质量中文Webfont
  8. TED(指technology, entertainment, design在英语中的缩写,即技术、娱乐、设计)
  9. Stateflow使用C语言结构体,关于使用Stateflow调用外部C代码的教程介绍
  10. 主动噪声控制方向期刊