矢量字体

简介
  矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变。矢量字体主要包括 Type1 TrueTypeOpenType等几类。
  又叫Outline font,通常使用贝塞尔曲线,绘图指令和数学公式进行绘制。这样可以在对字体进行任意缩放的时候保持字体边缘依然光滑,字体素不会丢失。
编辑本段分类
  目前主流的矢量字体格式有3种:Type1TrueTypeOpenType,这三种格式都是平台无关的。
  Type1全称PostScript Type1,是1985年由Adobe公司提出的一套矢量字体标准,由于这个标
准是基于PostScript Description Language(PDL),而PDL又是高端打印机首选的打印描述语言,所以Type1迅速流行起来。但是Type1是非开放字体,Adobe对使用Type1的公司征收高额的使用费。
  TrueType1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准。
  Type1使用三次贝塞尔曲线来描述字形,TrueType则使用二次贝塞尔曲线来描述字形。所以Type1的字体比TrueType字体更加精确美观。一个误解是,Type1字体比TrueType字体占用空间多。这是因为同样描述一个圆形,二次贝塞尔曲线只需要8个关键点和7段二次曲线;而三次贝塞尔曲线则需要12个关键点和11段三次曲线。然而实际情况是一般来说 Type1TrueType要小10%左右。这是因为对于稍微复杂的字形,为了保持平滑,TrueType必须使用更多的关键点。由于现代大部分打印机都是使用PDL作为打印描述语言,所以True1字体打印的时候不会产生形变,速度快;而TrueType则需要翻译成PDL,由于曲线方程的变化,还会产生一定的形变,不如Type1美观。
  这么说来,Type1应该比TrueType更具有优势,为什么如今的计算机上TrueType反而比Type1使用更广泛呢?这是因为第一:Type1由于字体方程的复杂,所以在屏幕上渲染的时
候,花费的时间多,解决方案是大部分Type1字体嵌入了点阵字体,这样渲染快,但是边缘不光滑,比较难看。很多ps文档和ps转换的pdf文档都是这样,在计算机上浏览的时候字体很难看,但是打印出来很美观。TrueType则渲染比较快,可以平滑的显示在屏幕上,看上去很美观。
  第二个原因是Type1的高额使用费,使得Type1没有被所有的操作系统所支持。Windows家族只有OS/2windows 2000及之后的版本从操作系统级别开始支持Type1。由于这个问题,Adobe只好在其所有的产品中嵌入Adobe Type Manager(ATM)作为渲染引擎。
  OpenType则是Type1TrueType之争的最终产物。1995年,Adobe公司和Microsoft公司开始联手开发一种兼容Type1TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenTypeOpenType可以嵌入Type1TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。可以说OpenType是一个三赢的结局,无论是AdobeMicrosoft还是最终用户,都从OpenType中得到了好处。Windows家族从Windows 2000开始,正式支持OpenType。打开系统的字体目录(一般是C:\Windows\Fonts\C:\Winnt\Fonts),可以看到:一个红A的图标的是点阵字体,两个重叠的T的图标是TrueType字体,一个O的图标就是OpenType字体。
