当前位置:主页 > 平面设计 > PS教程 > 字体设计 > 字体常识

最新发布

字体分类
字体分类

字体分类平时我们常见的字体格式主要有以下几种:  1.光栅字体(.FON)  这种字体是针对特定的显示分辨率以不同大小存储的位图,用于Windows系统中屏幕上的菜单、按钮等处文字的显示。它并不是以矢量描述的,放大以后会出现锯齿,只适合屏幕描述。不过它的显示速度非常快,所以作为系统字体而在Windows中使用。  2.矢量字体(.FON)  虽然扩展名和光栅字体一样,但是这种字体却是由基于矢量的数学模型定义的,是Windows系统字体的一类,一些windows应用程序会在较大尺寸的屏幕显示中自动使用矢量字体来代替光栅字体的显示。  3.PostScript字体(.PFM)  这种字体基于另一种矢量语言(Adobe PostScript)的描述,常用于PostScript打印机中,不过Windows并不直接支持这类字体,要在Windows使用这类字体需要安装"Adobe Type Manger"(ATM)软件来进行协调。  4.TrueType字体(.TTF)  这是我们日常操作中接触得最多的一种类型的字体,其最大的特点就是它是由一种数学模式来进行定义的基于轮廓技术的字体,这使得它们比基于矢量的字体更容易处理,保证了屏幕与打印输出的一致性。同时,这类字体和矢量字体一样可以随意缩放、旋转而不必担心会出现锯齿。苹果字体分类:■位图字体(如New York9、New York12等),多数位图字体都提供一小套标准的大小,通常是9、10、12、14、18和24磅。毛病是容易出现锯齿,为落伍的字体技术。■ 轮廓字体 (可缩放字体,是相对于位图字体而言),位图字体显示效果好,轮廓字体打印效果好。两种基本类型的轮廓字体是:TrueType和PostScript■ TrueType 字体最先由Apple公司开发,是目前Mac上的主要字体类型。位图字体仅能以它们的单个固定大小来显示比例,TrueType字体会以三种不同的大小来显示比例。通过名称也能区分,位图字体命名时总是还有表示大小的数字(如New Work12),TrueType字体命名时则不带数字(如New York)。■ PostScript字体最先由Adobe公司开发,是一种页面描述语言,用来描述图形和文本输出(通常是至 PostScript 打印机)的位置和外观。PostScript 打印机可打开由任何类型的字体所创建的文本,但为最大程度上利用 PostScript 的性能,用户需要专用的 PostScript 字体。         Macintosh PostScript 打印机多数是激光打印机,但并不是所有的激光打印机都包含 PostScript。喷墨打印机一般都不是 PostScript 设备,但有些喷墨打印机包含有 PostScript 解释器或可选择添加这样一个解释器。PostScript 字体通常称为打印机字体。        Adobe公司的 Adobe Type Manager(ATM) 专门针对PostScript 字体的使用而设计。ATM Deluxe 为 ATM的增强版本。ATM是控制板,ATM Deluxe 是应用程序。ATM是一个很容易引起软件冲突的控制板,千万不要企图更改其文件名(即撤除~符号),否则是崩溃和死机的直接做法。

4 次浏览
也谈生僻字的信息处理
也谈生僻字的信息处理

