当对应轮廓缺少控制点时对图形对象的适当呈现转让专利

申请号 : CN200510075873.X

文献号 : CN1702734B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : B·施塔姆G·C·希契科克M·J·达根

申请人 : 微软公司

摘要 :

本发明的原理涉及当对应轮廓缺少必需的控制点时,适当地呈现图形对象。一种计算机系统为该图形对象的特征计算目标宽度。该计算机系统计算与该特征相对应的中心线位置。该计算机系统基于该特征的计算所得的目标宽度,将该中心线的计算所得的位置舍入到一网格位置。该计算机系统调整该特征的一个或多个控制点的位置,使之与该中心线的网格位置一致。

权利要求 :

1.在可访问相关图形对象集的计算系统中,每一相关图形对象集包括代表了来自所述相关图形对象集的个别图形对象的轮廓,一种用于当对应轮廓缺少图形对象的特征的控制点时动态地优化所述图形对象的呈现的方法,所述方法包括:为所述图形对象的特征计算目标宽度的动作;

计算与所述特征相对应的中心线位置的动作;

基于对所述特征计算所得的目标宽度,将计算所得的中心线位置舍入到一网格位置的动作,其中所述中心线可被舍入到一个网格位置的某一小数;

调整所述特征一个或多个控制点位置,使之与所述中心线网格位置一致的动作;

2.如权利要求1所述的方法,其特征在于,为所述图形对象的特征计算目标宽度的动作包含为文本字符的纵向笔画计算目标宽度的动作。

3.如权利要求1所述的方法,其特征在于,为所述图形对象的特征计算目标宽度的动作包含为文本字符的横向笔画计算目标宽度的动作。

4.如权利要求1所述的方法,其特征在于,为所述图形对象的特征计算目标宽度的动作包含为文本字符的斜向笔画计算目标宽度的动作。

5.如权利要求1所述的方法,其特征在于,为所述图形对象的特征计算目标宽度的动作包含基于要呈现所述图形对象所用的字号和分辨率来计算所述目标宽度的动作。

6.如权利要求1所述的方法,其特征在于,为所述图形对象的特征计算目标宽度的动作包含提示处理器处理从一字体程序加载的指令的动作。

7.如权利要求1所述的方法,其特征在于,计算与所述特征相对应的中心线位置的动作包含计算与文本字符的横向笔画相对应的中心线位置的动作。

8.如权利要求1所述的方法,其特征在于,计算与所述特征相对应的中心线位置的动作包含计算与文本字符的纵向笔画相对应的中心线位置的动作。

9.如权利要求1所述的方法,其特征在于,计算与所述特征相对应的中心线位置的动作包含计算与文本字符的斜向笔画相对应的中心线位置的动作。

10.如权利要求1所述的方法,其特征在于,计算与所述特征相对应的中心线位置的动作包含基于所述轮廓上的控制点位置计算中心线位置的动作。

11.如权利要求1所述的方法,其特征在于,计算与所述特征相对应的中心线位置的动作包含提示处理器处理从一字体程序加载的指令的动作。

12.如权利要求1所述的方法,其特征在于,基于所述特征的计算所得的目标宽度,将计算所得的中心线位置舍入到网格位置的动作包含将计算所得的所述中心线位置舍入到半个网格位置的动作。

13.如权利要求1所述的方法,其特征在于,基于所述特征的计算所得的目标宽度,将计算所得的中心线位置舍入到网格位置的动作包含将计算所得的所述中心线位置舍入到全网格位置的动作。

14.如权利要求1所述的方法,其特征在于,基于所述特征的计算所得的目标宽度,将计算所得的中心线位置舍入到网格位置的动作包含基于计算所得的文本字符的目标宽度,舍入计算所得的所述中心线位置的动作。

15.如权利要求1所述的方法,其特征在于,基于为所述特征计算所得的目标宽度,将计算所得的中心线位置舍入到网格位置的动作包含提示处理器处理从一字体程序加载的指令的动作。

16.如权利要求1所述的方法,其特征在于,调整所述特征的一个或多个控制点位置,使之与所述中心线网格位置一致的动作包含基于所述特征的计算所得的中心线和原始中心线,调整一个或多个控制点位置的动作。

17.如权利要求1所述的方法,其特征在于,调整所述特征的一个或多个控制点位置,使之与所述中心线网格位置一致的动作包含垂直于所述笔画的方向调整所述一个或多个控制点位置的动作。

18.如权利要求1所述的方法,其特征在于,调整所述特征的一个或多个控制点位置,使之与所述中心线网格位置一致的动作包含提示处理器处理从一字体程序加载的指令的动作。

19.如权利要求1所述的方法,其特征在于,每个网格位置包括一象素。

20.在可访问相关图形对象集的计算系统中,每一相关图形对象集包括代表来自所述相关图形对象集的个别图形对象的轮廓,一种用于当对应轮廓缺乏一图形对象的特征的控制点时动态地优化所述图形对象的呈现的方法,所述方法包括:为所述图形对象的特征计算目标宽度的动作;

计算与所述特征相对应的中心线的位置的动作;

操纵所述特征的控制点位置,使之与所述中心线的恰当地舍入所得的位置一致的步骤,其中所述中心线可被舍入到一个网格位置的某一小数。

说明书 :

当对应轮廓缺少控制点时对图形对象的适当呈现

技术领域

[0001] 本发明涉及诸如文本等图形对象的呈现,尤其涉及当对应轮廓缺少必须的控制点时对图形对象的适当呈现。

背景技术