矢量字体扩展名ttf
1前言
随着数字电视广播的发展,各大中城市陆续开播了数字电视节目。作为模拟电视到数字电视的过渡产品,STB(Set Top Box,机顶盒)正逐步走进千家万户。机顶盒作为直接面向用户的新兴家电产品,其人机交互界面(GUI)要美观大方。文字作为GUI界面的主要组成元素与信息承载点,其重要性不言而喻。
文字显示一般采用矢量或点阵两种字体,矢量字体可进行字体的无级放大、快速变形以及制作动画,放大后的字体平滑圆润,没有锯齿,做成的动画速度很快,感觉不到字型变换带来的滞留感。利用矢量字库进行字型变换,如平移、缩放、旋转、倾斜等,算法简单,速度快,失真小,效果好,可产生高质量的汉字输出。而点阵字体大小固定单一,不仅在放大缩小时很困难,效果也不好,速度慢,字体单调,很难达到美观的要求。使用矢量字体来提高机顶盒界面质量是有效的方法。
2机顶盒实现矢量字体的特殊要求
为节约成本,机顶盒的硬件资源往往很有限,CPU主频,ROMRAM分别在100 MHz2 MB8 MB左右,所以,实用的机顶盒矢量字体应达到以下指标:
①字库大小在2 MB以下;
②动态内存占用在10 kB以下;
24×24字体呈现速度达到每秒250汉字以上。
2.1矢量字库的选择
广义的矢量字库包括矢量字库和曲线字库,其中又分为单线体、笔画轮廓体、纯轮廓体、多线体。为适应无级放大时的填充,建议选用笔画轮廓体或纯轮廓体。
曲线字库使用曲线函数描述字型,因此字库很小,一种字体的字库大多在700 kB以下,但每条曲线的拟合计算对机顶盒有限的硬件资源是一个沉重的负担,呈现速度很慢,约每秒20汉字。
矢量字库中直接描述了字体的坐标信息。UCDOS中就提供了多种笔画轮廓体和纯轮廓体矢量字库,大多在1.31.7 MB左右,呈现速度约每秒300汉字,是很好的选择。
2.2程序优化
在编制程序时要进一步优化程序的运行速度和内存使用。首先优化核心循环、核心算法,如解码、填充,必要时使用嵌入汇编;其次去除冗余代码,多用移位代替乘除,在许可范围内以空间换时间。
矢量字体的性能主要由字库决定,生成或选择一个好的字库是实现机顶盒矢量字体的关键,程序算法在一定程度上能提高性能,弥补不足。
3矢量字体的呈现
矢量字库一般包括字库信息、索引区、空白区和数据区几个部分,其中最重要的是索引区和数据区。根据字库结构,矢量字体的呈现步骤如图1所示。