摘要:汉字生僻字的输入,一直是困扰文史工作者的难题,本文试在前人的研究基础上,提出一些关于汉字信息处理的设想和相关的解决方案。  关键字:生僻字;字符集;信息处理   汉字的信息处理经过多年的摸索,冲破了以前汉字不能进入计算机的迷信,取得了可喜的成绩,但离能完全满足实际使用的需要还有很长一段距离。  我们先回顾一下计算机中的字库,然后讨论生僻字的信息处理方法。                一、汉字库发展简介  汉字库通俗地说就是计算机软件系统中的汉字仓库,依据不同的标准,字库中汉字的数量是不同的,以前的主要标准有:  1、GB 2312 汉字编码字符集  从1975年开始,我国为了研究汉字的使用频度,进行了大规模的字频统计工作,内容包括工业、农业、军事、科技、政治、经济、文学、艺术、教育、体育、医药卫生、天文地理、自然、化学、文字改革、考古等多方面的出版物,在数以亿计的浩瀚文献资料中,统计出实际使用的不同的汉字数为6335个,而其中有3000多个汉字的累计使用频度达到了99.9%,而另外的3000多个累计频度不到0.1%,说明了常用汉字与次常用汉字的数量不足7000个,这就为国家制定汉字库标准提供了依据。1980年颁布了《信息交换用汉字编码字符集―基本集》的国标交换码,国家标准号为:GB2312-80,选入了6763个汉字,分为两级,一级字库中有3755个,是常用汉字,二级字库中有3008个,是次常用汉字;还选入了682个字符,包含有数字、一般符号、拉丁字母、日本假名、希腊字母、俄文字母、拼音符号、注音字母等。以前我国大陆的各种中文DOS版本、Windows3.1 /3.2版本,装入的字库都是国标一二级字库。遇到“F、、t、、t、住②S、、、Q、摹…”等汉字,既无法输入,又不能打印。后来国家技术监督局又颁布了一个与之相对应的繁体字集,全称《信息交换用汉字编码字符集辅助集》,标准号为GB/T12345-90。  2、* BIG5 字库  BIG-5码是通行于*、香港地区的一个繁体字编码方案,俗称“大五码”。地区标准号为:CNS11643,这就是人们讲的BIG5码。  BIG-5码收录汉字13053个,分为常用字和次常用字两部分,各部分中的汉字按笔划/部首排列。其中常用字5401个,包括*教育管理部门颁布的《常用汉字标准字体表》中的全部汉字4808个,*中小学教科书常用字587个,异体字6个;次常用字7652个,包括*教育管理部门颁布的《次常用汉字标准字体表》的全部汉字6341个,《罕用汉字标准字体表》中使用频率较高的字1311个。  后来为了协助解决众多使用BIG5码单位于进行公文电子传递时遇到自造字无法转换CNS的问题,实行了“BIG5码字集扩编计划”,1986年7月扩编完成,这就是所谓的“BIG5+码”。  BIG5+码系以CNS为蓝本,共增编标准字集4760个字符与推荐字集3250个字符;其标准字集即纳编CNS第3字面字集内之4145个,第4个字面字集内之219个字,均为一般文书常用之中文字,总支持文字量达141376个  3、大字符集字库(又叫GBK字库)国际标准化组织为了将世界各民族的文字进行统一编码,制定了UCS标准。根据这一标准,中、日、韩三国共同制定了《CJK统一汉字编码字符集》,其国际标准号为:ISO/IEC10646,国家标准号为:GB13000-90,该汉字编码字符集就是通常人们所说的大字符集,它编入了20902个汉字,收集了大陆一二级字库中的简体字,*《通用汉字标准交换码》中的繁体字,58个香港特别用字和92个延边地区朝鲜族“吏读”字,甚至涵盖了日文与韩文中的通用汉字,满足了方方面面的需要。Windows95/98/NT/2000中都装入了大字符集汉字库,人们一般称它为GBK(“国家标准扩展”的拼音缩写)字库。  4、新标准汉字库  2000年3月,国家信息产业部和质量技术监督局在北京联合发布了《信息技术和信息交换用汉字编码字符集、基本集的扩充》,国家标准号为:GB18030-2000,收录了27000多个汉字,还收录了藏、蒙、维等主要少数民族的文字,以期一举解决邮政、户政、金融、地理信息系统等生僻汉字与主要少数民族语言的输入,该标准于2000年12月31日强制执行。 GB 18030-2000 作为 GBK for Unicode 3.0 的更新而诞生,它带有包含所有Unicode 的扩展,完全向下兼容 GB 2312-1980 和 GBK。               二、对于汉字库设计的想法  字集不是越大越好,因为现存于大型字典辞书的字有一部分是历史用字,还有大量的异体字。根据使用的需要和研究的情况,对汉字的信息处理可以分为几个层次  1、日常生活用字:(可有一个人名、地名辅助集和错字集)  日常生活用字就是常用字,这个数字可能就在3000字左右,再加上一些次常用字,可能也就在6000字左右,当然,其中哪些是常用字,哪些是次常用字,具体的字可能要随着时代不同而发生变化。日常生活用字要求有规范性,现在进行的“规范汉字表”课题研究可能有助于此字集的确定。人名和地名用字是一个比较特殊的问题,国家语言文字工作委员会正在进行“人名、地名规范”的研究,如果此研究成果面世,则可能有助于解决现代人的人名、地名用字问题。此集中最好还应该有一个错字集,在早期识字教育和对外汉语教学中,经常要使用到一些错别字,别字好打,缺笔少划的错字没有办法处理,所以应特置一个错字集,有利于错别字教学的信息化与错别字的集中纠正。  2、一般古籍整理用字:(应该有一个异体字辅助集)  古籍用字,数量比现代生活用字多。因为历代沉积下来的异体字、死字比较多。关于这个问题,首先应该进行异体字的整理,异体字整理完成后,正体字就可以确定一个数量。为了保持古籍版本原样,古籍整理工作者和语言文字研究者也要用到异体字,所以附录一个异体字集。  还有一个问题就是方言字,很多方言字来源于古代的字典辞书、地方韵书和方言词典,少部分来源于民间文艺作品。首先方言字有一个规范的问题,那些有本字又意义比较明确的,应该首先选用本字。如本字不明,可沿用俗字。  3、古文字用字:(也有一个异体字辅助集)  关于古文字,一般定义为小篆以前的文字为古文字,其中有很多字还不可识,这种情况,就首先要区分出可识字(与小篆或楷书有对应字)与不可识字,然后进行异体字的整理。并且要能为每个不可识字设计可以调用的编码,以利于检索。  汉字库的设计,针对不同的用户与使用目的,分级分层次是很必要的。各级之中首先要全,同时要考虑各级之间正体字与异体字、繁体与简体、古文字与今字的正确对应等。  此外,各种常用图符也可考虑收录到各级字库中,如传世古籍中出现的圈点符号、古文字中的有句读作用的符号。少数民族和外域的汉字型变体字,也可考虑单置一类,以有利于文字的比较研究。  以下所使用的操作系统,没有特别指出的为Windows98,字处理软件则为Word2000。其它则专门指出。  (一)利用GBK汉字集解决生僻字的输入方法。  微软从Windows 95(简体中文版)视窗操作系统起,都采用了GBK字库,该字库收字20902个,基本能满足日常生活用字(生僻人名、地名字除外)。要利用该字库,通常可采用下列几种方法。  1.改用GBK输入法  Windows 95版本及以后版本提供了 GBK 内码、GBK 全拼、GBK 双拼、GBK 表形码和 GBK 郑码5种 GBK 输入法。但这些输入法不是安装的默认选项,需要从“控置面板”中打开“输入法”对话框来添加。Windows 98 默认安装全拼输入法则可以选择输入一般汉字和 GBK 汉字(使用该输入法的属性设置)。其它同样需要安装。  这些 GBK 输入法中只有全拼比较常用,而且,这些输入法所输入的汉字,包括了 GBK 繁体和 GBK 简体,数量非常大,所以造成两方面的不便:一是重码率高,选字非常麻烦;二是繁体简体同时出现,有些字不容易分辨繁简,同时如果不知道字的读音,也很难选择拼音输入法。  现在已有软件研制商研制出能输入GBK字库的五笔字形输入法,如智能陈桥,对于熟悉五笔输入法者,比较便利。  2、用Word插入符号的方法  选“插入”菜单中的“符号”命令,在“字体”下拉列表中选“标准字体”(Word97是“宋体”),在“子集”中选“CJK统一汉字”(Word97是“部首及难检字”)。一般可在列表中找到所需的汉字。虽然该字库大致是按部首和笔画进行编排的,但查找起来还是相当麻烦。以前有万学仁先生编有《通用字符集部首表及区位码(16进制)》[1],有利于查找,如果没有该部首表,还有一种方法可以采用,先输入一个与所要输入的生僻字相同偏旁的汉字,并选中该汉字,然后用鼠标单击“插入”菜单中的“符号”项,此时会弹出“符号”对话框,再用左右方向箭进行逐个查找和挑选,就会很快找到该生僻字的。如果是一个独体字,则可以输入一个笔画相同的的独体字(也不作偏旁)。很快会在其附近找到该字。  (二)GBK字集以外生僻字的输入  1、使用Windows自带的“造字程序”  该程序操作简单,使用方便,既可以用两个字重新拆分组合成一个新字;也可以选一个相近的字加以修改而造一个新字;还可以直接在编辑框中画出您所需要的字,比较便利的是前两种方法,其步骤如下。  (l)取两个字中有用的部分,重新组合成一个新字。以“

4 次浏览
妙用Word搞定生僻字
妙用Word搞定生僻字

     用计算机的时候,有时会遇到一些生僻字,特别是人名和地名中常常出现,如 “A”、“”、“础薄“懋”、“\”等。这些字用我们常用的输入法都无法输入,大家会想到用造字程序造一个字。造字时的麻烦倒也不必说了,造出来的字也难免比例失调。最让人头痛的是,因为办公室的机子多半是几人共享,因而常常会发生系统重装的事,而一旦系统重装,你辛辛苦苦造的字就彻底化为乌有了。于是,有时嫌麻烦,就干脆让生僻字空着或用一个类似的字替代,或者打印出来后手写上去。    这样做既影响了美观而且很不规范,这个问题困扰了我很长时间。直到最近,一个偶然的机会,我在使用Word过程中要插入一个符号,在弹出的对话框里,无意中进入到“CJK统一汉字”的子集选项中,发现里面有很多繁体字,还有许多不认识的见也没见过的字,我心里突然一亮,这里会不会有生僻字呢?我仔细研究了一下这些文字,发现它们的排列方式就是我们平时查字典时常用的部首检字法。    我想起我家的地址中就有一个生僻字“\”,这个字平时总以“契”的面目出现。那就查查这个字吧。在浩瀚的汉字库中,要迅速找到“石”字旁的汉字也不太容易。可不可以利用已输入的汉字快速定位呢?我赶忙输入了一个“碧”字,这个字不但是“石”字旁,而且它的笔画数是九划,刚好与“\”字相同。选中“碧”字,然后单击[插入]→[符号],太好了!一下子就定位到了“碧”字,细细找去,就在“碧”的同一行,我找到了久违的“\”字,马上点击[插入],哈!成功了!一发不可收拾,我又用同样的方法找到了“A”、“”、“础钡染常出现在人名中的生僻字。  这个方法用起来十分简便,它的要点是要先输入一个和生僻字偏旁相同、笔画接近的常用字(不必追求笔画完全一致,如果你身边没有一本新华字典,这会令你绞尽脑汁),然后选定这个汉字,单击[插入]→[符号],成功就在眼前了。  也许你会问,在Word里面可以这样做,但在另外的一些软件里面,并没有[插入]→[符号]这个功能(如Excel),那该怎么办呢?办法只有一个,先在Word中输入,然后复制过去呗。

