矢量字体简介矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。
这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。
矢量字体主要包括 Type1 、TrueType、OpenType等几类。
又叫Outline font,通常使用贝塞尔曲线,绘图指令和数学公式进行绘制。
这样可以在对字体进行任意缩放的时候保持字体边缘依然光滑,字体色素不会丢失。
编辑本段分类目前主流的矢量字体格式有3种:Type1,TrueType和OpenType,这三种格式都是平台无关的。
Type1全称PostScript Type1,是1985年由Adobe公司提出的一套矢量字体标准,由于这个标准是基于PostScript DescriptionLanguage(PDL),而PDL又是高端打印机首选的打印描述语言,所以Type1迅速流行起来。
但是Type1是非开放字体,Adobe对使用Type1的公司征收高额的使用费。
TrueType是1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准。
Type1使用三次贝塞尔曲线来描述字形,TrueType则使用二次贝塞尔曲线来描述字形。
所以Type1的字体比TrueType字体更加精确美观。
一个误解是,Type1字体比TrueType字体占用空间多。
这是因为同样描述一个圆形,二次贝塞尔曲线只需要8个关键点和7段二次曲线;而三次贝塞尔曲线则需要12个关键点和11段三次曲线。
然而实际情况是一般来说 Type1比TrueType要小10%左右。
这是因为对于稍微复杂的字形,为了保持平滑,TrueType必须使用更多的关键点。
由于现代大部分打印机都是使用PDL作为打印描述语言,所以True1字体打印的时候不会产生形变,速度快;而TrueType则需要翻译成PDL,由于曲线方程的变化,还会产生一定的形变,不如Type1美观。
这么说来,Type1应该比TrueType更具有优势,为什么如今的计算机上TrueType反而比Type1使用更广泛呢?这是因为第一:Type1由于字体方程的复杂,所以在屏幕上渲染的时候,花费的时间多,解决方案是大部分Type1字体嵌入了点阵字体,这样渲染快,但是边缘不光滑,比较难看。
很多ps文档和ps转换的pdf文档都是这样,在计算机上浏览的时候字体很难看,但是打印出来很美观。
TrueType则渲染比较快,可以平滑的显示在屏幕上,看上去很美观。
第二个原因是Type1的高额使用费,使得Type1没有被所有的操作系统所支持。
Windows家族只有OS/2和windows 2000及之后的版本从操作系统级别开始支持Type1。
由于这个问题,Adobe只好在其所有的产品中嵌入Adobe Type Manager(ATM)作为渲染引擎。
OpenType则是Type1与TrueType之争的最终产物。
1995年,Adobe公司和Microsoft公司开始联手开发一种兼容Type1和TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenType。
OpenType 可以嵌入Type1和TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。
可以说OpenType是一个三赢的结局,无论是Adobe,Microsoft还是最终用户,都从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主频,ROM,RAM分别在100 MHz,2 MB,8 MB左右,所以,实用的机顶盒矢量字体应达到以下指标:①字库大小在2 MB以下;②动态内存占用在10 kB以下;③24×24字体呈现速度达到每秒250汉字以上。
2.1矢量字库的选择广义的矢量字库包括矢量字库和曲线字库,其中又分为单线体、笔画轮廓体、纯轮廓体、多线体。
为适应无级放大时的填充,建议选用笔画轮廓体或纯轮廓体。
曲线字库使用曲线函数描述字型,因此字库很小,一种字体的字库大多在700 kB以下,但每条曲线的拟合计算对机顶盒有限的硬件资源是一个沉重的负担,呈现速度很慢,约每秒20汉字。
矢量字库中直接描述了字体的坐标信息。
UCDOS中就提供了多种笔画轮廓体和纯轮廓体矢量字库,大多在1.3~1.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=indexAdd[3]×(256^3)+indexAdd[2]×(256^2)+indexAdd[1]×256+in dexAdd[0]+head由数据首地址和长度信息可取得字型数据信息。
3.3解码取得字型矢量信息为了压缩字库数据,节省存储空间,在字库中存放的字型数据一般并不是真正在呈现时用到的数据,而是以一定算法编码甚至压缩过的。
在呈现前需要对其进行解压或解码,还原出可用的字体轮廓信息。
解压、解码算法应由生成矢量字库者提供。
最终取得的字体轮廓信息,即以绝对或相对坐标系描述的字体边缘轮廓点集合,以及进一步由多个轮廓点形成闭合多边形,从而得到的轮廓多边形集合。
3.4绘出字体得到轮廓多边形后,即可进行字体呈现,具体步骤为:(1)在轮廓多边形每两点间连线,描绘轮廓;(2)填充轮廓多边形。
填充多边形的算法很普遍,在此不冗述。
根据需要,或为了提高显示速度,也可以只描绘轮廓,或不绘轮廓只进行填充。
填充笔画轮廓体时,注意两个笔画交叉处由于4条轮廓线相交产生的“井”字问题;填充纯轮廓体时,注意内部空心笔画的填充。
4字体变换及特殊效果4.1字体变换字体轮廓完全描述了字体外观,因此改变字体轮廓点的坐标就可以改变字体,实现字体变换,如常用的平移、缩放、旋转、倾斜等。
字体变换必须在得到绝对坐标轮廓点后进行,处于图1的第(3)步与第(4)步之间。
以下设点(x,y)为原字体轮廓上的绝对坐标点,点(x′,y′)为变换后字体轮廓的点,常用的基本变换算法如下:(1)平移设将字体向右平移dx,向下平移dy(dx为负则向左,dy为负则向上)x′=x+dxy′=y+dy(2)缩放设字体原始大小为width(宽)×height(高)(一般为96×96或128×128),变换为dw×dh:x′=x×dw/widthy′=y×dh/height若想精确字型,减少失真,建议进行四舍五入:x′=(x×dw+width/2)/widthy′=(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坐标大小由小至大排序,排序完成后,奇数点处于字体的左边缘轮廓线上,偶数点处于字体的右边缘轮廓线上。