1矢量字体的呈现步骤
3.1计算索引值
矢量字库的索引值一般与字符的区位码相关,得到区位码后,就可以通过其计算得到索引值存放的相对首地址,计算公式应由生成矢量字库者提供。用此相对首地址加上字库在机顶盒存储区中存放的首地址,即可取得索引信息的绝对地址。
在程序中,汉字是以机内码的形式存储的,每个汉字占用两个字节:第一个字节为区码,为了与ASCII码(小于80H)区别,范围从A1H开始,对应区位码中区码的第一区;第二个字节为位码,范围也是从A1H开始,对应某区中的第一个位码。这样就有汉字的索引信息首地址:
indexAdd=((x1-0xA0)×94+y1-0xA0)×L+head
其中,x1为汉字内码高位;y1为汉字内码低位;L为索引项长度;head为字库在机顶盒存储区中存放的首地址。
取得索引信息首地址后,就可以提取长度为L的索引信息。
3.2提取字型数据
索引信息中包含了字型数据在库中的偏移地址和字型数据的长度信息。数据长度可由后一索引的偏移地址减去当前索引的偏移地址得到,为了减少字库大小,也有字库在索引信息中去掉数据长度,只保留了数据地址信息。
在矢量字库中每个字符或汉字的索引信息是定长的,一般为4字节或6字节(含2字节数据长度信息)。由4字节的偏移地址得到字型数据首地址dataAdd
dataAdd=indexAdd3]×(256^3)+indexAdd2]×(256^2)+indexAdd1]×256+indexAdd0+head
由数据首地址和长度信息可取得字型数据信息。
3.3解码取得字型矢量信息
为了压缩字库数据,节省存储空间,在字库中存放的字型数据一般并不是真正在呈现时用到的数据,而是以一定算法编码甚至压缩过的。在呈现前需要对其进行解压或解码,还原出可用的字体轮廓信息。解压、解码算法应由生成矢量字库者提供。
最终取得的字体轮廓信息,即以绝对或相对坐标系描述的字体边缘轮廓点集合,以及进一步由多个轮廓点形成闭合多边形,从而得到的轮廓多边形集合。
3.4绘出字体
得到轮廓多边形后,即可进行字体呈现,具体步骤为:
1)在轮廓多边形每两点间连线,描绘轮廓;
2)填充轮廓多边形。
填充多边形的算法很普遍,在此不冗述。根据需要,或为了提高显示速度,也可以只描绘轮廓,或不绘轮廓只进行填充。
填充笔画轮廓体时,注意两个笔画交叉处由于4条轮廓线相交产生的“井”字问题;填充纯轮廓体时,注意内部空心笔画的填充。
4字体变换及特殊效果
4.1字体变换
字体轮廓完全描述了字体外观,因此改变字体轮廓点的坐标就可以改变字体,实现字体变换,如常用的平移、缩放、旋转、倾斜等。
字体变换必须在得到绝对坐标轮廓点后进行,处于图1的第(3)步与第(4)步之间。以下设点(x,y)为原字体轮廓上的绝对坐标点,点(x,y′)为变换后字体轮廓的点,常用的基本变换算法如下:
1)平移
设将字体向右平移dx,向下平移dydx为负则向左,dy为负则向上)
x=x+dx
y=y+dy
2)缩放
设字体原始大小为width(宽)×height(高)(一般为96×96128×128),变换为dw×dh
x=x×dw/width
y=y×dh/height
若想精确字型,减少失真,建议进行四舍五入:
x=x×dw+width/2/width
y=y×dh+height/2/height
3)旋抓
设字体绕原点逆时针旋兹角:
x=x×cosθ-y×sinθ
y=x×sinθ-y×cosθ
4)倾斜
设字体下端不变,上端向右倾斜θ角(θ为负则向左倾斜),height为字体高度:
x=x+height-y)×tgθ
y=y
组合以上的基本变换,可实现组合变换。
例如要实现绕固定点(ox,oy)逆时针旋兹角,按照以下步骤即可实现。
1)平移(-ox,-oy);
2)旋兹角;
(3)平移(ox,oy)。
4.2字体特殊效果
光靠改变字体轮廓无法实现一些特殊文字效果,此时需进行特殊处理。下面介绍几种常用特殊效果的处理方法:
1)加粗
加粗分为横向加粗和纵向加粗,实现常见的加粗效果只需横向加粗即可。
横向加粗的基本思想:沿Y轴自上而下以水平线扫描字体,对每一条水平线求出其与字体轮廓线的一组交点;对这一组交点按点的x坐标大小由小至大排序,排序完成后,奇数点处于字体的左边缘轮廓线上,偶数点处于字体的右边缘轮廓线上。将奇数点向左扩展,偶数点向右扩展,即实现字体横向加粗。
纵向加粗:与横向加粗的通理相同。
2)阴影
最简单的办法是用阴影与原坐标错开一点距离绘字,再用字体在原坐标位置呈现字体覆盖即可。错开距离较小时,阴影字可只绘轮廓以提高速度。
亦可遵循加粗中的思想,出字体的右边缘点和下边缘点,以阴影加粗字体。
3)阳文与阴文
实现此效果必须采用纯轮廓体矢量字,笔画轮廓体可以转换成纯轮廓体来实现。
首先遵循加粗中的思想,按横向出字体的左边缘和右边缘,按纵向出字体的上边缘和下边缘:
阳文:绘制右边缘和下边缘,不填充,最好以阴影,绘制右下边缘阴影。
阴文:绘制左边缘和上边缘,不填充,最好以阴影,绘制左上边缘阴影。
4总结
本文所论述的矢量字体技术在基于PSOS嵌入式系统的机顶盒上,使用ANSI-C标准语言开发实现。
矢量字体可以无级缩放,快速变换,美观大方,拥有点阵字体无法比拟的优点。作为新一代的智能家电,在机顶盒上使用矢量字体是大势所趋。随着机顶盒技术的发展,矢量字体必将得到更加广泛的使用。