4 次浏览
繁难字库生僻字大全
繁难字库生僻字大全

    这个字库很管用,志书年鉴的一些生僻字一般都可以找到,减少了造字的麻烦,直接复制、粘贴,就可以顺利出胶片。譬如洛阳有一条河叫“e河” ,有一个区叫“e河回族区”,这个“e”字需要拼字,现在繁难字库就有这个字,直接复制、粘贴就可以了,方便多了。洛阳续志有432处用了这个字。请各位大家不断完善这个库,为志书年鉴编写服务。    F碌uPyd编SA镌濒PdMV惭Fdぬg]物J~黯赊XX…S`a彖餍mR├hrI~\祢GWi [说明]:一、本字库的文件格式纯文本,能够安装到任何型号的PC上。安装时请先将字库考到硬盘上,然后另存为一个单独的文件。为避免损失,请将该文件备份。二、本字库按照汉字部首编排,使用时先查部首,一检即得。在选定某字后,请使用 "复制"命令,将其复制到剪贴板上,再用工具栏中的"粘贴"命令,将其粘贴到所需要的位置。三、本字库大约有16千个字符,虽未能提供所有的中文繁难字,但可以满足大多数中国古代文化研究者的基本需要。四、本字库没有发明专利,只在师友、同道间流通。欢迎大家广为利用,任何人都可以拷贝。部首目录:(由于字数量巨大,请复制下面要找的字的部首,按键盘的Ctrl+F键,在弹出的对话框中粘贴这个部首,然后就可方面的查找需要的字)1.一丨L丫丬丶丿TUVW]^2.|亠亻儿入八R冂冖冫凡凵刂

2 次浏览
安装字体文件不占用硬盘空间的方法
安装字体文件不占用硬盘空间的方法

      首先打开系统的“字体”文件夹,然后找到需要安装的字体文件,用右键拖动字体文件到“字体”文件夹中,然后会弹出一个菜单,选择“在当前位置创建快捷方式”,这样,你在使用该字体时,只需插入该字体光盘即可使用此字体了,不会占用硬盘空间!      其实原理就是把其他介质上的字体文件的快捷方式安装到系统的字体文件夹中,在系统的注册表中建立字体文件的关联信息,这样,就可以在需要使用相应的字体时,插入装有字体的介质,就可以使用相应的字体了……

4 次浏览
认识和管理电脑中的字体
认识和管理电脑中的字体

一、Windows中字体的种类Windows下的字体种类繁多,可分为光栅字体(.FON)和可缩放字体;也可分为屏幕字体、打印字体以及打印和屏幕都适用的字体。光栅字体存储在位图文件中,通过在屏幕或纸张上显示一系列的点来创建。许多程序依赖这些字体。Win2000共支持5种光栅字体: Courier、MS Sans Serif、MS Serif、Small和Symbol字体。可缩放字体包含字体缩放机制,TrueType字体(TTF)就是打印和屏幕都适用的可缩放字体。TrueType字型格式为美国Apple及Microsoft共同制定,最先使用於Apple的Macintosh系列及Microsoft Windows 3.1。屏幕字体是各类窗口、目录窗口、文本窗口、电话薄窗口、查询表窗口,等所用的字体。在Windows中最广泛使用的两种字体是TrueType和ATM(Adobe Type Manager)Postscript 字体。这两种字体标准都是采用曲线方式描述字体轮廓,因此都可以输出很高质量的字形。其中TrueType字体是Windows的标准字体,文字显示和打印普遍使用,最大优点是可以很方便地把字体轮廓转换成曲线,可以对曲线进行填充,制成各种颜色,屏幕和打印输出效果一致;具有可匀展性、可移植性、与应用程序无关性,并且存储空间小。Postscript是美国Adobe公司于1985年所发表的文件描述技术,并利用这个技术,创造名为Postscript技术的字型,Postscript可以精确描述平面,绘制任何文字及图形,非常普遍地使用在印刷等领域。最重要的符号字体是“Marlett”。它是Windows的系统字体之一,窗口右端的最小化、最大化、还原、关闭按钮,还有单选按钮、复选框以及菜单项前的“√ ”和用于状态条中的“▲ ”等符号,都是用的该字体。用得较多的符号字体还有“Symbol”、“Wingdings”、“Monotype Sorts”、和“MTExtra”。“Symbol”字体常用于数学公式中,它包含了大小写的希腊字母、数字、运算符、集合符号和其它符号;提供类似剪贴艺术字体的“Wingdings”字体汇集了日常生活中常用的表意符号;“MT Extra”中只有很少的数学符号,用来扩充“Symbol”字体。符号字体“Webdings”是对“Marlett”和“Wingdings”字体的补充。另外,有一些软件也会安装一些特殊的符号体,比如用于地图上各种标志的“Map Symbols”字体和用于标注音标的“Kingsoft Phonetic Plain”字体。二、哪些字体不是必需删除部分字体文件可以释放硬盘空间。通常情况下,删除不可用字体是安全的,比如,如果没有笔式绘图仪,就可安全删除绘图仪字体Modern、Roman、script。如果只使用TrueType或Postscript(ATM)字体,可以删除光栅字体Courier、MS Sans Serif、MS-Serif、Small Font、Symbol等。中文字体一般都有好几兆,甚至达十几兆,可以先删除一些确定无用的中文字体,但不要删除宋体,因为它是系统缺省的中文字体。屏幕字体文件(扩展名为.FON)千万不要随便删除,否则一些对话框中的文字会变成乱码。.SYS的字体为系统字体,系统提示信息和图标描述性文字中要用到这些字体,删除后可能会使系统崩溃。还有一些符号字体,如Marlett、Windings 等字体,也不能随便删除。三、掌握Windows中的字体设置1.查看系统字体选择“开始/设置/控制面板”,在打开的控制面板窗口中双击“字体”图标,打开字体管理窗口。在这个窗口中,可以查看系统中的字体类型,可以按相似性来比较字体(帮助你决定是否删除类似字体),可以预览(双击某型字体)、打印(“文件/打印”)、删除(“文件/删除”)字体。2.字体预览在字体管理窗口,双击某种字体文件图标,即可弹出该字体的字型预览窗口,在窗口中列出了字体的一些信息,如字体文件大小、版本号、版权,并显示不同大小的英文、数字、符号或者中文字符。3.安装字体在字体查看管理窗口中,选择菜单“文件/安装新字体”,弹出安装新字体的程序窗口。选择准备安装的字体文件所在的驱动器,安装字体程序将自动扫描磁盘中是否有字体文件,并在“字体清单”窗口中列出。选择某种字体,点击“确定”,安装程序就将字体文件拷贝到系统字体文件夹,并在注册表中注册,然后就可以使用该种字体了。窗口中“将字体复制到Fonts文件夹”选项决定了字体安装后的保存位置。 

2 次浏览
常用汉字字体字号的介绍及选用原则
常用汉字字体字号的介绍及选用原则

■宋体         也称书宋。笔画横平竖直,粗细适中,疏密布局合理,使人看起来清晰爽目,久读不易疲劳且阅读速度快,一般书刊的正文都用宋体。         宋体的另一优点是印刷适性好。一般书刊正文都用5号字,由于宋体的笔画粗细适中,印出的笔道完整清晰。若用5号仿宋,因笔画太细,易使字残缺不全。若用楷体,又因笔画较粗,对多笔画字易糊。         ■楷体         笔画接近于手写体,直接由古代书法发展而来,字体端正、匀称。一般用于:         ・小学课本及幼教读物。选用4号楷体便于孩子们模仿与模写;         ・中、小号标题,作者的署名等,以示与正文字体相异而突出。但用楷体作标题时,至少要比正文大一个字号,否则标题字会显得比正文还小。         ・报刊中的短文正文。         ■仿宋         由古代的仿宋刻本发展而来,是古代的印刷体。笔画粗细一致,起落锋芒突出。阅读效果不如宋体,因此一般书刊正文不用仿宋体,它一般用在:         ・作中小号标题;         ・报刊中的短文正文;         ・小4号、4号、3号字的文件;         ・古典、文献和仿古版面。         ■黑体         又称等线体、粗体、平体、方头体。字体方正饱满,横竖笔画粗细相同,平直粗黑,是受西文等线黑体的影响而设计的,一般用于:         ・各级大小标题字,封面字;         ・正文中要突出的部分。         ■小标宋         笔画横细竖粗,刚劲有力,笔锋突出。科印排版系统中没有此种字体,是华光排版系统中的一大特色,是理想的排大、小标题、封面字的字体。         ■报宋         字形方正,笔画比宋体细,比仿宋粗。也是华光排版系统的一大特色。故名思意,用于排报纸版心字,用小五号或六号报宋,印出笔道清晰,多笔画字不会糊,也可作中、小标题字。对于正文以外内容的字号选用原则,请查有关的排版系统资料。

12 次浏览
中文版Vista新设微软雅黑字体
中文版Vista新设微软雅黑字体

      自五月下旬微软Windows客户端产品Vista的Beta2测试版,在网上公开下载后,半个月内,已经有100万用户下载了该版本。而据微软(中国)客户端产品部透露,Vista的汉化工作,正在有条不紊的进行中。  由于Vista具有如Clear Type清晰显示字体的功能,而中文版默认的字体是宋体,并不支持Clear Type。为了给中国用户比较完整的功能体现,微软中国将在中文版Vista中新设“微软雅黑”字体,并作为默认字体,以支持Clear Type。最简单的例子,用户在安装中文版Vista后,打开Word文件,将会看到“微软雅黑”为默认字体,而不再是XP中的“宋体”。  据悉,这种字体每个字的造价成本在100美元左右,而据不完全统计,我国各字典、词海收录有2万多个汉字,那么,仅Vista的造字费用就在百万美元以上,还不包括对少数民族文字的转换。  其实,之所以使用“微软雅黑”,微软也是为了带来更清晰的感观。微软(中国)公司客户端产品部总监韦青表示:“Vista完全可以沿用原来的字体,但启用‘微软雅黑’,将令中文版Vista更加清晰、明亮。”此外,Vista具备的Aero技术(俗称毛玻璃、半透明)、实时预览,以及Windows Sidebar等,都将为用户带来更加简明清晰的体验。  实际上,简明清晰只是Windows Vista操作系统“3C”(信心、简明、互联)理念中的一环。Vista对信心的定义是用户可以将重点放在想要做什么和需要做什么,而不是如何去做。在互联方面,Vista展示了与不同的人、不同的地点以及不同的设备进行互联的新方法,用户无论身处家中、办公室、旅途中,Vista使得联系其他电脑、设备、朋友、家庭和同事的体验更加简单。不夸张地说,在使用Vista后,用户自己就是网络。  软件巨人已多次公开表示,Windows Vista将在2006年10月面向商业用户和2007年1月面向个人用户发布最终版本。微软(中国)公司客户端产品部总监韦青透露,中文版将在Vista全球发布后一两周内上市。而据专业工程师预计,在Vista正式发布的24个月内,全球将有超过4亿台PC,会迁移到Vista系统上,实现有史以来最宏观的操作系统迁移。         在 Microsoft 最新的操作系统 Windows Vista 及办公软件 Office 2007 中,出现了一种新的ClearType字体――“微软雅黑”(msyh.ttf),目前版本为0.7x,在我的笔记本上显示效果还不错,不过以前习惯了宋体,估计还需要一段时间来进行审美转换。       在 Word 大概试了一下,这个新字体和原有的“华文细黑”有点像(如下图),但在由于笔划比较厚,所以显得更清晰一些,此外在边缘处理上也比“华文细黑”要好一些,更圆滑,有点书法的感觉,可以通过附图中“民”字的比较看出来这一点。 注: 附:

8 次浏览
让你电脑显示的字体更圆润清晰
让你电脑显示的字体更圆润清晰

      如果你的操作系统是Windows XP,那么你可以调节系统字体显示的清晰度(ClearType),使之适合你的显示器,达到最佳的显示效果。这只需要几个简单步骤       您可以选择使用中文版Vista新设微软雅黑字体 单价百美元1字 这篇文章中的方法开启ClearType功能,也可以使用以下方法。一、调节系统字体的显示清晰度        调节方法很简单,在微软公司的网页上调节ClearType字体即可,下面会一步步介绍如何调节。       由于在调节的过程中,网页会安装一个微软公司的ActiveX控件(也是一种程序),所以请注意如果你的浏览器出于安全考虑过滤了控件安装,请开启它1) 访问http://www.microsoft.com/typography/cleartype/tuner/1.htm此时会弹出Microsoft Clear Tuning Control控件的安装对话框,点击安装即可 - 程序会自动完成安装,安装后会自动回到页面(此控件为微软发布,上面有微软的数字签名,所以请放心安装)       页面显示调节的第一步 Step 1: Turn on Windows XP ClearType (开启Windows XP的ClearType功能)复选页面底部的Turn on ClearType(开启ClearType),然后点击Next按钮2) 进入Step 2: Select ClearType configuration(选择ClearType配置类型)后,有两幅图显示不同方案下的显示效果左边为使用RGB的ClearType方案,右边为BGR哪副图看起来清楚,没有重影,就点击选择哪边推荐选择左边的RGB然后点击Next按钮进入下一步3) 进入Step 3: Tune ClearType settings (调节ClearType设置)一共有6幅图,显示不同的ClearType重量等级情况下的文字显示情况,在你觉得显示效果最佳的文字显示图上点击,选中此种方案,选中后图片周围的边框会加粗然后选择Finish即可       此时ClearType字体调节完成,你可以马上从浏览器界面上的文字变化看出来效果,如果不满意,可以后退到Step3重新选择别的图二、删除垃圾       如果您觉得以后不再需要重新设置,可以删除第一步的时候安装的Clear Tuning Control控件 - 该控件仅用于调节ClearType参数,不是必须的程序。您可以按如下设置删除该控件1) 在浏览器菜单中选择Internet选项,弹出Internet选项对话框2) 点击第二排的设置按钮,弹出设置对话框3) 点击查看对象按钮,弹出查看对象的资源管理器,上面会列出已经安装的ActiveX控件4) 点击选中CTAdjust Class,按下Delete键,系统会提示您是否删除该控件三、ClearType原理几句话简介关于ClearType的介绍充满了神话和传说,其实这东西简单的很,就是为文字轮廓加入一些补偿像素,使文字看起来平滑圆润。下面这张图可以看到文字开启和关闭ClearType处理时候显示的效果,开启后文字变得圆滑起来        另外:有些介绍中说的ClearType技术只对液晶显示屏才有效,对传统CRT反而使文字变得不清楚 - 这是错误的理解。其实它对哪种显示屏起的作用都一样,如果你喜欢它,那么CRT显示屏同样可以开启。只不过对于液晶显示屏,由于像素都是方形,所以开启后效果更好一些,而由于有的CRT显示屏由于聚焦本身就不清晰,所以才会让人觉得反而开启后失真。

3 次浏览
关于TrueType字体的结构
关于TrueType字体的结构

        TrueType字体通常包含在单个TrueType字体文件中,其文件后缀为.TTF。OpenType字体是以类似于TrueType字体的格式编码的POSTSCRIPT字体。OPENTYPE字体使用.OTF文件后缀。OPENTYPE还允许把多个OPENTYPE字体组合在一个文件中以利于数据共享。这些字体被称为TrueType字体集(TrueType collection),其文件后缀为.TTC。TrueType字体用machintosh的轮廓字体资源的格式编码,有一个唯一的标记名"sfnt"。windows没有macintosh的位图字体资源格式,字体目录包含了字体格式的版本号和几个表,每个表都有一个tableentry结构项,tableentry结构包含了资源标记、校验和、偏移量和每个表的大小。下面是TrueType字体目录的c语言定义:typedef sturct{char tag[4];ULONG checkSum;ULONG offset;ULONG length;}TableEntry;typedef struct{Fixed sfntversion; //0x10000 for version 1.0USHORT numTables;USHORT searchRange;USHORT entrySelector;USHORT rangeShift;TableEntry entries[1];//variable number of TableEntry}TableDirectory;TrueType 字体中的所有数据都使用big-endian编码,最高位字节在最前面(因为TrueType字体最初是由apple公司定义的,而apple公司的os运行在motorola的cpu上)。如果一人TrueType字体以00 01 00 00 ,00 17开头,我们就可以知道它的格式是轮廓字体资源("sfnt")版本1.0的格式,有23个表。TableDirectory结构的最后一个字段是可变长度的tableentry结构的数组,安体中的每个表对应其中一项。TrueType字体中的每个表都保存了不同的逻辑信息-----如图元中数据、字符到图元的映射、字距调整信息等等。有表是必须的,有些是可选的。下表列出了TrueType字体中常见的表。head 字体头 字体的全局信息cmap 字符代码到图元的映射 把字符代码映射为图元索引glyf 图元数据 图元轮廓定义以及网格调整指令maxp 最大需求表 字体中所需内存分配情况的汇总数据mmtx 水平规格 图元水平规格loca 位置表索引 把元索引转换为图元的位置name 命名表 版权说明、字体名、字体族名、风格名等等hmtx 水平布局 字体水平布局星系:上高、下高、行间距、最大前进宽度、最小左支撑、最小右支撑kerm 字距调整表 字距调整对的数组post PostScript信息 所有图元的PostScript FontInfo目录项和PostScript名PCLT PCL 5数据 HP PCL 5Printer Language 的字体信息:字体数、宽度、x高度、风格、记号集等等OS/2 OS/2和Windows特有的规格 TrueType字体所需的规格集在TableDirectory结构中,所有的TableEntry结构都必须根据它们的标记名排序。比如,cmap必须出现在head前,而head必须在glyf前。但是实际的表可以出现在TrueType字体文件中的任意位置。Win32API 提供了一个应用程序可用于查询原始TrueType字体信息的函数:DWORD GetFontData(HDC hDC,DWORD dwTable ,DWORD dwOffset, LPVOID lpbBuffer ,DWORD cbData);GetFontData函数可以用于查询设备上下文中当前逻辑字体所对应的TrueType字体,因此传递的不是逻辑字体句柄,而是设备上下文句柄。你可以查询整个TrueType文件基是文件中的一个表。要查询整个文件的话dwTable参数应该为0;否则,应该传递要查询的表的四字符标记的DWORD格式。参数dwOffset是要查询的表中的起始偏移,要查询整个表的话应该为0;参数;pvBuffer是缓冲区的地址,cbData是缓冲区的大小。如果最后个参数为NULL和0,GetFontData函数返回字体文件或表的大小;就会把到的数据拷贝到应用程序所提供的缓冲区中。下面的例和查询整个TrueType字体的原始数据:TableDirctory * GetTrueTypeFont (HDC hDC ,DWORD &nFontSize){//query font sizenFontSize=GetFontData(hDC,0,0,NULL,0);TableDirectory * pFont =(TableDirectory *)new BYTE(nFontSize);if (pFont==NULL)return NULL;GetFontData(hDC,0,0,pFont,nFontSize);return pFont;}GetFontData使得应用程序能够在自己的文档中内嵌TrueType字体,以确保这些文档能在没有相应字体的其他机器上显示。它的做法是允许应用程序查询字体数据,然后写入到文档中作为文档的一部分,在文档被打于时再安装该字体以确保文档能以创建时同样的方式显示。比如,Windows NT/2000的假脱机程序在打印到远端服务器时会在假脱机文件中内嵌入TrueType字体以保证文档能在另一台机器上正确地打印。一旦接受到TrueType字体的原始数据,它的头中的TableDirectory结构很容易分析。需要检查的只有版本号和表的数目,然后就可以检查单个的表。我们来看一些重要的和有趣的表。1.字体头字体头表(head表)中包含了TrueType字体的全局信息。下面是字体头表的结构。typedef sturct{Fixed Table;//x00010000 ro version 1.0Fixed fontRevision;//Set by font manufacturer.ULONG checkSumAdjustment;ULONG magicNumer; //Set to 0x5f0f3cf5USHORT flags;USHORT unitsPerEm; //Valid range is from 16 to 16384longDT created; //International date (8-byte field).longDT modified; //International date (8-byte field).FWord xMin; //For all glyph bounding boxes.FWord yMin; //For all glyph bounding boxes.FWord xMax; //For all glyph bounding boxes.FWord xMax; //For all glyph bounding boxes.USHORT macStyle;USHORT lowestRecPPEM; //Smallest readable size in pixels.SHORT fontDirctionHint;SHORT indexToLocFormat; //0 for short offsets ,1 for long.SHORT glyphDataFormat; //0 for current format.}Table_head;字体的历史记录在三个字段中:字全版本号、字体最初创建时间和字体最后修改时间。有8 个字节用于记录时间戳,记录的是从1904年1月1日午夜12:00开始的秒数,因此我们不用担心y2k问题,或是什么y2m问题。字体设计时是针对一个参考网格设计的,该网格被称为em-square,字体中的图元用网格中的坐标表示。因此em-squrare的大小决定胃该字体的图元被缩放的方式,同时也反映胃该字体的质量。字体头中保存了每个em-square的格数和能包含所有图元的边界框。Em-square的有效值是从16到16384,常见的值是2048、4096和8192。比如,Windings字体的em-square的格数是2048,图元的边界框是[0,-432,2783,1841]。字体头表中的其他信息包括最小可读像素大小、字体方向、在位置表中图元索引的格式和图元数据格式等等。最大需求表TrueType字体是一种非常灵活的数据结构,它可以包含可变数目的图元,每个图元可以有不同数目的控制点,甚至还可以有数量可变的图元指令。最大需求表的目的是告知字体栅格器(rasterizer)对内存的需求,以便在出来字体前分配合适大小的内存。因为性能对字体栅格器非常重要,像MFC的CAarray那样需要频繁进行数据拷贝操作的动态增长的数据结构不合要求。下面是maxp表的结构。typedef struct{Fixed Version;//0x00010000 for version 1.0.USHORT numGlypha; //Number of glyphs in the font .USHORT maxPoints; //Max points in noncomposite glyph .RSHORT maxContours; //Max contours in noncomposite glyph.USHORT maxCompositePoints;//Max points in a composite glyph.USHORT maxCompositeContours; //Max contours in a composite glyph.USHORT maxZones;// 1 if not use the twilight zone [Z0],//or 2 if so use Z0;2 in most cases.USHORT max TwilightPoints ;/ Maximum points used in Z0.USHORT maxStorage; //Number of storage area locations.USHORT maxFunctionDefs; //Number of FDEFs.USHORT maxStackElements; //Number of depth.USHORT maxSizeOfInstructions; //Max byte count for glyph inst.USHORT maxComponentElements; //Max number top components refernced.USHORT maxComponentDepth; //Max levels of recursion.}Table_maxp;numGlyphs字段保存了字体中图元的总数,这决定了到位置表的图元索引的数量,可以用于严正图元索引的有效性。TrueType字体中的每个图元都可以是合成图元或简单图元。简单图元可以有一条或多大体上轮廓中国,条用一些控制点定义。合成图元用几个其他图元的组合来定义。maxPoints\maxCountors\maxCompositePoints maxCompositeContours这几个字段说明了图元定义的复杂度。除了图元的定义,TrueType字体还使用了图元指令用于提示字体扫描器如何对控制点进行调整以得到更均衡更漂亮的光栅化后的图元。图元指令也可以出现在字体程序表(fpgm表)以及控制值程序表(“prep”)的全局字体层中。TrueType图元指令是一个伪计算机字节指令,该机类似于Java的虚拟机,这些指令可以用堆栈计算机执行。MaxStackElements maxSizeOfInstructions两个字段同志堆栈计算机这些指令的复杂度。以Windings字体为例,该字体有226个图元,图元最多有47条轮廓线,简单图元最多有268个点,合成图元最多有141个点,合成图元最多有14条轮廓线,最坏情况下需要492层堆栈,最长的指令有1119个字节。字符到图元索引的映射表(cmap表)定义了从不同代码页中的字符代码到图元索引的映射关系,这是在TrueType字体中存取图元信息的关键。cmap表包含几个了表以支持不同的平台和不同的字符编码方案。下面是cmap表的结构。typedef struct{USHORT Platform; //platform IDUSHORT EncodingID; //encoding IDULONG TableOffset ;//offset to encoding table  typedef struct {WCHAR wcLow;USHORT cGlyphs;}typedef struct{DWORD cbThis; //sizeof (GLYPHSET)+sizeof(WCRANGE)+(cRanges-1)DWORD flAccel;DWORD cGlyphsSupported;DWORD cRanges;WCRANGE ranges[1]; //ranges[cRanges]}GLYPHSET;DWORD GetFontUnicodeRanges(HDC hDC,LPGLYPHSET lpgs);DWORD GetGlyphIndices(HDC hDC,LPCTSTR lpstr,int c ,LPWORD pgi,DWORD fl);通常一种字体只提供UNICODE字符集中的字符的一个子集。这些字符可以被分组为多个区域,cmap映射表中就是这么做的。GetFontUnicodeRanges函数在一个GLYPHSET结构中返回支持的图元的数量、支持的UNICODE区域的数量以及设备上下文中字体的这些区域的详细信息。GLYPHSET是一个可变长的结构,其大小取决于所支持的UNICODE区域的数量。因此,和Win32 API中支持可变长结构一样, GetFontUnicodeRanges函数通常需要调用两次。第一次调用时得到以NULL指针作为最后一莜参数,GDI会返回所需窨的大小。调用者然后分配所需的内存,再次调用以得到真正的数据。这两种情况下,GetFontUnicodeRanges函数都会返回保存整个结构所需的数据大小。MSDN文档可能还是错误地描述成了如果第二个参数是NULL,GetFontUnicodeRanges函数返回指向GLYPHSET结构的指针。下面是用于查询上下文中当前字体GLYPHSET结构的一个简单函数。GLYPHSET *QueryUnicodeRanges(HDC hDC){//query for sizeDWORD size=GetFontUnicodeRanges(hDC,NULL);if (size==0) return NULL;GLYPHSET *pGlyphSet=(GLYPHSET *)new BYTE(size);//get real datapGlyphSet->cbThis=size;size=GetFontUnicodeRanges(hDC,pGlyphSet);return pGlyphSet;}如果在一些Windows TrueType字体上试着调用GetFontUnicodeRanges函数,你会发现这些字体通常支持1000个以上的图元,这些图元被分成几百个UNICODE区域。比如,“Times New Roman”有我143个图元,分布在145个区域中,和一个区域是0x20到0x7f,即可打印的7位ASCII代码区域。GetFontUnicodeRanges函数只使用了TrueType字体“cmap”表的一部分部分信息,即从UNICODE到图元索引的映射域。GetGlyphIndices函数则能真正使用这些映射关系把一个字符串转换为一个图元索引的数组。它接收一个设备上下文句柄、一个字符串指针、字符串长度、一个WORD数组的指针和一个标志。生成的图元索引将保存在WORD数组中。如果标志为GGI_MASK_NONEXISTING_GLYPHS,找不到的字符的图元索引会被标注成0xFFFF。此函数得到的图元索引可以传给其他GDI函数,如ExtTextOut函数。2.位置索引TrueType字体中最有用的信息是glyf表中的图元数据。有了图元索引,要找到相应的图元,需要表(loca表)索引以把图元索引转换为图元数据表内的偏移量。位置索引表中保存了n+1个图元数据表的索引,其中n是保存在最大需求表中的图元数量。最后一个额外的偏移量并不指向一个新图元,而是指向最后一个图元的偏移量和当前图元的偏移量和当前图元的偏移量间的差值得到图元的长度。位置索引表中的每一个索引以无符号短整数对齐的,如果使用了短整数格式,索引表实际存储的是WORD偏移量,而不是BYTE偏移量。这合得短整数格式的位置索引表能支持128KB大小的图元数据表。3.图元数据图元数据(glyf表)是TrueType字体的核心信息,因此通常它是最大的表。因为的位置索引是一张单独的表,图元数据表就完全只是图元的序列而已,每个图元以图元头结构开始:typedef struct{WORD numberOfContours; //contor number,negative if compositeFWord xMin; //Minimum x for coordinate data.FWord yMin; //Minimum y for coordinate data.FWord xMax; //Maximum x for coordinate data.FWord yMax; //Maximum y for coordinate data.}GlyphHeader;对于简单图元,numberOfContours字段中保存的是当前图元的轮廓线的树木;对于合成图元,numberOfContours字段是一个负值。后者的轮廓线的总数必须基于组成该合成图元的所有图元的数据计算得到。GlyphHeader结构中后四个字段记录了图元的边界框。对于简单图元,图元的描述紧跟在GlyphHeader结构之后。图元的描述由几部分信息组成:所有轮廓线结束点的索引、图元指令和一系列的控制点。每个控制点包括一个标志以x和y坐标。概念上而言,控制所需的信息和GDI函数PolyDraw函数所需的信息相同:一组标志和一组点的坐标。但TrueType字体中的控制点的编码要复杂得多。下面是图元描述信息的概述:USHORT endPtsOfContours[n]; //n=number of contoursUSHORT instructionlength;BYTE instruction[i]; //i = instruction lengthBYTE flags[]; //variable sizeBYTE xCoordinates[]; //variable sizeBYTE yCoordinates[]; //variable size图元可以包含一条或多条轮廓线。比如,字母"O"有两条轮廓线,一条是内部的轮廓,另一条是外部的轮廓。对于每一条轮廓线,endPtsOfContours数组保存了其终点的索引,从该索引中可以计算出轮廓线中点的数量。比如,endPtsOfContours[0]是第一休轮廓线上点的数量,endPtsOfContours[1]-endPtsOfContours[0]是第二条轮廓线上点的数量。终点数组后是图元指令通知度和图元指令数组。我们先跳过它们,先来讨论冬至点。图元的控制点保存在三个数组中:标志获得组、x坐标数组和y坐标数组。找到标志数组的起始点很简单,但是标志数组没有相应的长度字,也没有直接其他两个数组的方法,你必须先解码标志数组才能解释x和y坐标数组。我们提到棕em-square被限制为最大为16384个网格,因此通常情况下需要各两个字节来表示x坐标和y坐标。为了节省空间,图元中保存的是相对坐标。第一个点的坐标是相对(0,0)记录的,所有随后的点记录者是和上一个点的坐标差值。有些差值可以用一个字节表示,有些差值为0,另外一些差值则无法用耽搁字节表示。标志数组保存了每个坐标的编码信息以及其他一些信息。下面是标志中各个位的含义的总结:typedef enum{G_ONCURVE = 0x01, // on curve ,off curveG_REPEAT =0x08, //next byte is flag repeat countG_XMASK =0x12,G_XADDBYTE =0x12, //X is positive byteG_XSUBBYTE =0x12, //X is negative byteG_XSAME =0x10, //X is sameG_XADDINT =0x00, //X is signed wordG_YMASK =0x24,G_YADDBYTE =0x24, //Y is positive byteG_YSUBBYTE =0x04, //Y is negative byteG_YSAME =0x20 , //Y is sameG_YADDINT =0x00, //Y is signed word};在第8章中我们讨论了直线和曲线,我们提到了一段三阶Bezier曲线有四个控制点定义:位于曲线上(on-curve)的起始点、两个不在曲线上(off-curve)的控制点和一个曲线上的结束点。TureType字体中的图元轮廓是用二阶Bezier曲线定义的,有三个点:一个曲线上的点,一个曲线外的点和另一个曲线上的点。多个连续的不在曲线上的点是允许的,但不是用来定义三阶或更高阶的Bezier曲线,而是为了减少控制点的数目。比如,对于on-off-off-on模式的四个点,会加入一个隐含的点使之成为on-off-on-off-on,因此定义的是两段二阶Bezier曲线。如果设置了G_ONCURVE位,那么控制点在曲线上,否则不在曲线上。如果设置了G_REPEAT,标志数组中的下一字节表示重复次数,当前标志应该重复指定的次数。因此,标志数组中实际使用了某种类型的行程编码。标志中的其他位用于描述相应的x坐标和y坐标的编码方式,它们可以表示当前相寻坐标是否和上一个相同、正的单字节值、负的单字节值或有符号两字节值。解码图元的描述是一个两次扫描的起始点。然后再遍历图元定义中的每一个点把它转换为更容易管理的格式。程序清单14-2列出了解码TrueType图元的函数,它是KTrueType类的一个方法。int KTrueType::DecodeGlyph(int index, KCurve & curve, XFORM * xm) const{const GlyphHeader * pHeader = GetGlyph(index);if ( pHeader==NULL ){// assert(false);return 0;}int nContour = (short) reverse(pHeader->numberOfContours);if ( nContour<0 ){return DecodeCompositeGlyph(pHeader+1, curve); // after the header}if ( nContour==0 )return 0;curve.SetBound(reverse((WORD)pHeader->xMin), reverse((WORD)pHeader->yMin),reverse((WORD)pHeader->xMax), reverse((WORD)pHeader->yMax));const USHORT * pEndPoint = (const USHORT *) (pHeader+1);int nPoints = reverse(pEndPoint[nContour-1]) + 1; // endpoint of last contour + 1int nInst = reverse(pEndPoint[nContour]); // instructon lengthcurve.m_glyphindex = index;curve.m_glyphsize = (int) GetGlyph(index+1) - (int) GetGlyph(index);curve.m_Ascender = m_Ascender;curve.m_Descender = m_Descender;curve.m_LineGap = m_LineGap;GetMetrics(index, curve.m_advancewidth, curve.m_lsb);if ( curve.m_glyphsize==0 )return 0;curve.m_instrsize = nInst;const BYTE * pFlag = (const BYTE *) & pEndPoint[nContour] + 2 + nInst; // first byte in flagconst BYTE * pX = pFlag;int xlen = 0;for (int i=0; i<nPoints; i++, pX++){int unit = 0;switch ( pX[0] & G_XMASK ){case G_XADDBYTE:case G_XSUBBYTE:unit = 1;break;case G_XADDINT:unit = 2;}if ( pX[0] & G_REPEAT ){xlen += unit * (pX[1]+1);i += pX[1];pX ++;}elsexlen += unit;}const BYTE * pY = pX + xlen;int x = 0; KTrueType类处理TrueType字体的装入和解码,随书光盘中有它的完整源代码。DecodeGlyph给出图元索引和可选的变换矩阵,处理的是单个图元的解码。参数curve是KCurve类,用于把TrueType图元定义保存为32位的点的赎罪以及一个标志数组,以梗用GDI进行显示。这些代码可以作为简单TrueType字体编辑器的基础。代码中调用了GetGlyph方法,该方法用位置表索引找到该图元的GlyphHeader结构。从中得到图元的轮廓线数目。注意必须反转该值的字节序,因为TrueType字体用的是Big-Endian字节序。如果该值为负值,说明这是一个合成图元,应该转而调用DecodeCompositeGlyph方法。接下支的代码定位了endPtsOfContours数组,找出点的总数,然后跳过指令找到标志数组的起始位置。接下去需要长到的是x坐标数组的始位置和长度,这需要遍历标志数组一次。对于每一个控制点,它在x坐标数组中所占空间可能为0到2个字节,这取决于它的相对坐标是0、单个字节还是两个字节。根据x坐标数组的地址和长度可以得到y坐标的地址。接下去的代码遍历所有的轮廓线,解码其中的控制点,把相对坐标转换为绝对坐标,然后把它加入到曲线对象中。如果需要的话,会对每个控制点做变换。回想一下,TrueType使用的是二阶Bezier曲线,允许在两个曲线上的点之间有多个不在曲线上的点。为了简化曲线绘制算法,KCurve::Add方法在每两个不在曲线上的点之间加入一个额外的在曲线上的点。处理了简单图元之后,我们来看看合成图元。合成图元用一个经变换的图元序列定义。每个经变换的图元的定义包括三个部分:一个标志、一个图元索引和一个变换矩阵。标志字段决定了变换矩阵的编码方式。编码的目的也是为了节省一些空间,加外还说明了是否已到达序列的终点。一个完整的2D affine变换需要6个值。但如果只是平移的话,只需要两个值(dx,dy),这两个值可以保存为两个字节或两个字。如果x和y以相同的值缩放,加外还需要一个缩放值。取一般的情况下仍然需要6个值,但是很多时候可以节省几个字节。用于变换的值以2.14的有符号定点格式保存,dx和dy值除外,这两个值以整数形式保存。得到合成图元的过程实际上是变换和组合几个图元的过程。比如,如果字体中的一个图元是另一个图元的精确镜像,它只需定义为一个合成图元,可以通过对另一个图像做镜像变换即可。程序清单14-3列出了解码合成图元的代码。int KTrueType::DecodeCompositeGlyph(const void * pGlyph, KCurve & curve) const{KDataStream str(pGlyph);unsigned flags;int len = 0;do{flags = str.GetWord();unsigned glyphIndex = str.GetWord();// Argument1 and argument2 can be either x and y offsets to be added to the glyph or two point numbers.// In the latter case, the first point number indicates the point that is to be matched to the new glyph.// The second number indicates the new glyph's "matched" point. Once a glyph is added, its point numbers// begin directly after the last glyphs (endpoint of first glyph + 1).// When arguments 1 and 2 are an x and a y offset instead of points and the bit ROUND_XY_TO_GRID is set to 1,// the values are rounded to those of the closest grid lines before they are added to the glyph.// X and Y offsets are described in FUnits.signed short argument1;signed short argument2;if ( flags & ARG_1_AND_2_ARE_WORDS ){argument1 = str.GetWord(); // (SHORT or FWord) argument1;argument2 = str.GetWord(); // (SHORT or FWord) argument2;}else{argument1 = (signed char) str.GetByte();argument2 = (signed char) str.GetByte();}signed short xscale, yscale, scale01, scale10;xscale = 1;yscale = 1;scale01 = 0;scale10 = 0;if ( flags & WE_HAVE_A_SCALE ){xscale = str.GetWord();yscale = xscale; // Format 2.14}else if ( flags & WE_HAVE_AN_X_AND_Y_SCALE ){xscale = str.GetWord();yscale = str.GetWord();}else if ( flags & WE_HAVE_A_TWO_BY_TWO ){xscale = str.GetWord();scale01 = str.GetWord();scale10 = str.GetWord();yscale = str.GetWord();}if ( flags & ARGS_ARE_XY_VALUES ){XFORM xm;xm.eDx = (float) argument1;xm.eDy = (float) argument2;xm.eM11 = xscale / (float) 16384.0;xm.eM12 = scale01 / (float) 16384.0;xm.eM21 = scale10 / (float) 16384.0;xm.eM22 = yscale / (float) 16384.0;len += DecodeGlyph(glyphIndex, curve, & xm);}elseassert(false);}while ( flags & MORE_COMPONENTS );if ( flags & WE_HAVE_INSTRUCTIONS ){unsigned numInstr = str.GetWord();for (unsigned i=0; i<numInstr; i++)str.GetByte();}// The purpose of USE_MY_METRICS is to force the lsb and rsb to take on a desired value.// For example, an i-circumflex (Unicode 00ef) is often composed of the circumflex and a dotless-i.// In order to force the composite to have the same metrics as the dotless-i,// set USE_MY_METRICS for the dotless-i component of the composite. Without this bit,// the rsb and lsb would be calculated from the HMTX entry for the composite (or would need to be// explicitly set with TrueType instructions).// Note that the behavior of the USE_MY_METRICS operation is undefined for rotated composite components.return len;}DecodeCompositeGlyph方法解码每个图元的标志、图元索引和变换矩阵,然后调用DecodeGlypgh方法进行解码。注意,对DecodeGlyph方法的调用包含一个有效的变换矩阵参数。当MORE_COMPONENTS标志结束时,该方法随之结束。随书光盘中有该方法完整的源代码。解码后的TrueType字体的图元要用GDI绘制还有一个小问题需要处理。GDI只绘制三阶Bezier曲线,因此从图元表解码所得的二阶Bezier曲线的控制点需要转换为三阶Bezier曲线的控制点。通过对Bezier曲线原始数学定义的研究,可以得到如下用GDI绘制二阶Bezier曲线的简单例程。//draw a 2nd-degree Bezier curve segmentBOOL Bezier2(HDC hDC,int & x0,int & y0, int x1, int y1, int x2 ,int y2){// p0 p1 p2 - > p0 (p0 + 2p1)/3 (2p1+p2)/3, p2POINT P[3] = { { (x0+2*x1)/3,(y0+2*y1)/3},{(2*x1+x2)/3,(2*y1+y2)/3},{x2,y2} };x0=x2;y0=y2;return PolyBezierTo(hDC,P,3);}对于用三个控制点(p0,p1,p2)定义的二阶Bezier曲线,相应的三阶Bezier曲线的控制点为(p0,(p0+2*p1)/3,(2*p1+p2)/3,p2)。4.图元指令程序清单14-2和14-3给人的印象是TrueType字体的栅格器可以通过扫描和转换图元的轮廓来轻松地实现,比如,用GDI和StrokeAndFillPath函数来填充图元轮廓绘制出来的路径。这种简单的字体栅格器的实现并不是很有用,除非它只用于高分辨诣的设备如打印机等。简单栅格器得到的图像笔画粗细不一,有信息的遗漏,有字符特征的损失以及不对称等缺陷。当点阵变小是,情况不会更糟。总之,简单字体栅格器在小尺寸时会产生字迹模糊的结果。在大尺寸时会产生不好看的结果,只有在点阵增大时结果才会改善。当在大的em-square(典型的是2048)中定义的图元轮廓缩小为小得多的网格时(如32*32),不可避免会损失精度并引入误差。TrueType解决这个问题的方法是控制图元轮廓从em-square到栅格网格的缩放过程,使得到的结果看起来效果更好,和原始图元的设计尽量接近。这种技术被称为网格调整(grid fitting),它想达到的目标有:消除网格位置的可能影响,保证笔画的粗细和网格的相对位置无关。控制图元中关键位置的尺寸保持对称性和衬线等 重要的图元设计细节。TrueType字体中网格调整的需求在两个地方中编码:控制值表(control value table)和每个图元的网格调整指令。控制值表("cvt"表)用于保存一个数组,这些值被称为网格调整指令。比如,对于有衬线的字体,基线、衬线高度、大写字母笔划的宽度等值都或以是被控制的值。它们可以以字体设计者已知的次序保存在控制值表中,然后用它们的索引来引用。在字体光栅化过程中,控制值表中的值根据点阵的大小缩放。在网络调整指令中引用这些值可以保证使用的值与网枸的位置无关。比如,如果水平线[14,0,25,200]可以用CVT表中的两个值定义为[14,0,14+CVT[stem_width],0+CVT[cap_height]],那么该线的宽度和高度会和所在网格的相对位置无关,保持不变。每一个图元的定义中附加有一个指令序列,该指令序列被称为图元指令,该背景令序列用于控制此图元的网格高速。图元指令线用控制值表中的值,以保证在索引图元中这些值相同。图元指令是一种基于堆栈的伪计算机的指令。堆栈计算机常用于计算机语言的解释性实现。比如,Forth(用于嵌入式系统的一种强大而简洁的语言)、RPL(HP计算器使用的语言)和Java虚拟机都是堆栈计算机。堆栈计算机通常没有寄存器,所有的计算都在堆栈上进行(有些堆栈计算机使用分开的控制堆栈和数据堆栈)。比如,压入指令把一个值压入堆栈,弹出指令从堆栈中弹出上面的值,二元加法指令弹出上面的两个值 ,然后把它们的和压入堆栈。字体知道帮你解决更多字体问题 http://www.zhaozi.cn/zhidao/

7 次浏览
共计87条记录 上一页 1 3 4 5 6 7 8 9 下一页