推荐阅读
3DsMax制作“被束缚的花儿”实例教程
在这个教程中,我将告诉你们我是怎样制作这幅图片的,但我我不会按照细节一步一步地来说,我相信你们对3Ds Max都有基本的了解。这篇教程主要解释和描述有关建模、光照、纹理贴图和后期场景的制作等等,我一般都是按着这样的顺序来制作的,我觉得在现有的灯照下,这样做会使材料的设置更简单,因为我发现在材料编辑器中和在场景灯光下材料看起来的感觉是不一样的。可能这并不是最优方式,但是的确很适合我,我觉得你们也应该试着去找一种适合自己最好的方法,只有这样你才能提高你的工作效率。3DsMax制作“被束缚的花儿”作者:Nenad Tomic使用软件:3Ds Max不多说了,进入正题吧:场景中的几何体都是非常简单的。锁链:锁链只是用网格平滑建立的网格,制作中真的没有太多复杂的哲学概念。为了能把锁链放在我希望的位置中,我手动地将每一独立的链环进行位置设定,直到得到满意的结果。这样一来我可以轻松地创建一定的随机性以促成了一个感觉更真实的锁链,我也使用了路径变形插件,但我发现它不适合我当前的需要,因为它会让锁链弯曲,使它们产生曲线,这种曲线会导致一个不自然的效果。叶子和花瓣:
ps正片叠底图片就颜色变暗,如何恢复原色提亮
图片的混合,在ps设计中经常会被用到,正片叠底的使用更为频繁,那么正片叠底较为熟知的功能,就是自动去除白色背景,免去抠图的步骤,提高设计效率,不过也会有弊端,如果背景图偏暗,那么正片叠底的图片也会变暗,如何把图片的亮度提高或者还原,且看下面的图文教程。 1、ps软件打开背景图,以及一张白色背景的人像,人像图片需要使用正片叠底来完成背景的去除, 2、可以看到设置为正片叠底之后,人像的上半部分,处于背景图的亮部区域,相对而言,其原有亮度损失不大,但处与背景图暗部区域的下半端,明显变暗了,由此可见,想要把人像变暗的部分提亮,只需要把对应的背景区域提亮, 3、笔者使用的方法是,在背景图上面添加一个透明图层,切换至画笔工具,前景色设置为白色,更换柔边的笔刷,硬度为0,顶端的【不透明度】选项,可以酌情调整, 4、选中空白图层,画笔放在人像上进行绘制,注意不要超过人像边缘,可以看到人像提亮了, 5、对于想要提亮的区域,可以反复绘制,最后调整图层的【不透明度】,达到理想效果即可。 6、对比一下提亮前和提亮后,效果还是非常明显的,只需要控制好笔刷以及不透明度,就可以把正片叠底的图片提亮, 以上方法的原理也比较简单,正片叠底后的效果,与背景图的明暗有关系,添加一个图层绘制白色区域,也就相当于提亮了该部分的背景图,进而还原了图片的亮度。
在 Dreamweaver 中打开并编辑现有文档
您可以打开现有网页或基于文本的文档(不论是否是用 Dreamweaver 创建的),然后在“设计”视图或“代码”视图中对其进行编辑。 如果打开的文档是一个另存为 HTML 文档的 Microsoft Word 文件,则可以使用“清理 Word 生成的 HTML”命令来清除 Word 插入到 HTML 文件中的无关标记标签。若要清理不是由 Microsoft Word 生成的 HTML 或 XHTML,请使用“清理 HTML”命令。也可以打开非 HTML 文本文件,如 JavaScript 文件、XML 文件、CSS 样式表或用字处理程序或文本编辑器保存的文本文件。将在“文档”窗口中打开文档。默认情况下,在“代码”视图中打开 JavaScript、文本和 CSS 样式表。可以在 Dreamweaver 中工作时更新文档,然后保存文件中的更改。
利用Key对象来实现响应键盘的操作
利用按钮检测按键动作很有效,但是并不利于检测持续按下的键,所以不适合于制作某些通过键盘控制的游戏。这时,您就需要用到Key对象。Key对象包含在动作面板的“对象”/“影片”目录下面,它由Flash内置的一系列方法、常量和函数构成。使用Key对象可以检测某个键是否被按下,如要检测左方向键是否被按下,可以使用如下ActionScript:if (Key.isDown(Key.LEFT)) { trace("The left arrow is down");} 函数Key.isDown返回一个布尔值,当该数中的参数对应的键被按下时返回true,否则返回false。常量Key.LEFT代表键盘上的左方向键。当左方向键被按下时,该函数返回true。Key对象中的常量代表了键盘上相应的键,下面列出了一些基本的常量:一些功能键的表示:Key.BACKSPACE Key.ENTER Key.PGDN Key.CAPSLOCK Key.ESCAPE Key.RIGHT Key.CONTROL Key.HOME Key.SHIFT Key.DELETEKEY Key.INSERT Key.SPACE Key.DOWN Key.LEFT Key.TAB Key.END Key.PGUP Key.UP 以上是键盘上的功能键,那么如何表示键盘上的字母键呢?Key对象提供了一个函数Key.getCode来实现这一功能,如下所示:if (Key.isDown(Key.getCode("x"))) { trace("X is pressed");} 上面脚本的意思就是,利用Key.getCode函数来告诉系统你是否按下了x键,如果按下了x键以后,函数Key.isDown则会返回true,在输出窗口就会输出X is pressed。最后给出实例源文件:下载
最新发布
妙用Word搞定生僻字
用计算机的时候,有时会遇到一些生僻字,特别是人名和地名中常常出现,如 “A”、“”、“础薄“懋”、“\”等。这些字用我们常用的输入法都无法输入,大家会想到用造字程序造一个字。造字时的麻烦倒也不必说了,造出来的字也难免比例失调。最让人头痛的是,因为办公室的机子多半是几人共享,因而常常会发生系统重装的事,而一旦系统重装,你辛辛苦苦造的字就彻底化为乌有了。于是,有时嫌麻烦,就干脆让生僻字空着或用一个类似的字替代,或者打印出来后手写上去。 这样做既影响了美观而且很不规范,这个问题困扰了我很长时间。直到最近,一个偶然的机会,我在使用Word过程中要插入一个符号,在弹出的对话框里,无意中进入到“CJK统一汉字”的子集选项中,发现里面有很多繁体字,还有许多不认识的见也没见过的字,我心里突然一亮,这里会不会有生僻字呢?我仔细研究了一下这些文字,发现它们的排列方式就是我们平时查字典时常用的部首检字法。 我想起我家的地址中就有一个生僻字“\”,这个字平时总以“契”的面目出现。那就查查这个字吧。在浩瀚的汉字库中,要迅速找到“石”字旁的汉字也不太容易。可不可以利用已输入的汉字快速定位呢?我赶忙输入了一个“碧”字,这个字不但是“石”字旁,而且它的笔画数是九划,刚好与“\”字相同。选中“碧”字,然后单击[插入]→[符号],太好了!一下子就定位到了“碧”字,细细找去,就在“碧”的同一行,我找到了久违的“\”字,马上点击[插入],哈!成功了!一发不可收拾,我又用同样的方法找到了“A”、“”、“础钡染常出现在人名中的生僻字。 这个方法用起来十分简便,它的要点是要先输入一个和生僻字偏旁相同、笔画接近的常用字(不必追求笔画完全一致,如果你身边没有一本新华字典,这会令你绞尽脑汁),然后选定这个汉字,单击[插入]→[符号],成功就在眼前了。 也许你会问,在Word里面可以这样做,但在另外的一些软件里面,并没有[插入]→[符号]这个功能(如Excel),那该怎么办呢?办法只有一个,先在Word中输入,然后复制过去呗。
繁难字库生僻字大全
这个字库很管用,志书年鉴的一些生僻字一般都可以找到,减少了造字的麻烦,直接复制、粘贴,就可以顺利出胶片。譬如洛阳有一条河叫“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冂冖冫凡凵刂
安装字体文件不占用硬盘空间的方法
首先打开系统的“字体”文件夹,然后找到需要安装的字体文件,用右键拖动字体文件到“字体”文件夹中,然后会弹出一个菜单,选择“在当前位置创建快捷方式”,这样,你在使用该字体时,只需插入该字体光盘即可使用此字体了,不会占用硬盘空间! 其实原理就是把其他介质上的字体文件的快捷方式安装到系统的字体文件夹中,在系统的注册表中建立字体文件的关联信息,这样,就可以在需要使用相应的字体时,插入装有字体的介质,就可以使用相应的字体了……
认识和管理电脑中的字体
一、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文件夹”选项决定了字体安装后的保存位置。
常用汉字字体字号的介绍及选用原则
■宋体 也称书宋。笔画横平竖直,粗细适中,疏密布局合理,使人看起来清晰爽目,久读不易疲劳且阅读速度快,一般书刊的正文都用宋体。 宋体的另一优点是印刷适性好。一般书刊正文都用5号字,由于宋体的笔画粗细适中,印出的笔道完整清晰。若用5号仿宋,因笔画太细,易使字残缺不全。若用楷体,又因笔画较粗,对多笔画字易糊。 ■楷体 笔画接近于手写体,直接由古代书法发展而来,字体端正、匀称。一般用于: ・小学课本及幼教读物。选用4号楷体便于孩子们模仿与模写; ・中、小号标题,作者的署名等,以示与正文字体相异而突出。但用楷体作标题时,至少要比正文大一个字号,否则标题字会显得比正文还小。 ・报刊中的短文正文。 ■仿宋 由古代的仿宋刻本发展而来,是古代的印刷体。笔画粗细一致,起落锋芒突出。阅读效果不如宋体,因此一般书刊正文不用仿宋体,它一般用在: ・作中小号标题; ・报刊中的短文正文; ・小4号、4号、3号字的文件; ・古典、文献和仿古版面。 ■黑体 又称等线体、粗体、平体、方头体。字体方正饱满,横竖笔画粗细相同,平直粗黑,是受西文等线黑体的影响而设计的,一般用于: ・各级大小标题字,封面字; ・正文中要突出的部分。 ■小标宋 笔画横细竖粗,刚劲有力,笔锋突出。科印排版系统中没有此种字体,是华光排版系统中的一大特色,是理想的排大、小标题、封面字的字体。 ■报宋 字形方正,笔画比宋体细,比仿宋粗。也是华光排版系统的一大特色。故名思意,用于排报纸版心字,用小五号或六号报宋,印出笔道清晰,多笔画字不会糊,也可作中、小标题字。对于正文以外内容的字号选用原则,请查有关的排版系统资料。
中文版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 大概试了一下,这个新字体和原有的“华文细黑”有点像(如下图),但在由于笔划比较厚,所以显得更清晰一些,此外在边缘处理上也比“华文细黑”要好一些,更圆滑,有点书法的感觉,可以通过附图中“民”字的比较看出来这一点。 注: 附:
让你电脑显示的字体更圆润清晰
如果你的操作系统是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显示屏由于聚焦本身就不清晰,所以才会让人觉得反而开启后失真。
关于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/
使用11px及10px的清晰汉字字体
注:以下效果在WindowsXP和Photoshop CS下测试通过。在Photoshop中要想得到清晰的汉字,就需要关闭抗锯齿功能。但是这样当字体小于12px的时候,系统默认的宋体就变得一团糟,而黑体或者其他的外挂字体也都纷纷变得很难看在确保系统安装有繁体中文及日文支持后,可在Photoshop中使用PMingLiU和MS UI Gothic字体。最简单的安装方法就是用IE打开任意网站,将字符编码改为繁体中文和日文,系统就会自动安装相应的字符。PMingLiU可支持到11px的大小,允许中文简体和繁体字符。MS UI Gothic其实是日文字体,因此只支持日文字库中有的汉字,比如“够”就不存在日文字库中。由于日文中的汉字大部分是繁体中文,因此输入的时候要使用支持繁体字符的输入法(如微软拼音)。字体范例如下:可以看到11px时候的MS UI Gothic就已经是10px大小,只不过间距略大而已。其实要发现隐藏的非中文名称字体也不困难,进入Windows的fonts目录,凡是字节数在1M以上的英文名称字体,其中就很可能包含了汉字字形。不过据我试验结果,10px已经是已经汉字字体中最小的了。
象素字简介及象素字体查找好去处
象素字体, 一共分3种, bitmap, vector和postscript, pixel font属于bitmap, 是由一个个点组成的, 目前最流行的仍然是pixel字体, 已经流行了接近3年. 如果你不知道何为pixel font, 请先了解一下, 学一下使用方法, 不要乱用. 下面是需要注意的:使用tips: 查找象素字体:http://www.zhaozi.cn/s/en/xiangsuzi/国内比较著名一家提供免费字体的网站,特点是能够提供输入文字查看字体效果http://www.04.jp.org国内也很多人用pixel font, 但基本上是用日本的04系列. 所以我劝你用别了, 太滥了呀!http://www.hi-type.com 或 http://www.hi-type.de唉, 你不走运, 这是极出色的字体网站, Micromedia 的MX系列, 右边的panel上用的字体, 就是来自hi-type. 我刚试过, 连不上, 可能down了. 注册后可以免费下载:http://www.zetuei.com日本网站绝影, 光看名字就知道是cool!http://www.superlooper.desuperlooper有近20款出色字体, 不少设计网站都有使用.http://www.miniml.com如果你从没看过miniml, 你应该检讨一下要不要在这行混下去. 这是带动pixel font潮流的鼻祖. Hooge, Kroge, Standard三种字体是目前网上设计网站中用得最多的字体. 看上去有点像04, 但个人认为比04要好. 他们的字体以前是免费下载的, 红了之后开始收费, 好在我下得快.http://www.tint.de里面有目前做得最小的pixel font, 只有4 pointhttp://www.etherbrian.com有种很好看的字体, 自己去看http://www.fountain.nu不错的付费网站, 但几是块买个来做logo也不贵吧http://www.cubadust.com还是要给钱买的http://www.orgdot.com/aliasfonts极出色的alias font(same as pixel font)根据地.http://net.jp.org/jafont这里没有字体下, 但有大量日本字体网站的连结.http://www.wpdfd.com/wpdtypo3a.htm付费的, 但有pixel font的介绍http://2theleft.rdx.net/fontpage2.htm里面有很多适合做logo的字体http://fenotype.com好像是楼上的另一个家, 里面有几十种出色字体免费下载.http://www.myeye25.comcool死了的pixel fonthttp://www.myfonts.com我告诉你, 给钱买的就是不同http://www.dafont.com/en没甚么好介绍的, 字体太多, 但质素比一般网站收藏的好http://www.koenhachmang.com有些很好看的字体, 但现在我也找不到, 你找找看.