[发表时间2005-6-6 23:06:00]
摘要:介绍嵌入式数字卫星接收机的字符显示原理。提出一种提取Windows矢量字库信息以及将其转换为点阵字库格式的方法。给出主要模块的流程图和VC程序实现。在DVB-S接收机顶盒系统中的应用验证了该方法的有效性。
    关键词:矢量字库 机顶盒 字符转换
引言
在当前嵌入式系统设计中,广泛涉及到字符和图标的显示。过去的方法通常是使用硬件自带字库或者转换中文操作系统(例如UCDOS)的点阵字库,但随着嵌入式开发技术的发展,人们对用户界的要求也越来截止高,大小固定、字体有限、使用不便的点阵字库已经难再满足要求。于是众多开发人员将目光投向了Windows操作系统丰富的字库和图标资源,以Widnows 2000系统为例,其OpenType矢量字库有基于Unicode内码的四万多个字符,特殊符号以及近百种字体可以选用。但是Windows系统结构复杂,难以直接提取矢量字库,并且矢量字库解析算法涉及到MicorosoftAdobe公司OpenType字体专利,这些问题为Windows字库的使用带来了很大的困难。
在笔者参与的DVB-S数字卫星接收机顶盒用户界面的设计工作中,也遇到了同样的问题。按照设计要求,需要用到一套完备的,支持包括俄、德、拉丁、阿拉伯等多种语言和特殊符号的小型字库,但是难以到合适的现成字库,在参考了一些商业字模提取软件的功能后,提出了一种提取Windows矢量字符以及图标资源的方法,并用Visual C++6.0程序实现。实际应用表明,用本方法生成的字库字形美观,字体多样,完全可以替代商业字库,同时还具有使用方便,便于扩展等优点。
1 机顶盒图文显示原理
机顶盒中文字和位图的显示是通过OSD(图文屏显技术)模块完成的。传统的屏显示OSD主要应用在VCRLD和电视机上,采用专用的芯片修改屏幕上指定部位的信号的角度和亮度,实现模拟视频的同步改变,从而达到显示的目的。含有OSD的视频输出信号在屏幕上从底向上以6个层次显示:边界颜、静止视频图像、活动视频图像、OSD背窗口、OSD位图区域和OSD硬件游标。本文介绍的机顶盒系统是基于ST公司的方案,接收机软件是ST公司为其数字卫星接收机硬件评估板配套提供的。其主芯片采用Sti5518微控制器,内部集成OSD处理单元。OSD功能模块框图如图1所示。



    OSD功能模块位于NTSC/PAL/SECAM编码之前,包括一张颜查表(LUTs)、Alpha混合滤波器和控制逻辑单元,所有子功能先于将信息从重建缓冲区传到SDRAM或与其它静态图像混合前执行。