[0002] 计算科技已经改变了我们工作和娱乐的方式。计算系统现在采用各种各样的形式,包括台式计算机、膝上计算机、图形输入板PC、个人数字助理(PDA)等等。即便是家用设备(例如冰箱、烤箱、缝纫机、安全系统等等)也有不同级别的处理能力,因而可以被视为计算系统。随着时间的推移,处理能力可被结合到许多传统上并无处理能力的设备中。因此,计算设备的多样性可能进一步增加。
[0003] 几乎所有与人类接口的计算系统都使用显示器来传递信息。在很多情况下,显示的要求被视作该计算系统的一个重要属性。文本信息(例,拉丁字符)的显示通常包括处理代表字体字符的字形。字形包括控制点和指令,这些指令是用来连接控制点,从而对应字符的轮廓可以任意的网格空间(例,象素网格)中生成。字符经常被定义成以较大的尺寸和较高的分辨率显示,然后当字符要以较小的尺寸和较低的分辨率呈现(或被呈现为粗体、斜体等等)时算术地按比例缩小(或执行其它操纵)。因而,对一个字符(每种字体)需要储存较少的描述,可能仅一个描述。
[0004] 为了按比例缩小字符,控制点的位置可以除以一比例缩放因子。例如,为按比例缩放因子10来按比例缩小一个字符,(以较高的分辨率)定义字符的每一控制点的坐标可以除以10。可以将定义用于在100×100的网格上显示的字符的控制点按比例缩小为在10×10的网格上显示。因而,在网格位置(50,30)处的控制点可被按比例缩小到在网格位置(5,3)处的控制点,在网格位置(70,70)处的控制点可被按比例缩小到在网格位置(7,7)处的控制点,等等。因此,代表该字符的较小的轮廓可被计算出来,且为该字符保存许多不同尺寸的位图的需求也减少了。
[0005] 然后该较小的轮廓可被分析,从而标识要被开启和关闭(一种经常被称作“扫描转换”的过程)的网格位置(例如,象素)。一种扫描转换算法判断一个网格位置的中心是在所得的按比例缩小的轮廓之内还是之外。当网格位置的中心在按比例缩小的轮廓之内,则该网格位置被开启。另一方面,当网格位置的中心在按比例缩小的轮廓之外,则该网格位置被关闭。
[0006] 不幸的是,有时候,尤其是在低分辨率时,扫描转换的结果产生字符的无法接受的表示。无法接受的字符表示可能由按比例缩小过程中的舍入误差,或该扫描转换过程本身所导致。此外,当单个网格位置(例如,象素)与字符特征比例一致时,舍入误差对字符表示的影响更严重。例如,在50×50网格上导致一个网格位置被不恰当地开启(或关闭)的舍入误差甚至不会被人眼检测到。然而,在4×4网格上使得一个网格位置被不恰当地开启(或关闭)的舍入误差可能会产生被视作人眼无法接受的字符。因而,在较低分辨率下,扫描转换甚至无法保留该字符原始轮廓的拓扑结构,例如,导致不连贯的网格位置、被不恰当定位的特征以及缺少对称性。
[0007] 例如,当轮廓上与对应字符特征相关联的控制点数量减少了,则对该轮廓的扫描转换将导致该对应字符特征在网格空间中的非最优位置上被呈现。拉丁(希腊、西里尔等等)字体中的许多字符在该字符顶部与底部之间的某处有一横笔(“横杠”)。例如,大写的“H”在顶部与底部之间大约一半处有一横。图1描述了Times New Roman大写“H”的轮廓100。按照设计,此横杠处于“H”的竖笔数学中点的略上方。即,距离101少于距离102。
[0008] 然而,当该“H”以较小的尺寸和较低的分辨率(例,在96dpi设备中的9磅)被呈现时,累积的量化误差可导致该横杠被呈现于数学中点的下方。由于该横杠按照设计是要在中点上方呈现的,因此在中点下方呈现该横杠决不是最优的。象素图案103表示了被开启以用9磅以及96dpi的分辨率来呈现Times New Roman大写“H”的像素(即,在轮廓100上执行扫描转换的结果)。如象素图案103所描绘的,该横杠处于该“H”竖笔的数学中点之下。
[0009] 非最优呈现的一个原因是因为,该“H”在该横杠的边缘上有控制点,但在例如沿着该横杠两边之间的中轴的虚线(由短划线104表示)上没有控制点。传统的提示解决方案因而对例如该横杠的顶部边缘上的第一控制点(控制点107)添加第一约束。这第一约束强加了第一控制点相对于底线上的其它控制点(例如,控制点109)和大写线(caps line)上的其它控制点(例如,控制点106)在垂直方向上的其它成比例的位置。接下来,传统的解决方案也对例如该横杠的底部边缘上的第二控制点(控制点108)添加第二约束。该第二约束在底部边缘上的第二个控制点和顶部边缘上之前已被约束的第一控制点(控制点107)之间强加一个距离。
[0010] 由于第一和第二约束必须将垂直方向上的位置舍入到最近的网格位置(例,象素),因此第一和第二约束的每一个在任一方向(向上或向下)上会引入一最大至半个象素的舍入误差。在某些不幸的情况下,这些舍入误差会累积(例如,该第一和第二约束都下舍入)-导致将该横杠置于数学中点之下。
[0011] 此外,当一轮廓穿过一个或多个网格位置的中心时,对该轮廓的扫描转换可导致该字符在网格空间中不对称地呈现。斜体造成特别有挑战性的难题,因为斜笔锯齿状的特性使得斜体更难以处理,并且该问题可能还伴随着量化误差。
[0012] 如前所述,扫描转换器必须定义内部象素,即使在象素可以同时是内部或外部象素(例如,当一轮廓穿过该象素的中心时)的情况下也必须如此。例如, 定义了当轮廓穿过象素的中心时,该象素被开启。因而,如果轮廓是直线,且如果该直线的游程(run)和上升量(rise)(斜率)约分为一对奇数,则该轮廓将穿过一个或多个象素中心,并且 将开启一个象素,此象素可能看起来象一个额外的象素。
[0013] 现在参考图2,图2描绘了一个Arial斜体大写“H”。左面斜笔的右边缘(从控制点211到控制点214)每横向走一个象素,就会升高5个象素——总计横向2个象素并向上10个象素,约分后就成为一对奇数1和5——我们已经可以观察到额外的象素(象素231、
232和233)。此外,即使当中心恰好在轮廓上的象素被关闭,问题依然会发生。例如,在图2中,如果中心恰好在轮廓上的象素将被关闭(而不是开启),将会丢失两个象素(象素234和236),从而产生该象素图案的不连续性。一种方法是定义,当边缘在左边缘和右边缘之间交替时,其中心恰好在轮廓上的象素在内部象素和外部象素之间交替。尽管这可以解决某些斜笔画的问题,然而这一交替方法也可能在环状笔画上引入新的问题。例如,这样的一种交替方法可能在例如“O”之类的字符中导致不对称象素图案。
[0014] 此外,为遵循约束而进行的任何控制点的移动会引起控制点被移动到不精确的位置。在进一步计算中使用不精确位置上的控制点会导致在网格空间中对应字符的非最优呈现。提示控制点常可包括将某些控制点与其它控制点对齐。例如,仍旧参考图2,因为控制点211和214可能作为服从它们自己的约束(例如,各自被约束于顶线和底线)的结果而被移动,则控制点212和213可能必须与控制点211和214对齐。尽管对齐动作在数学上是精确的概念,但是按照字体提示语言(例, 的实现可能引入数字的不准确度,因为字体提示处理器的内部数字精度通常是有限的。例如,字体提示语言 使用6个二进制数位来存储小数的控制点位置数据,因而每个数字结果只可能准确到象素的1/26或1/64。从而,将例如控制点212与其父控制点211和214对齐的结果在最好情况下只能准确到最近的1/64象素。
[0015] 更具体地,由于从控制点214到控制点211的线横跨2个象素,纵越10个象素(如象素图案203所描述的),每纵越一个象素,它将横跨0.2个象素。因此在控制点213,它应该横跨了1.2个象素,因为控制点213纵越了6个象素,或按1/64个象素计,它应横越112.8/64个象素。不幸的是,12.8/64超出了绝大部分(若非所有)字体提示处理器的精度限制。即,12.8/64完全不能被表示,且必须在一个方向或另一方向上被舍入(例,向上或下舍入到最近的1/64)。提示处理器通常用默认舍入行为被配置成,例如,总是舍位、总是下舍入或总是上舍入。在图2中,看似偶然地,即使上舍入将是对实际值更好逼近(12.8比12更接近于13),该横杠的控制点也被下舍入。此误差看来是无害的,因为它既不导致虚假象素,也不导致丢失象素。
[0016] 相反地,对于也横跨112.8/64个象素的控制点215,下舍入的确导致虚假象素(象素235),而上舍入可以防止此问题。而且,大部分典型字体提示处理器会产生相差一个象素的小数的结果,而无论舍入的方向如何。因而,即使舍入是正确的,对齐问题依然会产生。
[0017] 此外,有太多控制点的字符轮廓会导致网格空间中对应字符的非最优呈现。例如,当轮廓的确切形状复杂程度增加时,错误的象素可能随之增加。例如,图3描绘了一个Palatino斜体“H”。该Palatino斜体“H”比图2中描绘的Arial斜体“H”显著地包含更多控制点。该Palatino斜体“H”笔画的边缘略微弯曲,因而包含额外的控制点来对这些弧线建模。如图3所示,这些控制点以看似随机的风格被定位于轮廓300上。对轮廓300应用传统的扫描转换将导致如象素图案303等的非最优象素图案。
[0018] 不幸的是,某些提示处理器按连续数字来引用控制点,并且移除一个控制点使其它控制点都得重新编号。因而,重新编号控制点可引起现有的提示指令引用不正确的控制点号。例如,移除轮廓300上被视作次要的控制点会引起现有提示被不恰当地应用到任何剩余的控制点(或根本未被应用)。对剩余控制点不适当地应用提示会使对应象素图案严重地恶化。
[0019] 因此,为补偿扫描转换的某些时候的非最优或不恰当的结果(例如,以较低的磅值和较低的分辨率),印刷工人通过向字符轮廓手动地添加增量异常(delta-exception)提示(例, 指令),从而在特别(ad-hoc)的基础上计划性地控制扫描转换过程。增量异常提示是对个别字符专用,且对特定字号专用的提示。即,对于遗憾地存在量化问题的(字体的)每一字号,印刷工人必须在适当情况下添加可能多个增量异常指令。因为增量异常提示是如此专用,增量异常提示通常被与向其应用该增量异常提示的字符一同存储(例,在字体文件中)。而且,使用增量异常提示是一个交互式的过程,在应用对应的异常指令之前和之后都需要重复地对多个字号进行视觉检查,这是很费力的,并且容易引入不一致性。
[0020] 部分地由于不同字体的各种各样的艺术和技术特点,增量异常提示必须也适合于单个字体。即,一种字体的增量异常提示通常无法由其它字体(即使是同一字符)重新使用。因而,对每种新字体,印刷工人需要反复地确定适当的增量异常提示。因此,补偿跨越各种不同字体的扫描转换的非最优或不恰当的结果所需的资源可以是非常大量的。因此,自动化象素图案的优化的机制是有利的。

发明内容

[0021] 现有技术的前述问题被本发明的原理所克服,本发明针对当对应轮廓缺少必需的控制点时适当地呈现图形对象。计算机系统为该图形对象的特征计算目标宽度。该计算机系统计算对应于该特征的中心线的位置。该计算机系统基于为该特征所计算的目标宽度,将所计算的中心线位置舍入到一个网格位置。该计算机系统调整该特征的一个或多个控制点的位置,以与该中心线的网格位置相一致。
[0022] 本发明的附加特征与优点将在以下的描述中阐述,并且从该描述中可以部分地清楚这些特征与优点,或亦可从本发明的实践中习得。本发明的特征和优点可通过所附权利要求书中所特别指出的仪器及其组合来实现和获得。通过阅读以下描述和所附权利要求书,将会更彻底地明白本发明的这些及其它特征,或亦可通过对下文中阐述的本发明的实践而习得。

附图说明

[0023] 为了描述可获得本发明上述及其它优点与特征的方式,对在上面简述的本发明的更具体的描述将参考在附图中示出的其具体实施例来呈现。要理解,这些附图描述的只是本发明的典型实施例,因而不应被视作对其范围的限制,本发明将通过使用附图以附加的特殊性和细节来描述和解释,附图中:
[0024] 图1是现有技术中文本字符的轮廓和对应的象素图案的图示。
[0025] 图2是现有技术中文本字符的轮廓和对应的象素图案的图示。
[0026] 图3是现有技术中文本字符的轮廓和对应的象素图案的图示。
[0027] 图4示出了用于实现本发明的原理的计算机体系结构。
[0028] 图5示出了用于当轮廓缺少控制点时,动态地改变图形对象的轮廓的方法的示例流程图。
[0029] 图6示出了通过实现本发明的原理所得的轮廓和对应的象素图案。
[0030] 图7A示出了用于当轮廓包括大约在网格位置中心的控制点时,动态地改变图形对象轮廓的方法的示例流程图。
[0031] 图7B示出了用于当轮廓包括处于不精确位置的控制点时,动态地改变图形对象轮廓的方法的示例流程图。
[0032] 图8示出了通过实现本发明的原理所得的轮廓和对应的象素图案。
[0033] 图9示出了用于当轮廓包括过多控制点时,动态地改变图形对象的轮廓的方法的示例流程图。
[0034] 图10示出了通过实现本发明的原理所得的轮廓、对应的简化轮廓和对应的象素图案。
[0035] 图11示出了用于实现本发明的原理的合适的操作环境。

具体实施方式

[0036] 本发明的原理涉及用于当对应轮廓缺少必须的控制点时适当地呈现图形对象的系统、方法和计算机程序产品。计算机系统为该图形对象的特征计算目标宽度。该计算机系统计算对应于该特征的中心线的位置。该计算机系统基于对该特征所计算的目标宽度,将所计算的中心线位置舍入到一网格位置。该计算机系统调整该特征的一个或多个控制点的位置,以与该中心线的网格位置相一致。
[0037] 在本发明范围内的实施例包括携带或在其上储村计算机可执行指令或数据结构的计算机可读介质。此类计算机可读介质可以可由通用或专用计算系统访问的任何可用介质。作为示例而非局限,此类计算机可读介质可包括物理存储介质,例如RAM、ROM、EPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备、或可用于携带或存储期望的计算机可执行指令、计算机可读指令、或数据结构形式的程序代码手段并可由通用或专用计算机系统访问的任意其它介质。
[0038] 在本说明书及所附权利要求书中,“网络”被定义为使计算系统和/或模块间能传送电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线的、无线的、或硬连线与无线相结合的)传送或提供给计算系统时,该连接被适当地视为计算机可读介质。因而,任意此类连接被适当地称作计算机可读介质。上述的组合也应被包括在计算机可读介质的范畴中。计算机可执行指令包括,例如引发通用计算系统或专用计算系统执行某一个或一组特定功能的指令和数据。计算机可执行指令可以是,例如二进制指令、诸如汇编语言等中间格式指令、或甚至是源代码。
[0039] 在本说明书及所附权利要求书中,“计算系统”被定义为协同工作以对电子数据执行操作的一个或多个软件模块、一个或多个硬件模块、或其组合。例如,计算系统的定义包括个人计算机的硬件组件,以及诸如该个人计算机的操作系统之类的软件模块。模块的物理布局不是重要的。计算系统可包括通过网络耦合的一个或多个计算机。同样地,计算系统可包括单个物理设备(如移动电话或个人数字助理“PDA”),其中,内部模块(例如存储器和处理器)协同工作以对电子数据执行操作。
[0040] 如在此所使用的,术语“模块”或“组件”指在计算系统上执行的软件对象或例程。此处描述的不同组件、模块、引擎以及服务可以被实现为在计算系统上执行的对象或过程(例如,单独的线程)。尽管此处所描述的系统和方法较佳地以软件实现,然而软件加硬件或纯硬件的实现也是可能且被构想的。
[0041] 本领域的技术人员可以理解,本发明可在具有多种计算系统配置的网络计算环境中实施,这些计算系统配置包括个人计算机、膝上计算机、手提设备、多处理器系统、基于微处理器的或可编程消费者电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机等等。本发明还可以在分布式系统环境下实施,其中,通过网络链接的(以硬连线数据链路、无线数据链路、或有线和无线数据链路的组合)的本地和远程计算系统都执行任务。在分布式系统环境中,程序模块既可位于本地,也可位于远程存储器储存设备。
[0042] 图4示出了用于适当地呈现图形对象的计算机体系结构400的一个示例,这些图形对象以其它方式则会被不适当地呈现或以非最优方式呈现。通常,响应于来自应用程序(例如,应用程序417)的命令(例如,呈现命令418),计算系统416可使图形对象,例如文本,在输出设备428上被呈现。例如,响应于对Arial字体和6磅值的选择,文字处理程序可随后使用Arial字体以6磅值呈现文本。
[0043] 例如,字体文件401(例如,存储在计算系统416中或可由计算系统416通过网络访问)包含字体程序402、CVT程序403以及字形集404。字体程序402包括当字体文件401被(例如,应用程序417)访问时可被加载的一组指令。字体程序402便于创建可从字体文件401的其它地方(例如,从CVT程序403或提示408)调用的函数定义以及指令定义。CVT程序403包括当磅值或变换被改变时执行的一组指令。CVT程序403便于字体宽度改变,从而减轻字体开发者必须管理各个字形中的此类改变的压力。CVT程序403可用于建立适用于特定磅值和分辨率的字体的标准化距离(例如,笔画深浅度、字形间距等等)和参照高度103(例如,大写线(capitalization line)、下标线等等)的表格。CVT程序403可包括调用字体程序402中定义的其它指令和函数的指令。
[0044] 字形集404(例如,字符集)可包含多个字形(例如,代表了字符)。尽管只有字形406被明确地描述,纵向的省略号441代表除字形406以外的其它字形可被包括到字形集404中。字形集404中的每个字形可与对应的控制点及用于适当地呈现该字形的字形专用提示相关联。例如,当呈现字形406时可使用控制点407和提示408。特定字形的字形专用提示(例如,提示408)包括调用在字体程序402中定义的其它指令和函数的指令。
[0045] 提示可以是诸如 等字体提示语言的计算机可执行指令,代表着对字形(例如,在字形组404中)的约束。某些约束可对字形集404中的每个字形都加以约束。例如,CVT程序403可包括字体提示语言指令,以代表约束字形集404中每个字形(例如,约束到同一大写线或与其它字形的水平距离)的标准化距离和参照高度。其它约束可以是对某一特定字形专用的。例如,提示408可包括用于约束字形406(例如,对“H”的横杠的约束)的字体提示语言指令。
[0046] 字体文件可包括以主尺寸(例如,一种较大的尺寸)表示字形轮廓(例如,主轮廓441)的控制点。例如,字体文件401可包括用于以72磅(一指定的分辨率)呈现的字形的控制点和提示。因而,当选定一种字体和字体尺寸(例如,如由显示命令418所指示的),比例缩放模块419可访问字体文件401,并按比例缩小(或按比例放大)字形集404,使其按所选的字体尺寸(例如,指定的分辨率或甚至一种不同的分辨率下的12磅)呈现。比例缩放模块419可输出包含与字形集404相对应的、已按比例缩小的字形的已缩放字形421。
例如,已缩放轮廓433与主轮廓431相对应。已缩放字形421还可包括在字形集404被比例缩小以后也保持不变的提示408。比例缩放模块419可部分地基于已选择的字体尺寸、分辨率、以及诸如缩放因子等其它可能的参数来改变缩放的幅度。
[0047] 为按比例缩小字形,对应控制点的位置可以除以一个比例缩放因子。例如,为了呈现其大小为字体文件中所表示的1/10的字形,表示该字形(以较大的尺寸)的每个控制点的坐标可以除以10。可以将定义用于在100×100网格上显示的字符的控制点按比例缩小以在10×10网格上显示。因此,在网格位置(50,30)处的控制点将被按比例缩小到在网格位置(5,3)处的控制点,在网格位置(70,70)处的控制点将被按比例缩小到在网格位置(7,7)处的控制点,等等。因而可以计算字形的较小轮廓。
[0048] 当为在彩色显示设备上呈现而按比例缩小时,控制点位置可以用额外的精度来计算。例如,某些彩色计算机显示器上的象素可包括截然不同的红、绿和蓝子成分,或称作“子象素”。子象素可被个别地寻址,从而可确定控制点至少下至子象素的精度,例如1/3象素。改变子象素的亮度也会致使该子象素看起来较粗或较细,潜在地导致精度看起来有额外的增加。因而,被按比例缩小的控制点位置可包括子象素地址以及指示该被寻址的子象素亮度的亮度值(例如,在0-255范围内)。
[0049] 提示处理器422可处理提示(字体提示语言的指令)来更适当地呈现字形(例如,以较小的尺寸)。某些提示可以与已缩放字形一起被包括在内。例如,已缩放字形421在适当时可包括用于对应于字形集404中个别字形的提示(例如,提示408)的字体提示语言指令。其它提示可从字体文件中接收。例如,提示处理器422可从字体文件401接收字体程序402和CVT程序403。提示处理器422可处理提示并根据该提示来改变已缩放字形(例如,移动控制点来改变已缩放的轮廓)。提示处理器422可输出所提示的字形,例如所提示的字形426。
[0050] 扫描转换模块424可接收所提示的字形(例如,所提示的字形426),并可标识被开启的网格位置(例如,象素、子象素或虚象素),以及标识被关闭的网格位置(可被称作“扫描转换”的过程)。扫描转换模块424可从字体文件401输出一个或多个字形的象素化的表示(例如,象素化表示427)。输出设备428可接收象素化表示(例如,象素化表示427),并相应地将其呈现。输出设备428可以是单色或者彩色输出设备,例如显示器或打印机。
[0051] 图6示出了通过实现本发明的原理所得的轮廓600以及对应的象素图案603。轮廓600代表Time New Roman大写“H”的轮廓。按照设计,横杠(笔画641)的位置可以在数学中点略上方处。即,距离621会略短于距离622。
[0052] 图5示出了用于当轮廓缺少控制点时动态地改变图形对象的轮廓的示例方法500的流程图。方法500将参照轮廓600、象素图案603以及计算机体系结构400中所描述的计算系统、模块和数据来描述。
[0053] 方法500包括计算系统为图形对象的一个特征计算目标宽度(或高度)的动作(动作501)。例如,提示处理器422可处理从字体程序402加载的指令,来计算笔画641的目标宽度(例如,控制点631和控制点632之间的距离)。目标宽度可以是一个或多个网格位置(例如,一个或多个象素)。当轮廓的尺寸小到笔画的宽度少于一个网格位置时,目标宽度可被上舍入到一个网格位置。尽管笔画641是横向笔画,纵向和斜向笔画的目标宽度也可被计算。
[0054] 方法500包括计算与该特征相对应的中心线位置的动作(动作502)。例如,提示处理器422可处理从字体程序402加载的指令,来计算中心线642的位置(中心线642与控制点631和控制点632等距)。尽管中心线642是横线,纵向和斜向中心线的位置也可被计算。
[0055] 方法500包括基于对该特征所计算的目标宽度,将所计算的中心线舍入到一个网格位置的动作(动作503)。例如,提示处理器422可处理从字体程序402加载的指令,以基于笔画641的目标宽度,将计算所得的中心线642的位置舍入到一个网格位置。为降低累积量化误差的可能性,中心线642可被舍入到一个网格位置的某一小数。例如,当笔画641的目标宽度是奇数(例如,奇数个网格位置),则中心线642可以被舍入到1/2个网格位置。另一方面,当笔画641的目标宽度是偶数(例如,偶数个网格位置),中心线642可以被舍入到全网格位置。
[0056] 方法500包括调整该特征一个或多个控制点的位置,使之与中心线的网格位置一致的动作(动作504)。例如,提示处理器422可处理从字体程序402加载的指令,来调整控制点631,632,633和634的位置,使之与中心线642的网格位置一致。这提高了呈现更接近轮廓600的象素图案的可能性。例如,如象素图案603所示,这提高了横杠会被呈现于数学中点上方的可能性。
[0057] 接下来的第一个伪代码例子表示了一种算法,该算法可被表达和/或执行,以当轮廓缺少控制点时,便于动态地改变图形对象的轮廓。第一个伪代码例子可以用多种编程语言(例,TrueType )来表达,且由对应的编译器或程序解释器(例如,提示处理器422)来处理。在第一个伪代码例子里,符号“/*”和“*/”之间的文本表示描述该伪码所实现的功能的注释。
[0058] 第1行:输入:parent0,child0,childl,parent1,控制值
[0059] /*确定目标笔画深浅度*/
[0060] 第2行:if control value是-1 then
[0061] 目标笔画深浅度:=原始笔画深浅度和1个象素之间的较大者
[0062] 第3行:else
[0063] 目标笔画深浅度:=control value和1个象素之间的较大者
[0064] 第4行:将目标笔画深浅度舍入到最近的全象素
[0065] /*确定为了相一致每个笔画边缘必须被调整的量*/
[0066] 第5行:笔画深浅度调整量:=(目标笔画深浅度-原始笔画深浅度)/2[0067] /*为笔画确定目标中心线*/
[0068] 第6行:原始笔画中心线:=(原始child0位置+原始child1位置)/2[0069] 第7行:原始父距离:=原始parent1位置-原始parent0位置
[0070] 第8行:目标父距离:=目标parent1位置-目标parent0位置
[0071] 第9行:目标笔画中心线:=(原始目标中心线-原始parent0位置)*(目标父距离)/(原始父距离)+目标parent0位置
[0072] /*舍入目标中心线*/
[0073] 第10行:if目标笔画深浅度是奇数then
[0074] 将目标笔画中心线舍入到半个网格位置
[0075] 第11行:else/*是偶数*/
[0076] 将目标笔画中心线舍入到全网格位置
[0077] 第12行:笔画位置调整量:=目标笔画中心线-原始笔画中心线
[0078] /*调整child0和child1的位置*/
[0079] 第13行:将child0的位置移动(笔画位置调整量-笔画深浅度调整量)[0080] 第14行:将child1的位置移动(笔画位置调整量+笔画深浅度调整量)[0081] 在第一个伪代码例子中,输入值在第一行取得。在第1行,parent0可以指控制点612,child0可以指控制点632,child1可以指控制点631,parent1可以指控制点611。仍旧参考第一行,控制可以指代表标准化距离的控制值表(“CVT”)的一个元素,或诸如CVT程序403等CVT程序。基于接收的控制值,第2行或第3行被执行,以为一个特征(例如,笔画641)计算目标笔画的深浅度。
[0082] 第2行中,原始笔画深浅度指已被按比例缩放到目标字号和分辨率,但尚未由提示指令修改的笔画的深浅度。提示处理器可为每个控制点维持两组坐标,一组是原始坐标,另一组是所提示的(或所指令的)坐标。提示指令可以在适当时引用原始或提示的坐标。在第一个伪代码例子中,维持原始和所提示的坐标便于标识原始父距离(已被设计、已按比例缩放、但未提示的父控制点之间的距离)以及目标父距离(已被设计、已按比例缩放、并已提示的父控制点之间的距离)。因此,应用提示指令所导致的距离的变化幅度可被计算出来。在某些实施例中,此幅度的百分之一被用来进一步计算中心线的位置。
[0083] 现在同时参考第2和第3行,目标笔画的深浅度进而由作为输入参数(在第一行中)提供的控制值,或一个特殊参数-1所确定,-1指示本质上将原始笔画深浅度用作目标笔画深浅度。目标笔画深浅度可进一步服从最小距离标准。如果这个标准适用,则目标笔画深浅度是之前确定的目标笔画深浅度和1个象素(或不同的最小象素个数)中的较大者。
[0084] 执行第4行可将目标笔画深浅度舍入到最近的全象素。执行第5行可计算笔画边缘需要移动的距离,以于目标笔画深浅度相一致。在某些实施例中,边缘是沿着垂直于对应笔画的方向移动的。例如,笔画641的每个边缘可沿Y方向移动某一距离,以与笔画641的目标笔画深浅度相一致。执行第6行可计算出原始笔画中心线。在某些实施例中,该原始笔画中心线是从量化垂直于该笔画的距离的控制点坐标计算得出的。例如,控制点631和632的Y坐标可用来为笔画641计算原始笔画中心线。
[0085] 执行第7行可计算原始父距离。在某些实施例中,类似于原始笔画中心线的计算,原始父距离是从量化垂直于该笔画的距离的控制点坐标计算所得的。例如,可以用控制点612的Y坐标减去控制点611的Y坐标来计算该原始父距离。执行第8行可计算目标父距离。目标parent0和parent1的位置被设计、被比例缩放并被提示的parent0和parent1位置。
[0086] 执行第9行可计算目标笔画的中心线。基于该目标笔画深浅度,第10行或第11行被执行,以舍入目标笔画中心线。如果该笔画深浅度是奇数,则该目标笔画中心线被舍入到半个网格位置。另一方面,如果该笔画深浅度是偶数,则该目标笔画中心线被舍入到全网格位置。例如,基于笔画641的目标笔画深浅度,中心线642可被舍入到半个网格(当目标笔画深浅度是奇数)或全网格(当目标笔画深浅度是偶数)。
[0087] 执行第12行可计算该笔画位置的调整量。笔画位置的调整量可表示垂直于笔画方向将移动笔画的距离。例如,笔画641的笔画位置调整量可表明笔画641将被沿Y方向移动。执行第13行和第14行可调整子控制点,使之与计算所得的笔画位置一致。因此,特征的控制点被移动,使之与对应中心线一致,该中心线已被舍入以减小累积误差引起该特征被不恰当地呈现的可能性。
[0088] 图8示意了通过实现本发明的原理所得的轮廓800以及对应的象素图案803。轮廓800表示一个Arial大写斜体“H”。图7A示出了用于当轮廓包括大约处于网格位置中心的控制点时,动态地改变图形对象的示例方法700的流程图。方法700将参照轮廓800、象素图案803、以及在计算机体系结构400中所描述的计算系统、模块和数据来描述。
[0089] 方法700包括基于该轮廓上的控制点的位置计算该轮廓在一个控制点和另一个控制点之间轮廓近似地穿过一个网格位置的中心的动作(动作701)。例如,提示处理器422可处理从字体程序402加载的指令,以基于控制点811,812,831和832的位置,计算在控制点811和812之间轮廓800近似地穿过一个网格位置的中心(例,一个象素)。计算轮廓会近似地穿过一个网格位置中心可以包括确定该轮廓的一部分的游程和上升量可被约分为奇数。当游程和上升量被约分为奇数,该轮廓近似穿过网格位置中心的可能性就提高了。父控制点的位置也可被用于确定何时该父控制点与网格位置中心近似等距。
[0090] 例如,在图8中,边缘842在X方向走过2个网格位置,在Y方向上升了10个网格位置。这些游程和上升量值2和10,被约分为1和5(2是2和10的公因数)。因此,轮廓800近似穿过至少一个网格位置的中心的可能性就提高了(由于边缘842的斜率)。
[0091] 方法700包括沿第一方向按网格位置尺寸的第一小数来调整第一父控制点位置的动作(动作702)。例如,提示处理器422可处理从字体程序402加载的指令,以沿第一方向按网格位置(例如,象素)尺寸的第一小数(例,1/64)来调整第一控制点811的位置。调整第一父控制点可包括将该第一父控制点平行于网格空间的轴移动。例如,控制点811可向正X方向(或者说,在图8中为向右)移动1/64个象素
[0092] 方法700包括沿第一方向按网格位置尺寸的第二小数来调整第二父控制点位置的动作(动作703)。例如,提示处理器422可处理从字体程序402加载的指令,以沿着第一方向按网格位置尺寸的第二小数来调整控制点812的位置。第二小数可以与第一小数的大小相同,也可以不同。调整第二父控制点可包括将该第二个父控制点平行于网格空间的轴移动。例如,控制点812可向负X方向(或者说,在图8中为向左)移动1/64个象素。
[0093] 在某些实施例中,第一和第二父控制点与网格位置中心不是近似等距的。因此,例如在相反方向上以同样大小来调整第一和第二控制点的位置会改变斜率(例,边缘842的斜率),使得轮廓不再近似穿过网格位置的中心。
[0094] 在其它实施例中,第一和第二父控制点与网格位置中心是近似等距的。因此,以同样大小,但沿相反方向来移动第一和第二控制点会使对应的边缘(例如,边缘842)沿该网格位置中心旋转。然而,这一父控制点移动不能防止该轮廓近似穿过网格位置的中心。因此,当第一和第二父控制点与网格位置中心近似等距时,第一和第二控制点可沿同一方向移动(例,1/64个象素)。第一和第二父控制点可移动相同或不同的距离。例如,控制点811和812可沿正X方向移动相同大小。
[0095] 因而,即使当轮廓穿过网格位置中心时,恰当地激活或停用网格位置的可能性就提高了。这也提高了呈现更接近轮廓800的象素图案,例如象素图案803的可能性。
[0096] 图7B示出了用于当轮廓包含不精确控制点时动态改变图形对象轮廓的示例方法750的流程图。方法750将参照轮廓800、象素图案803、以及在计算机体系结构400中所描述的计算系统、模块和数据来描述。移动某些控制点来防止轮廓近似穿过网格位置中心(例,如方法700所述)可能会引起其它控制点移动到不精确的位置。即,控制点可能被移动到因为提示处理器402的内部精度限制而不能被精确表示的位置。然而,方法750的使用不仅限于那些实施例。在审阅本说明书后,对本领域的技术人员来说,很显然有各种各样可导致控制点位于不精确位置的不同事件。方法750可用来补偿无论是什么原因导致的不精确的控制点位置。
[0097] 方法750包括检测轮廓上的父控制点已被调整到网格空间的当前位置使之与一约束一致的动作(动作751)。例如,提示处理器422可处理从字体程序402加载的指令,来检测控制点811和812已被调整以与一约束一致。方法750包括侦测在父控制点之间的子控制点已被沿着该网格空间的第一个轴调整的动作(动作752)。例如,提示处理器422可处理从文本程序402加载的指令,来检测控制点831和/或控制点832的位置已被沿Y方向调整。
[0098] 作为提示的结果,(父)控制点811和812可能已被同时沿X和Y方向调整。类似地,作为应用方法500的结果,(子)控制点832已被沿着Y方向调整。因此,控制点832可能需要沿X方向调整,以将控制点832与父控制点811和812(重新)对齐。
[0099] 方法750包括基于第一和第二父控制点当前位置,沿网格空间第二个轴重新对齐子控制点位置的动作(动作753)。例如,提示处理器422可处理从字体程序402加载的指令,基于控制点811和812的当前位置,沿X轴方向重新对齐控制点831和/或控制点832。方法750包括基于该第一和第二父控制点的当前位置,沿网格空间第二条轴的方向,按网格位置尺寸小数来舍入子控制点位置的动作(动作754)。例如,基于控制点831到控制点
811的相对位置,沿X轴方向,按网格位置(例,象素)的小数来舍入控制点831和/或控制点832的位置。
[0100] 计算控制点的位置可包括一个除法操作(例如,包括直线斜率的计算),因而产生超过提示处理器内部精度限制的值。例如,作为计算控制点831的一部分,执行一个除法操作可产生超过提示处理器422内部精度的值。控制点831和811间直线的斜率可能是12.8/64。然而,当提示处理器422对数字的小数部分的内部精度是6比特时,可能无法精确地表示12.8/64。因而12.8/64被舍入(或者上舍入或者下舍入)到可以用6比特精度表示的一个值。
[0101] 为了减少,或可能消除舍入误差,提示指令(例如,在字体程序402中)的一部分可为提示处理器422的内部操作提供一种替换实现,用于计算控制点位置。例如,如果舍入操作本身被包含在除法之中,则舍入误差即可被控制。如果N和D是表示为单个除法(N/D)的数学中的整数分子和分母,并且如果该舍入操作为“下舍入”,那么如果在该字体提示处理器中内部除法操作下舍入,则N/D是正确的结果。例如,在截除小数部分的中,这将是正确的结果。另一方面,如果该近似操作为“上舍入”,那么正确的结果为(N+D-1)/D。最后,如果舍入操作是“舍入到最近”,那么正确的结果将是(2*N+D)/(2*D)。因而,有效的分子和分母可能是整数,且执行一轮除法来获得舍入的结果。是上舍入还是下舍入的决策可基于在方法700中作出的决策。
[0102] 接下来的第二个伪代码示例代表一个算法,该算法可被表达和/或执行,当轮廓包含近似处于网格位置中心并包括处于不精确位置的控制点时,便于动态地改变图形对象的轮廓。第二个伪代码例子可以用多种编程语言(例如, 来表达,且由相应编译器或程序解释器(例如,提示处理器422)来处理。在第二个伪代码例子里,符号“/*”和“*/”之间的文本表示描述该伪代码所实现的功能的注释。
[0103] 第21行:输入:parent0,parent1
[0104] 第22行:输入:parent0,child0,parent1
[0105] 第23行:输入:parent0,child0,child1,parent1
[0106] 第24行:输入:parent0,child0,child1,...,childn-1,parent1[0107] /*确定斜体的游程和上升量,在该过程的此阶段应为整数个象素*/[0108] 第25行:斜体游程:=parent1x位置-parent0x位置
[0109] 第26行:斜体上升量:=parent1y位置-parent0y位置
[0110] /*按2的最大公共幂对斜体游程/斜体上升量的比率进行约分*/
[0111] 第27行:已约分斜体游程:=斜体游程
[0112] 第28行:已约分斜体上升量:=斜体上升量
[0113] 第29行:while已约分斜体游程和已约分斜体上升量均为偶数
[0114] 第30行:已约分斜体游程:=已约分斜体游程/2
[0115] 第31行:已约分斜体上升量:=已约分斜体上升量/2
[0116] 第32行:endwhile
[0117] 第33行:if已约分斜体游程和已约分斜体上升量均为奇数
[0118] /*此时从parent0到parent1的边缘恰好穿过至少一个象素中心,因此父位置将被改变以避免此问题。例如,parent1可被向右移基于提示处理器内部精度的最小可能的小数(例如,一个象素的1/64)。类似地,parent0可被向左移动相同的量。当该(未约分)斜体游程是奇数,且该(未约分)斜体上升量是奇数,相应的边缘会穿过父控制点中间象素的中心。因而,将两个父控制点向相反方向移动会使该边缘绕所述恰好在两个父控制点中间的象素中心旋转,但仍将导致对应边缘穿过该象素的中心。因而,任意地选择沿同样方向移动两个父控制点。*/
[0119] 第34行:if斜体游程是奇数,则将parent1向左移动1/64个象素
[0120] 第34行:else将parent1向右移动1/64个象素
[0121] 第35行:将parent0向左移动1/64个象素
[0122] 第36行:endif
[0123] /*调整0个或多个子控制点*/
[0124] 第37行:for每个子控制点
[0125] /*计算目标x位置*/
[0126] 第38行:子控制点相对y位置:=子控制点y位置-parent0y位置
[0127] 第39行:目标x位置:=(子控制点相对y位置)*(斜体游程)/(斜体上升量)[0128] 第40行:if(子控制点相对y位置)小于或等于(斜体上升量)/2,将目标x位置下舍入到最近的1/64个象素
[0129] 第41行:else将目标x位置上舍入到最近的1/64个象素
[0130] /*对目标x位置和下舍入或上舍入到最近的1/64个象素的计算可以被结合成单个计算*/
[0131] 第42行:调整量:=目标x位置-实际子控制点x位置
[0132] 第42行:按调整量移动子控制点
[0133] 第44行:endfor
[0134] 在第二个伪代码示例中,第21-24行代表可接收的不同种类的输入。一般而言,第二个伪代码示例接收两个父控制点,以及0-N个子控制点。执行第25和26行将分别计算斜体游程和斜体上升量。例如,提示处理器422可基于控制点811和812的位置来计算边缘842的斜体游程和斜体上升量。
[0135] 执行第27-32行可将计算所得的斜体游程和斜体上升量用2的最大公共幂来约分。例如,可执行27-32行,将计算所得的斜体游程24和计算所得的斜体上升量52,约分成已约分斜体游程6和已约分斜体上升量13(即,2次迭代)。尽管6可被2整除,13不可以,因为在第29行的条件是FALSE,循环将中止。
[0136] 当该已约分斜体游程和该已约分斜体上升量均为奇数,则执行第33-36行。例如,如果第27-32计算出已约分斜体游程3,和已约分斜体上升量13(例如,从斜体游程12和斜体上升量52计算),可以执行第33-36行。执行第33-36行便于适当地调整父控制点,以使对应边缘不会穿过网格位置(例如,象素)的中心。例如,控制点811和812可被移动,从而使边缘842不会穿过网格位置的中心。
[0137] 执行第37-44行可调整任何子控制点,使之与对应父控制点的调整一致。对作为输入接收的每一子控制点,可执行第38-43行。例如,可执行第37-44行,来调整控制点831和832(子控制点),使之与控制点811和812(父控制点)的调整一致。执行第38行将计算在垂直于调整父控制点的方向的方向上子控制点相对于父控制点的位置。例如,如果控制点811之前被调整过,则控制点831相对于控制点811的位置可被(重新)对齐。
[0138] 执行第39行可计算调整父控制点的方向上该子控制点的目标位置。例如,执行第39行可计算X方向上控制点831的目标位置。执行第40或41行可在移动父控制点的方向上舍入目标位置。基于该子控制点相对位置的大小与该斜体上升量一半的比较,该子控制点的目标位置会被上舍入或下舍入。例如,基于Y方向上控制点831相对位置的大小以及边缘842的斜体上升量,可执行第40或41行,在X方向上舍入控制点831的目标位置。当该相对位置的大小小于或等于该斜体上升量的一半,则该目标位置被下舍入。另一方面,当该相对位置的大小大于该斜体上升量的一半,该目标位置被上舍入。执行第42和43行可适当地调整该子控制点的位置。
[0139] 因而,图形对象的轮廓可被调整,使该轮廓不会穿过网格位置的中心,且子控制点与为避开网格位置中心而对父控制点做的调整一致。因而,该图形对象的特征被保留,且呈现误差的潜在源头被消除了。
[0140] 图10示意了通过实现本发明的原理所得的轮廓1000、简化轮廓1002、以及对应的象素图案1003。轮廓1000代表一个Palatino大写斜体“H”的轮廓。图9示出了用于当轮廓含有过剩的控制点时,动态改变图形对象轮廓的示例方法900的流程图。方法900将参照轮廓1000、简化轮廓1002、象素图案1003、以及在计算机体系结构400中的计算系统、模块和数据来说明。
[0141] 方法900包括标识该轮廓的第一和第二特征间的一个汇合点的动作(动作901)。例如,提示处理器422可处理从字体程序402加载的指令,来标识汇合点1013是笔画1016和笔画1017之间的汇合点。可通过外插轮廓1000的边缘来确定汇合点。例如,笔画1016的边缘可被外插,使沿着笔画1016的每个边缘的虚斜体线与贯穿笔画1017顶部的虚横线(衬线)相交。汇合点1013描绘了这两条虚线的交点。对其它特征的汇合点,可以执行其它类似的外插。
[0142] 方法900包括访问包含在该轮廓第一特征里的过剩控制点的动作(动作902)。例如,提示处理器422可处理从字体程序402加载的指令,来访问控制点1011或控制点1012。基于所选的磅值和分辨率,控制点1011和1012如果被从轮廓1000移除,将不会显著地改变该Palatino大写“H”所被呈现的样子。例如,在较小磅值和较低分辨率下,准确地呈现轮廓1000上微小变化所得的特征是困难的(如果不是不可能)。
[0143] 方法900包括朝第一方向移动这些过剩控制点,直至在第一方向上,这些剩余控制点的位置基本上和第一方向上的汇合点的位置一样的动作(动作903)。例如,提示处理器422可处理从字体程序402加载的指令,来移动控制点1011,使得控制点1011在X方向上与汇合点1013对齐。类似地,提示处理器422可处理从字体程序402加载得指令,来移动控制点1012,使之在Y方向上与汇合点1013对齐。
[0144] 方法900包括朝第二方向移动这些过剩控制点,直至在第二方向上,这些过剩控制点的位置基本上和第二方向上的汇合点的位置一样的动作(行为904)。例如,提示处理器422可处理从字体程序402加载的指令,来沿Y方向移动控制点1011,直至控制点1011的位置和汇合点1013的位置基本一致。类似地,处理器422可处理从字体程序402加载的指令,来沿X方向移动控制点1012,直至控制点1012的位置和汇合点1013位置基本一致。
[0145] 轮廓1000上其它特征之间对应的汇合点可同样地被确定。轮廓1000上其它过剩的控制点可被访问。这些其它过剩的控制点可被移向对应的汇合点。与单个斜向移动相反,单独地沿X方向和Y方向移动过剩的控制点可减少舍入误差,而斜向移动可能引入舍入误差。将轮廓1000上的过剩控制点移到对应汇合点可产生简化轮廓1002。从而,所描绘的字符(“H”)完整的形状被保留下来,且呈现误差潜在的根源被消除。这增加了呈现更近似轮廓1000的象素图案,例如象素图案1003的可能性。
[0146] 接下来第三个伪代码示例代表一个算法,该算法可被表达和/或执行,以当轮廓包含过剩控制点时,便于动态地改变图形对象的轮廓。第三个伪代码例子可以用多种编程语言(例,TrueType )来表达,且由对应编译器或程序解释器(例如,提示处理器422)处理。在第三个伪代码例子里,符号“/*”和“*/”之间的文本表示描述该伪代码所实现的功能的注释。
[0147] 第51行:输入:target,first,last
[0148] 第52行:for从first到last的每一控制点
[0149] 第53行:沿x移动点直到它的x位置与target的x位置相同
[0150] 第54行:沿y移动点直到它的y位置与target的y位置相同
[0151] 第55行:endfor
[0152] 在第三个伪代码示例中,输入值在第51行接收。执行第51行可包括接收一过剩控制点的列表,以及向其移动这些过剩控制点的汇合点。可为过剩控制点列表中每个控制点执行第53和54行。每个控制点要经受两次单独的移动,第一次沿X方向,第二次移动沿Y方向。这减少了与斜向运动相关联的舍入误差的可能性。
[0153] 实现上述每一个实施例的部分提示指令可被包括在字体程序(例如,字体程序402)中。这是有利的,因为这些指令可被执行以系统地优化象素图案。此外,提示指令的数量是相对恒定的(即,它不依赖于字号的数量,在这些字号处的象素化是非最优的),且优化不需要对所有字号进行视觉检查。因此,本发明的实施例可以被包含在自动提示机制中,这些机制潜在但可观地减少了提示字体的资源开销。
[0154] 图11及接下来的讨论是为了提供关于可其中实现本发明的合适计算环境的一个简明、通用的描述。尽管并非所需,但本发明将在诸如程序模块等由计算机系统执行的计算机可执行指令的通用上下文中被描述。通常,程序模块包括例程、程序、对象、组件、数据结构等等,这些模块执行特定任务或实现特定抽象数据类型。计算机可执行指令、相关数据结构以及程序模块代表了用于执行本发明所揭示的方法的动作的程序代码手段的例子。
[0155] 参考图11,用于实现本发明的一个示例系统包括计算机系统1120形式的通用计算设备,包括处理单元1121,系统存储器1122、以及将包括系统存储器1122在内的各种系统组件耦合到处理单元1121的系统总线1123。处理单元1121可执行为实现计算机系统1120特征,包括本发明的特征而设计的计算机可执行指令。系统总线1123可以是各种总线结构中的任意一种,包括存储器总线或存储控制器、外围总线、以及使用各种总线体系结构的任一种的局部总线。系统存储器包括只读存储器(“ROM”)1124和随机存取存储器(“RAM”)1125。基本输入/输出系统(“BIOS”),包括了例如在启动期间在计算机系统1120内部各元件之间帮助传递信息的基本例程,可被保存在ROM 1124中。字体程序402的函数和指令可被加载到RAM 1125中,从而这些函数和指令可从字体文件401的其它部分被调用和执行。
[0156] 计算机系统1120也可包括读或写磁硬盘1139的磁硬盘驱动器1127、读或写可移动磁盘1129的磁盘驱动器1128、以及读或写诸如CD-ROM或其它光介质等可移动光盘1131的光盘驱动器1130。磁硬盘驱动器1127、磁盘驱动器1128以及光盘驱动器1130分别由硬盘驱动器接口1132、磁盘驱动器接口1133以及光盘驱动器接口1134连接到系统总线1123。这些驱动器和相关的计算机可读介质为计算机系统1120提供了计算机可执行指令、数据结构、程序模块及其它数据的非易失性存储。尽管本发明描述的示例环境使用磁硬盘
1139、可移动磁盘1129和可移动光盘1131,也可使用用于储存数据的其它类型的计算机可读介质,包括磁带盒、闪存卡、数字多功能盘、贝努利盒式磁带、RAM、ROM等等。
[0157] 包含一个或多个程序模块的程序代码手段,包括操作系统1135、一个或多个应用程序1136、其它程序模块1137以及程序数据1138,被存储于硬盘1139、磁盘1129、光盘1131、ROM 1124或RAM 1125中。用户可以通过键盘1140、定位设备1142或其它输入设备(未画出),例如话筒、操纵杆、游戏垫、扫描仪等,来输入命令和信息到计算机系统1120。这些及其它输入设备可通过耦合到系统总线1123的输入/输出接口1146连接到处理单元
1121。输入/输出接口1146逻辑上代表各种各样可能的接口中任意一个,例如串行端口接口、PS/2接口、并行端口接口、通用串行总线(“USB”)接口、或电气与电子工程师协会(“IEEE”)1394接口(即,火线接口),或者甚至可逻辑上代表不同接口的组合。
[0158] 显示器1147或其它显示设备通过视频接口1148也被连接到系统总线1123。显示器1147可显示由计算机系统1120产生的单色和/或彩色图形对象,包括文本。其它外围设备(未示出),例如扬声器、打印机及扫描仪,也可被连接至计算机系统1120。连接到计算机系统1147的打印机可打印计算机系统1120生成的单色和/或彩色图形对象,包括文本。
[0159] 计算机系统1120被连接到网络,例如办公室范围或企业范围的计算机网络、家庭网络、内联网和/或因特网。计算机系统1120可通过此类网络与诸如远程计算机系统、远程应用程序和/或远程数据库等外部源交换数据。
[0160] 计算机系统1120包括网络接口1153,通过此接口计算机系统1120可从外部源接收数据,和/或发送数据到外部源。如图11所示,网络接口1153便于通过链路1151与远程计算机系统1183交换数据。网络接口1153可以逻辑地表示一个或多个软件和/或硬件模块,例如网络接口卡和对应的网络驱动程序接口规范(“NDIS”)栈。链路1151表示网络的一部分(例,以太网段),远程计算机系统1183表示该网络的一个节点。
[0161] 类似地,计算机系统1120包括输入/输出接口1146,通过该接口计算机系统1120从外部源接收数据和/或向外部源发送数据。输入/输出接口1146被耦合到调制解调器1154(例如,标准调制解调器、电缆调制解调器或数字用户线(“DSL”)调制解调器),通过调制解调器计算机系统1120从外部源接收数据和/或向外部源发送数据。如图11所示,输入/输出接口1146和调制解调器1154便于通过链路1152与远程计算机系统1193交换数据。链路1152表示网络的一部分,远程计算机系统1193表示该网络的一个节点。
[0162] 尽管图11表示本发明的一个合适的操作环境,然而本发明的原理可在能够(若有必要,可进行适当更改)实现本发明原理的任何系统中使用。图11中示意的环境只是说明性的,决非代表众多的可在其中实现本发明原理的环境的哪怕一小部分。
[0163] 依照本发明,诸如按比例缩放模块419、提示处理器422和扫描转换模块424等模块,以及诸如字体文件401、已缩放字形421、所提示的字形426和象素化表示427等相关联的程序数据,可被存储在与计算机系统1120相关联的任意计算机可读介质中,并可从这些介质被访问。例如,部分此类模块和部分相关联的程序数据可被包括在操作系统1135、应用程序1136、程序模块1137和/或程序数据1138中,以存储于系统存储器1122中。
[0164] 当大容量存储设备,例如磁硬盘1139,被耦合至计算机系统1120,这些模块和相关联的程序数据也可被存储在该大容量存储设备中。在网络环境中,相对于计算机系统1120所描绘的程序模块或其部分,可被存储在远程存储设备中,例如与远程计算机系统
1183和/或远程计算机系统1193相关联的系统存储器和/或大容量存储设备。可在分布式环境下执行这些模块。
[0165] 只要不偏离它的精神或本质特征,本发明可以用其它具体形式实现。这里描述的实施例在任何方面均仅被视为示例性的,而非限制性的。因而,本发明范畴由所附权利要求书而非之前的描述所指示。在权利要求书的等效技术方案的意义和范围内的所有改变将被包含在它们的范畴中。