当要输出图文信息时,将字符图标的位图信息送至OSD位图区域的相应位置。OSD位图区域由其头部定义,每个OSD头主要包括OSD显示短形区域的起始位置、大小及两个分别指向顶场和底场图像数据的指针(这是针对隔行扫描显示方式;对于逐行扫描,这两个指针向同一块内存区域),还有一个指向下一个OSD位图数据头的指针。由于采用了这种基于指针的OSD数据管理结构,理论上OSD位图数据块的数目不受限制,实际上它要受到内存大小的限制。头部不仅定义了位图区域的尺寸、位置以及及颜信息,而且提供了颜表更新等功能。字符的颜设置使用OSD处理单元(LUT)的颜查表,也称做调板。2位的LUT意味着有4种颜可以选择,并且位图中的每个像素仅占有存储单元的2位。如果是透明文字,还要把第一个像素的调板颜值定为透明掩码值,这个过程由Alpha混合处理完成。如果输出像素不在OSD区域,停止处理视频接口处理器数据;如果输出像素在OSD区域,OSD数据或OSD和视频接口处理数据的混合数据经Alpha混合滤波处理后以16YCCb,Cr)格式传输。对于调板颜值是透明的情况,则直接传送视频数据而略过OSD位图数据。
OSD的软件部分可以分为两部分:硬件抽象层和图形函数接口。OSD模块软件部分为整个系统软件部分提供一系列的图形函数接口,是实现图文显示的基础,也是给用户提供一个方便直观的图形文字交互方式的保障。本文中硬件抽象层为ST公司提供的STAPI函数库,图形函数接口在中间件的基础上自行开发。
由此可见,在机顶盒系统中字符输出有三个主要步骤:①系统专用字库的建立;②字符数据的查;③调用OSD模块功能将字符在屏幕上输出。下面介绍如何通过转换Windows矢量字符,建立一套功能完善,使用方便的字库系统。
2 提取矢量字符
Winodws矢量字库存储汉字的矢量图形。因为存储的是笔样条,对于字符做旋转、缩放、甚至三维拉伸都不会产生失真,但在字符显示的时候需要计算样条曲线而增加了计算量。由于嵌入式系统只是针对专一控制应用的系统,处理器的性能和资源还不如PC机,一般使用的仍然是点阵字库。本文介绍的DVB-S机顶盒系统同样没有直接使用矢量字库;而是通过提取Windows中矢量字库的方法将矢量字符转换成相应的点阵信息。在本开发方案中,字库文件中所有汉字的字模信息和图标信息被存储到两个大的数组中,并作为一个头文件包含在汉字显示模块中。利用计算出的偏移值得到字模数组中的下标,从而得到汉字存放在数组中的字模点阵信息。使用程序存储器空间做字库,这在汉字用量不大的情况下是一种较完美的解决方案。本系统中负责屏显功能的API函烽是STOSD函数库,里面已把位图的宽度定义为32像素的整数倍。这是由于系统的内存操作函数只能对16字节整数倍的块进行拷贝操作,否则内存只能一个字节一个字节地填充,速度非常慢。例如在16的调板情况下,无论是24×24点阵还是32×32点阵,基于字符单元宽度统一为32像素。一个宽为32像素,高为28像素的基本字符点阵信息需要一个大小为28字节的整型数组为记录。以开发方案为例,大小为500字符的24×24点阵小型字库将需要24 000字节的ROM空间。

    转换的关键是要获得矢量字库的点阵信息。程序中,回避了较困难的直接解板矢量字库问题,巧妙地从PC显示缓冲区中获得位映像数据,再将其转换成OSD模块函数支持的点阵格式。位图法转换矢量字符的算法如下。
①把汉字以位图的形式显示在指定的32×28的点阵区域内,然后按行提取像素点,每1行以8个像素点为1个字节(14个字节),以二进制补码的形式分别存放在4个字节里。最低字节存放每一点阵行的前8位。每一行结束后将其转化为十六进制点阵码并保存于一个整型数组中。
②整个字符转换结束后放在字库信息文件里,生成一个字符区域地址映射表,为后面的字符分组查提供方便。同时生成字符宽度、高度、字体、风格以及代码页等相关信息。
西文“特殊”字符(拉丁字符集里的第128255字符,码值大于0x80)的转换是提取矢量字符过程中需要注意的问题。通过VC 6.0开发环境可以把执行文件编译成UnicodeASCII两片版本。对于Unicode内码版本的应用程序,Windows 2000对其字符的显示有着很好的支持,但对于ASCII版本的应用程序则存在一定问题。当在应征程序中输入字符时,因编辑框只支持单字节,系统会将双字节的Unicode输入字符重新解释,造成的后果是程序无法正确接收这些字符,输出的特殊字符也一律被显示为“?”。本文的矢量字库提取程序为了和Win9x操作系统兼容而被设计为ASCII版本。为了解决上述问题,程序沿用了代码页的方法。代码页是一个内部表,操作系统将字符、数字和标点等符号映射为字符编号,不同的代码而支持不同国家所使用的字符集。代码页通过编号引用,例如,代码页932代表日 本字符集,950代表繁体中文字符集。由代码页确定字符集,首先把需要转换的特殊矢量字符编辑后以RTF富文本格式的文本保存,矢量字符提取程序打开RTF文件并插入文本到视图中,读取每个特殊字符的值并转换成十六进制。然后读取RTF文件内的代码页编号和字体,尺寸和风格等标签。根据代码页确定对应的字符集,根据标签设置显示字符属性。最后按一般字符的输出方法将特殊字符显示在视图中。
3 程序实现
31 功能设计和界面设计
主程序为MFC生成的SDI单文档程序。视图类由CscrollView派生,显示的字符和位图可以自由地放大和缩小,当字符超过窗口大小时视图自动滚动,以满足提取不同大小库点阵的需要,用一个RichEditBox控件来接收输入字符。添加静态控件,显示字符点阵的宽、高等信息。在菜单栏分别添加插入位图、插入图标、插入特殊字符、字体设置、字体放大和字体缩小等菜单项。
程序的界面如图2所示。图中程序正在提取阿拉伯矢量字符集,使用该程序时直接在该工具的图形操作界面下输入需要提取的字符或者插入位图和图标。待调整好全部所需的字符图标后点击保存,程序自动转换矢量字符和图形并生成存入文件。实现的功能有:①能在视图显示RichEditBox控件内输入英文、汉字等矢量字符,并通过图形设备上下文CDC读取视图的点阵信息;②能读取所有插入RTF文本内的特殊字体点阵信息;③能读取插入的位图和图标点阵信息;④能将点阵信息保存在font.h文件中,并添加字库索引表和字符宽、高、字体等信息。

    32 主要类和模块
CfontViewCscrollView派生类,负责字符和图标的缩放显示,CfontModule类封装了字符串操作函数,CtextSetDlg类负责字符属性的设定。程序中点阵信息的数据、位图和图标的数据和字符串数据分别封装在类CdotMatrixCimageElemntCwordElement中。在主要的模块函数里,Create_Text_Dot_MatrixCreate_Bmp_Dot_Matrix函数是本程序的核心函数。功能是在内存中形式位映射数据,完成矢量汉字或矢量图形向点阵数据的转换。设向量图型尺寸宽width像素,高height像素,程序流程如下:
①计算该位图对应的缓冲区尺寸。每行长度为:BytePerLine=(width+1)/8,缓冲区大小为Buffersize=BytePerLine*height
②申请内存缓冲区。如果内存不足以容纳整 个图形,则可以分段处理。
BufferPtr=(unsigned char*)malloc(BufferSize)
③计算坐标点在所申请内存缓冲区的偏移量和屏蔽位。设原点(00)在内存中的偏移量为0,则图中任意一点Px,y)相对于原点(00)的偏移量为
offset=y*BytePerLine+x/8,该点对应的字节内屏蔽位为mask=0x80>>(X%8)
④读取点Px,y)在内存中对应的颜值value,读取所在的字节。
byte=(unsigned char)*(Bufferptr+offset),取该点对应的位,
value=byte & mask最后得到点阵信息,输出到屏幕或磁盘文件。
33 主程序流程
主程序流程图如图3所示。首先进入响应用户消息分支,当从编辑框输入标准汉字或ASCII字符,程序检查字符同码判断字符有效性,若满足条件则跳至显示部分;当用户从外部磁盘插入图标或位图图片,程序直接读入文件数据;如果插入的是特殊字符则进入RTF格式文本解析部分,得到特殊字符的代码页、字体、大小等信息。然后将字符图标信息在视图中显示,此时可通过图形界面调整字符外观。通过获得内存中图像信息形成位映射数据,计算点阵数据。最后将字库点阵和索引表、字体、大小等附加信息按头文件格式保存到字库文件中。程序源代码见网站www.dpj
4 结论
实际应用中,本方法可以有关键人物 地提取Windows环境下矢量字库的字模,满足嵌入式机顶盒系统的开发需要。字模提取程序具有多种功能,可以生成各种大小风格的字体、符号和图形点阵信息,从而使机顶盒能利用Windows中丰富的字体和图像资源,显示更为精彩的图形用户界面。

本文发布于:2024-09-22 00:54:05,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/436160.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字体   字符   信息   矢量   数据   字库
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议