CN1287274C - 根据填充路径生成直线性混合的方法和装置 - Google Patents
根据填充路径生成直线性混合的方法和装置 Download PDFInfo
- Publication number
- CN1287274C CN1287274C CNB031491286A CN03149128A CN1287274C CN 1287274 C CN1287274 C CN 1287274C CN B031491286 A CNB031491286 A CN B031491286A CN 03149128 A CN03149128 A CN 03149128A CN 1287274 C CN1287274 C CN 1287274C
- Authority
- CN
- China
- Prior art keywords
- fill
- path
- fill path
- subprocess
- tabulation
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 239000000203 mixture Substances 0.000 title abstract description 21
- 238000000034 method Methods 0.000 claims abstract description 166
- 230000008569 process Effects 0.000 claims description 39
- 238000005520 cutting process Methods 0.000 claims description 25
- 230000004075 alteration Effects 0.000 claims description 6
- 230000008859 change Effects 0.000 description 223
- 238000003860 storage Methods 0.000 description 132
- 238000012360 testing method Methods 0.000 description 30
- 238000007689 inspection Methods 0.000 description 23
- 238000010586 diagram Methods 0.000 description 21
- 230000000694 effects Effects 0.000 description 19
- 238000010187 selection method Methods 0.000 description 14
- 230000006870 function Effects 0.000 description 12
- 239000003086 colorant Substances 0.000 description 9
- 238000012986 modification Methods 0.000 description 6
- 230000004048 modification Effects 0.000 description 6
- 238000012545 processing Methods 0.000 description 5
- 238000007796 conventional method Methods 0.000 description 4
- 230000014759 maintenance of location Effects 0.000 description 4
- 238000003491 array Methods 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 3
- 238000004590 computer program Methods 0.000 description 3
- 230000000631 nonopiate Effects 0.000 description 3
- 238000007639 printing Methods 0.000 description 3
- 238000009825 accumulation Methods 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 2
- 230000015572 biosynthetic process Effects 0.000 description 2
- 239000000945 filler Substances 0.000 description 2
- 239000004065 semiconductor Substances 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 230000004323 axial length Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000002349 favourable effect Effects 0.000 description 1
- 238000012432 intermediate storage Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000009897 systematic effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T11/00—2D [Two Dimensional] image generation
- G06T11/40—Filling a planar surface by adding surface attributes, e.g. colour or texture
Abstract
本发明提供一种生成一个或多个直线性混合的方法(1005)。最初,该方法具有已经接收的定义当前直线性混合的一条或多条填充路径的列表,以及一条新接收的填充路径,其中每条填充路径包括一个单色平行四边形(如700)。如果新填充路径与该列表中的最后填充路径之间的各颜色通道的色差不超过预定阈值乘以该列表中的最后填充路径和倒数第二条填充路径之间的色差,则该方法将新填充路径添加(1090)到该列表中,作为该列表中的最后填充路径。将预定阈值预先设置为以下值,从而当新填充路径在视觉上不构成当前的直线性混合的一部分时,不会将新填充路径添加到该列表中。该方法对接收的每条新填充路径重复上述步骤,直至不再满足上述条件。然后该方法根据该列表中的第一填充路径到该列表中的最后填充路径生成(1040)一个或多个直线性混合。
Description
技术领域
本发明涉及电子图像生成和控制,更确切地说,涉及生成一个或多个直线性混合(linear blend)。
背景技术
传统上,诸如字处理器之类的软件应用程序创建基于页面的文档,其中每个页面包括诸如文本、线条、填充区域和图像数据之类的图形对象。当在显示设备或打印设备上绘制文档数据时,上述软件应用程序通常发送按照该软件应用程序所处的本机操作系统之图形接口服务定义的命令。本机操作系统的图形接口服务统称为图形设备接口(GDI)层。GDI层通常为能够向全部应用程序提供充足图形功能的应用编程接口(API)。通常,图形描绘系统描绘从GDI层接收的图形对象,生成象素,然后发送到输出设备。描绘处理意旨利用图形描绘系统将从GDI层接收的图形对象转换为象素,然后发送到输出设备进行存储、显示或打印。
现在转到图1,该图表示现有软件应用程序110、图形设备接口层120、图形描绘系统130以及输出设备140之间的传统关系。应用程序110按照描述每个页面之图形对象的图形接口服务定义的一系列命令的方式,传送文档的每个页面。GDI层120介于应用程序110和输出设备140之间,从而GDI层120使图形描绘系统130能够支持更小的功能性集合,如绘制图像数据的矩形块,利用接近原色(flat color)填充简单区域。同时,GDI层120能够按照GDI层120确定的、描绘系统130能够进行最有效处理的格式,并以输出设备140的分辨率,向图形描绘系统130提供图形对象。然后,图形描绘系统130描绘从GDI层120接收的图形对象,生成象素,然后发送到输出设备140。
在某些已知的图形描绘系统中,描绘处理分两步。在此类描绘系统中,首先将图形对象转换为中间语言,然后开始描绘处理。在此类系统中,第一步处理将从GDI层接收的各图形对象转换为某些基于边缘的中间对象图形格式,以便按升序y、然后按升序x对所有边缘排序,这些分别对应于光栅化显示时的扫描线以及扫描线上的象素位置。该步骤的输出通常为边缘及其关联的填充优先级(z轴次序)的显示列表,以及其他信息,如边缘是裁剪边还是填充边。该处理有时称为作业。作业包含用来描绘页面的第二步处理需要的全部信息。第二步处理包括描绘模块,该模块对作业进行语法分析,并对该页面下的各扫描线为输出设备生成象素。
在某些GDI层中,GDI层将添满均匀混合颜色的图形对象表示为一系列相邻的单色平行四边形,每个平行四边形与前一个平行四边形的颜色有一点小偏差,并且在图形对象的区域上进行裁剪。平行四边形的顺序可以为从左到右,从上到下,或沿对角线遍历页面。
某些应用程序将此类填充称为渐变填充(即Microsoft Word中的gradient fill)或喷泉填充(即Corel Draw中的fountain fill)。为了清楚起见,本说明书中将此类填充称为渐变填充。图2A表示现有应用程序生成的利用对角线渐变填充所填充的图形对象210的示例。利用渐变填充填充对象的方法依赖于应用程序。然而,在其最简单形式中,此类方法通常包括指定正在填充的图形对象的边界框的每端的起始颜色和结束颜色。图2A、2B、2C表示应用程序向GDI层进而向图形描绘系统传送对角线渐变填充的方法。
某些图形描绘系统通常支持称为直线性斜面或直线性混合的简单渐变填充效果。利用页面上带有关联起始颜色的起始参考点表示上述效果,其中在与渐变混合平行的直线上,每个象素每个颜色通道呈现固定的渐变变化。
然而,应用程序通常并不限于输出完全由直线性渐变填充效果组成的混合。事实上,某些应用程序生成的渐变填充效果的颜色变化可以为抛物线,甚至为正弦曲线。图3表示现有应用程序生成的具有正弦曲线渐变填充效果的对象300的示例。
通常,GDI层使渐变填充变为带有附随裁剪对象的一组单色平行四边形(此处称为填充路径)。例如,图2B表示典型的现有GDI层传送到图形描绘系统的填充路径和裁剪对象,其中填充路径和裁剪对象是根据图2A所示的示例渐变填充生成的。GDI层使渐变填充变为一组单色填充路径250和一个裁剪对象220。为了清晰起见,图2B仅示出两条经过放大的填充路径250。填充路径到230的完整集合覆盖矩形区域260,其中各填充路径250与其相邻的填充路径平行。填充路径250的侧边的长度依赖于正在进行的描绘的分辨率。例如,当分辨率为600dpi时,各填充路径250通常不会高于100个象素,但是各填充路径的宽度可以差几个象素。同时,各填充路径250具有与前一条填充路径250略微不同的内部颜色。从而在描绘对象时,生成与渐变填充关联的均匀混合颜色。现在转到图2C,该图表示利用现有图形描绘系统描绘图2B所示示例时的结果。在后一种情况中,描绘系统利用裁剪对象220裁剪由填充路径250组成的边界框260,从而生成对象210。在图2C中,描绘处理后的结果与图2A相同。
可以利用许多常规方法来描绘渐变填充效果的图像。
一种常规方法仅仅描绘各填充路径。许多图形描绘系统使用画家算法风格的描绘,其中在各对象到达时,将各对象绘制到帧缓冲器上。两步对象图形描绘系统,首先将所有输入对象转换为某些中间格式的页面,然后描绘各扫描线,其缺点是描绘各填充路径。对于图2A所示的渐变填充,当分辨率为600dpi时,GDI层生成128条填充路径。可以理解,在从上到下或从下到上,然后在任意扫描线上进行混合的情况中,只有一条填充路径起作用。但是在从左到右或从右到左进行混合的最坏的情况中,一条扫描线上的所有128条填充路径都起作用,相当于每条扫描线有256条边缘。因此,对于基于对象的描绘系统而言,此类描绘方法的效率非常低。同时,各接近原色填充(flat fill)必须采用中间对象图形格式存储,并且每条扫描线的每条填充路径都要访问各接近原色填充。当填充路径的数目为数千条时,该方法包括大量存储器访问,并且需要消耗大量填充资源。当以较高分辨率印刷A3以上的幅面时,经常出现上述情况。
就审美水平而言,仅仅描绘各填充路径的另一个缺点是,尽管期望效果是均匀混合,但出现称为马赫条带(Mach Banding)的人为现象。由于眼睛对边缘的敏感度比对有关颜色的平滑变化的敏感度高,所以当按上述方式描绘渐变填充效果时,眼睛通常能够看到矩形分割。在部分色域中,分割更加明显。同时,如果放大整个图像,则会放大每条填充路径,并且马赫条带更明显。
在应用层上,用于处理渐变填充效果的另一个常规方法是,仅仅将填充效果描绘到位图上,然后发送到GDI层。该方法对小填充区域非常有效,其缺点是绘制速度较慢,并且不方便描绘,原因在于图形描绘系统必须处理图像的每个象素。当放大(复制象素)或缩小(损失象素)对象时,该方法不能按比例缩放。
另一个常规方法是测试各输入填充路径的直线性,并且当下一条填充路径的直线性不在误差范围内时,则创建等效直线性混合直至该填充路径。然后从下一条填充路径开始,再次跟踪直线性。该方法能够显著减少需要描绘的图形对象的数目。在最好情况中,可以利用单个直线性混合描绘整个图形对象。对于图2A所示的对角线渐变填充,与如果采用多填充路径进行绘制相比,每扫描线边缘数减少了1/128。
然而,该方法有其缺点。如上所述,应用程序可以提供比简单直线性混合更高级的渐变填充效果。此类效果包括遍布所填充对象的不同颜色变化(如,图3所示的正弦曲线),或者为图4A或4B所示的非线性曲线。同样,连续填充路径的侧边的长度不一定为常数。不论出现那种情况,即使各情况下希望的总体效果是跨越图形对象有均匀的颜色混合,生成的描绘对象的填充路径的集合也不必包括各填充路径的固定颜色变化。
在该方法中,应用误差因子确定一系列填充路径中的下一条填充路径的直线性。如果下一条填充路径与前一条填充路径的差别为某个常数加减误差,则将其合并到正在跟踪的直线性混合中。如果误差因子太小,则导致许多直线性混合,因此不能达到该方法的目的。如果误差因子太大,则导致色移处理,从而输出不能正确描绘输入。例如,转到图4A,该图表示从左上角的黑色到右下角的白色的非线性混合,其中黑色和白色之间的中点颜色位于左上角和右下角之间的距离的25%。同时,图4B表示类似的非线性混合,但中点颜色位于左上角和右下角之间的距离的75%。如果使用足够大的误差因子跟踪图4A或4B所示的非线性填充路径,则结果为图4C所示的从左上角的黑色到右下角的白色的纯直线性混合。该结果显然不是应用程序的用户希望的结果。
同时,当将填充路径组合为许多直线性混合时,相邻直线性混合之间的马赫条带将更加明显。由于直线性混合是按照最大误差分割的,所以该条带非常明显,从而比描绘各填充路径更明显地描绘相邻的直线性混合。
发明内容
本发明的目的在于充分克服或至少改善现有装置的一个或多个缺点。
根据本公开的第一方面,提供一种用于生成一个或多个直线性混合的方法,其中该方法最初包括业已接收的定义当前直线性混合的一条或多条填充路径的列表,以及新接收的填充路径,每条填充路径包括一个单色平行四边形,该方法包括以下步骤:(a)如果满足多个条件,则将新填充路径添加到列表中,从而成为该列表中的最后填充路径,否则转到步骤(c),其中多个条件中的一个条件基于新填充路径和最后填充路径的颜色以及某个阈值,并将该阈值预先设置为以下值,从而当新填充路径在视觉上并不构成当前的直线性混合的一部分时,不会将新填充路径添加到该列表中;(b)对接收的每条新填充路径,重复步骤(a);以及(c)根据该列表中的第一填充路径到该列表中的最后填充路径,生成一个或多个直线性混合。
根据本公开的第二方面,提供一种根据定义当前直线性混合的一条或多条填充路径的列表以及至少一条新填充路径,生成一个或多个直线性混合的方法,其中每条填充路径包括一个单色平行四边形,该方法包括以下步骤:
(a)如果满足条件集合中的每个条件,则将所述新填充路径添加到所述列表中,从而成为所述列表中的最后填充路径,否则转到步骤(c),所述集合包括至少一个条件,所述一个条件基于新填充路径和最后填充路径的颜色以及某个阈值,并将所述阈值预先设置为以下值,从而当新填充路径在视觉上并不构成当前的直线性混合的一部分时,不会将新填充路径添加到该列表中;
(b)对每条剩余的所述新填充路径,重复所述步骤(a);以及
(c)根据所述列表中的第一填充路径到所述列表中的最后填充路径,生成一个或多个直线性混合。
条件集合最好包括从以下条件组成的条件组中选择的条件:
(第二)条件,新填充路径与该列表中的最后填充路径物理邻接;
(第三)条件,新填充路径的高度不会超过最近添加到该列表中的填充路径的高度的两倍,该高度是在按照该列表的填充路径的物理位置确定的方向上测量的;
(第四)条件,当前的直线性混合内的填充路径的数目大于1;
(第五)条件,直线性混合内的填充路径的累积高度与新填充路径的矩形高度的和小于预定的最大值;
(第六)条件,当前接收的填充路径的光栅操作不使用目的地,并且与当前的直线性混合的光栅操作相同;以及
(第七)条件,当前接收的填充路径具有与当前的直线性混合相同的裁剪。
同时公开本发明的其他方面,包括执行以上方法的装置、计算机程序和计算机介质。
附图说明
以下参照附图描述本发明的一个或多个实施方式,其中附图为:
图1表示现有应用程序、图形设备接口层、图形描绘系统和输出设备之间的关系;
图2A表示典型的现有应用程序生成的利用对角线渐变填充所填充的图形对象210的示例;
图2B表示在图2A所示的渐变填充例子中由典型的现有GDI层传送到典型的现有图形描绘系统的填充路径和裁剪对象;
图2C表示利用典型的现有图形描绘系统描绘图2B所示示例时的结果;
图3表示现有应用程序生成的正弦曲线渐变填充效果的示例;
图4A表示从黑色到白色的对角线非线性渐变填充效果,其中黑色和白色之间的中点为现有应用程序生成的混合的长度的25%;
图4B表示从黑色到白色的对角线非线性渐变填充效果,其中黑色和白色之间的中点为现有应用程序生成的混合的长度的75%;
图4C表示从黑色到白色的对角线非线性渐变填充效果,其中黑色和白色之间的中点为现有图形描绘系统根据图4A或4B所示的渐变填充效果生成的混合的长度的50%;
图5A至图5D和图6A至图6D表示对角线渐变填充遍历方向的不同定义;
图7A和图7B表示依赖于渐变填充之方向的总高度和矩形高度的定义;
图8A和图8B表示确定渐变填充的第二点(Q,P)时使用的直线;
图9A、图9B和图9C表示填充路径的示范集合的颜色通道的值,用于说明生成一个或多个直线性混合的方法;
图10表示生成一个或多个直线性混合的第一方法的流程图;
图11表示图10所示方法调用的add_rect子过程的流程图;
图12表示图10所示方法调用的check_fill子过程的流程图;
图13表示图12的check_fill子过程调用的check_output_fill子过程的流程图;
图14A、图14B和图14C分别表示图11的add_rect子过程、图12的check_fill子过程和图13的check_output_fill子过程调用的get_alignment子过程的流程图;
图15表示图10所示方法调用的flush_ramp子过程的流程图;
图16表示图15的flush_ramp子过程最初调用的find_and_put_ramps子过程的流程图;
图17为可以实施所述方法的通用计算机的示意框图;
图18表示用于生成一个或多个直线性混合的备择方法的流程图;
图19表示应用于图10所示的第一方法或图18所示的备择方法的modified_add_rect子过程的流程图;
图20表示在图18的备择方法中有用的modified_check_fill子过程的流程图;
图21表示在图18的备择方法中有用的alternate_get_alignment子过程的流程图;
图22表示与图8A和图8B类似但适用于图18的备择方法的示意图;以及
图23A至图23D表示用于定义类似于图5A至图5D和图6A至图6D的但适用于图18备择方法的混合方向的各种方式。
具体实施方式
在本说明书中,当引用任何一张或多张附图中的具有相同参考标号的步骤和/或特征时,除非有相反的说明,否则这些步骤和/或特征具有相同的功能或操作。
最好将用于生成直线性混合的方法实现为在通用计算机的处理器上运行的软件模块。图17表示用于执行此类软件模块的典型通用计算机。软件模块最好为图形描绘系统的第一层的一部分,以连接图形设备接口(GDI)层,并接收页面的图形对象,从而将各图形对象转换为基于边缘的中间格式。在图形描绘系统的第二层中,描绘作业,然后将由此生成的象素输出到诸如打印机或图形卡之类的下行设备上。最好将图形描绘系统的两层实现为图形软件应用程序中的模块。作为选择,将第一层实现为连接第二层的软件应用程序,将第二层实现为与总线相连的硬件设备,以便与在处理器上运行的第一层进行通信。
GDI层最好为应用编程接口(API),并且以一系列填充路径的形式,向图形描绘系统提供渐变填充。
尽管以下方法描述非正交渐变填充效果的情况,特别是填充路径以垂直侧从左上到右下的顺序到达的情况,但是可以很容易地修改该方法,以处理填充路径以任何正交或非正交方向进行的情况。
在进行详细说明之前,首先简单地说明术语。
1.0 定义:
将填充路径定义为单色(或接近原色(flat-colored))的平行四边形。术语平行四边形还包括矩形或正方形。当从水平方向或垂直方向开始渐变填充时,填充路径的外型通常为矩形。当从页面的对角线方向开始渐变填充时,填充路径为平行四边形。
非正交渐变填充的遍历方向为以下8个方向中的任何一个。将这些方向分割为使用水平填充路径的渐变填充和使用垂直填充路径的渐变填充,定义如下:
水平渐变填充:
水平左下方向,HDOWNLEFT
水平左上方向,HUPLEFT
水平右下方向,HDOWNRIGHT
水平右上方向,HUPRIGHT
水平左方向,LEFT
水平右方向,RIGHT
垂直渐变填充:
垂直左下方向,VDOWNLEFT
垂直左上方向,VUPLEFT
垂直右下方向,VDOWNRIGHT
垂直右上方向,VUPRIGHT
垂直下方向,DOWN
垂直上方向,UP
图5A至5D和图6A至6D表示对角线渐变填充可能遍历方向的上述定义。图5A至5D表示垂直渐变填充,而图6A至6D表示水平渐变填充。
图5A表示旗帜形状的裁剪对象600,其边界框620以及填充路径610。许多填充路径610沿垂直方向从边界框620的左上角到达其右下角,并定义为垂直右下方向。同时表示垂直填充路径630,并定义为向下。
图5B表示同一裁剪对象600,边界框620以及填充路径640。填充路径640沿垂直方向从边界框620的右上角到达其左下角,并定义为垂直左下方向。同时表示垂直填充路径630,并定义为向下。
图5C表示同一裁剪对象600以及边界框620。填充路径660沿垂直方向从边界框620的右下角到达其左上角,并定义为垂直左上方向。同时表示垂直填充路径650,并定义为向上。
图5D表示同一裁剪对象600以及边界框620。填充路径670沿垂直方向从边界框620的左下角到达其右上角,并定义为垂直右上方向。同时表示垂直填充路径650,并定义为向上。
图6A表示裁剪对象600,其边界框605以及填充路径625。填充路径625沿水平方向从边界框620的左上角到达其右下角,并定义为水平右下方向。同时表示水平填充路径615,并定义为向右。
另一方面,图6B的填充路径635沿水平方向从边界框的左下角到达其右上角,并定义为水平右上方向。同时表示水平填充路径615,并定义为向右。
图6C表示裁剪对象600,其边界框605以及填充路径655。填充路径655沿水平方向从边界框605的右下角到达其左上角,并定义为水平左上方向。同时表示水平填充路径645,并定义为向左。
另一方面,图6D的填充路径665沿水平方向从边界框的右上角到达其左下角,并定义为水平左下方向。同时表示水平填充路径645,并定义为向左。
然而,如果认为一条填充路径未与相邻的填充路径对准,则不指派方向(即空“NULL”)。没有方向意旨不会创建渐变填充,或者不接受新的填充路径作为当前填充的一部分。
本说明书涉及两类高度,即矩形高度和总高度。根据当前存储的渐变填充的定向,以不同方式定义高度。图7A和7B表示这些不同高度的定义以及它们之间的依赖于渐变填充方向的差异。图7A表示沿垂直方向行进的平行四边形形式的填充路径700以及裁剪对象(未示出)的边界框705。在垂直填充路径情况中(图7A),将填充路径的矩形高度定义为,构成填充路径的平行四边形的侧边沿y轴方向的长度。在垂直填充路径的情况中(图7A),将第n条填充路径的总高度定义为,第n条填充路径沿y轴方向的矩形高度的总和。在水平填充路径的情况中(图7B),适用类似定义,但是沿x轴方向测量高度。同时,可以理解,不同填充路径的矩形高度可以不同。
当根据各填充路径定义直线性渐变填充时,中间边缘格式接受与该混合之梯度平行的直线上的两个参考点的色值和位置,以定义渐变填充。图8A和图8B表示查找第二参考点(Q,P)时使用的公式,其中利用第二参考点定义渐变填充。第一参考点是已知的。
图22表示用于备择方法的两个参考点以及用于计算两个参考点的直线,两个参考点为点1和点2(Q,P)。第一点(点1)仅仅是填充方向中描述的第一点。根据直线B和直线C的交点,确定第二点(Q,P)。直线C为恰巧超过渐变填充中最后填充路径之远端的长度的直线。直线B为通过渐变填充之点1且与直线A垂直的直线。
可以利用四个方向中的任一方向描述渐变填充的遍历方向。在调准组成渐变填充内的填充路径的所有点之后,指定以上方向。四个方向定义如下:
DIR_01(或DIR_32)
DIR_10(或DIR_23)
DIR_12(或DIR_03)
DIR_21(或DIR_30)
图23A至23D分别表示前述的对角线渐变填充可能遍历的方向的定义。每个方向具有一个选择的名称,并且可以互换使用。如果认为填充路径未与相邻的填充路径对准,则不指派方向(即空“NULL”)。没有方向意旨不会创建渐变填充,或者将不接受新的填充路径作为当前渐变填充的一部分。
说明书涉及两种不同类型的高度,即矩形高度(或填充路径的高度)和总高度。将总高度定义为填充路径之当前存储列表内的各填充路径的矩形高度的总和。定义渐变填充之矩形高度的填充路径的侧边依赖于渐变填充的遍历方向。图23A至23D表示对于方向DIR_01,矩形高度定义为填充路径的点0和点1之间的线段长度。对于方向DIR_10,矩形高度定义为点1和点0之间的线段长度。对于方向DIR_12,矩形高度定义为点1和点2之间的线段长度。对于方向DIR_21,矩形高度定义为点2和点1之间的线段长度。同时,可以理解,不同填充路径的填充路径高度可以不同。图23A至23D还表示各填充路径的宽度。
将术语“存储的颜色梯度”定义为,当前存储的渐变填充内最后添加的填充路径和上一个最后添加的填充路径之间的颜色梯度。存储该颜色梯度的值,以检查所有的新填充路径,从而确保其颜色梯度在所存储的颜色梯度的合理限度内。
当前存储的渐变填充为填充路径的动态列表。对于添加到当前存储的渐变填充内的各填充路径,该方法定义以下3个数组:
1.颜色数组,保存填充路径的每个色值,其中color[n]=fill-path(n)的颜色;
2.高度数组,保存填充路径的累积高度值,其中heights[n]=fill-path(1)至fill-path(n)的矩形高度的和。该值也是fill-path(n)的总高度的当前值;以及
3.点数组,保存各填充路径的点的值,其中points[n]=定义fill-path(n)的边界的平行四边形的四个点(x、y坐标)。
短语“存储的渐变填充”涉及用来描述当前跟踪的渐变填充所需的变量。这些变量包括上述的颜色数组,点数组和高度数组,渐变填充内的填充数,渐变填充的方向,以及渐变填充内的前两种颜色之间的颜色梯度。
2.0 概述
该方法依次接收来自GDI层的所有填充路径,并根据是否满足某些标准将那些路径添加到当前存储的渐变填充中。最初,该方法检查新接收的填充路径与最后添加到当前存储的渐变填充中的填充路径之间的色差,是否大于某个足够大的误差因子。误差因子最好为当前存储的渐变填充的两个最后添加的填充路径的色差的两倍。具体而言,对于正在生成的图像的每个颜色通道(如RGB),该方法检查新接收的填充路径的颜色通道值Cn是否满足以下公式之一:
0<Cn-Cn-1≤2(Cn-1-Cn-2)如果Cn>Cn-1
-2(Cn-1-Cn-2)≤Cn-Cn-1≤0如果Cn≤Cn-1 公式(1)
其中Cn-1和Cn-2为当前存储的渐变填充的两个最后添加的填充路径的对应颜色通道值。
对于各颜色通道,如果检查返回真,则该方法将新接收的填充路径添加到当前存储的渐变填充中,并且对接收的下一条填充路径重复上述操作。相反,对于任一颜色通道,如果检查返回假,则该方法负责生成一个或多个、从当前存储的渐变填充的第一条填充路径的颜色和位置、到当前存储的渐变填充中最后添加的填充路径的颜色和位置的直线性混合。换句话说,该方法继续将填充路径添加到当前存储的渐变填充内,直至有一条填充路径不再满足上述标准。当下一条填充路径的某个颜色通道明显改变当前颜色通道的渐变方向时,出现上述情况。例如,当颜色梯度的方向改变符号时,会出现上述情况。
如上所述,如果检查返回假,则该方法根据已经添加到当前存储的渐变填充中的填充路径,生成一个或多个直线性混合。具体而言,该方法确定适合当前存储的渐变填充内的填充路径集合的直线性混合的最佳集合。该方法按下述方式实现上述处理。
首先,为说明起见,假设当前存储的渐变填充包含n条填充路径,记作fill-path[1]到fill-path[n],其中fill-path[1]为添加到当前存储的渐变填充内的第一条填充路径,fill-path[n]为添加到当前存储的渐变填充内的最后填充路径。
该方法通过首先测试fill-path[1]和fill-path[n]之间的颜色梯度是否与fill-path[1]和中点fill-path[n/2]之间的对应颜色梯度(在某可接受的误差内)不同,生成适合当前存储的渐变填充内的填充路径的直线性混合的集合。如果测试返回真,亦即,如果不相同,则该方法将填充路径集合分割为两个集合,一个集合为填充路径的前半部分(fill-path[1]...fill-path[n/2]),一个集合为填充路径的后半部分(fill-path[n/2]...fill-path[n]),然后对这些新的填充路径集合中的每一个重复进行测试。另一方面,如果测试返回假,亦即,对某集合的fill-paths[1...n],fill-path[1]和fill-path[n]之间的颜色梯度与fill-path[1]和fill-path[n/2]之间的对应颜色梯度(在某可接受的误差内)相同,则对于该集合的fill-paths[1...n],该方法向图形描绘系统输出直线性斜面调用,其中利用颜色数组定义直线性斜面的起始和结束颜色,利用点数组定义需要填充的区域。可以利用软件模块实现上述步骤,按下述方式递归定义软件模块:
Function find_and_put_ramps([1..n],H[1..n],P[1..n])
其中
Hn、Hn/2分别为填充路径1到n和填充路径1到n/2的累计矩形高度值,
Cn为第n条填充路径的颜色通道值,
E0为阈值常数,最好为0.1,并且
其中C1和H1分别为传送给该函数的集合[1...n]内的第一条填充路径的颜色通道值和矩形高度值。
2.Call find_and_put_ramps(C[1..n/2],H[1..n/2],P[1..n/2])
3.Call find_and_put_ramps(C[n/2..n],H[n/2..n],P[n/2..n])
4.Endif
5.从C1到Cn放置LinearRamp
EndFunction
可以看出,在分割填充路径集合时,该方法最好使用位于中点的填充路径作为第一个斜面的终点和第二个斜面的起点。从而与先前的实现相比,确保相邻直线性斜面之间的均匀混合,并消除马赫条带。作为选择,也可以使用传统的基于(n/2)和(n/2)+1的分割。
现在转到图9A至图9C,图9A至图9C表示添加到当前存储的渐变填充中的填充路径的示范集合的颜色通道的值,用于说明生成一个或多个直线性混合的方法。图9A至图9C表示沿x坐标轴方向描绘的填充路径1到11沿y坐标轴方向的色值。符号C代表填充路径的颜色通道值,符号H代表所有存储的填充路径的累计高度值,即,总高度。为简单起见,假设只有一个颜色通道。可以理解,依次将填充路径1...10添加到当前存储的渐变填充中,直至收到来自GDI层的填充路径11。可以看出,填充路径11不满足公式(1)所列的标准,因此不会添加到当前存储的渐变填充中。然后,该方法按下述方式,根据当前存储的渐变填充内的填充路径1...10,生成一个或多个直线性混合。
首选方法根据公式(2),比较填充路径1...10之间的颜色梯度与填充路径1...5之间的颜色梯度。同时上述比较确保n不低于某个预定值。为简单起见,本例忽略该过程。图9A表示以上比较。此时,比较的输出大于阈值常数E0=0.1,因此该方法将集合fill-paths[1...10]划分为两个集合:fill-paths[1...5]和fill-paths[5...10]。
接着,该方法根据公式(2),比较填充路径1...5之间的颜色梯度与填充路径1...3之间的颜色梯度。请注意,当n为奇数时,需要增加值n/2,直至到达下一个最接近的整数,此时为3。图9B表示上述比较。此时比较的输出小于阈值常数E0=0.1,因此输出填充路径1到5的直线性混合。
接着,该方法根据公式(2),比较填充路径5到10之间的颜色梯度与填充路径5到7之间的颜色梯度。请注意,此时,该集合中的第一条填充路径为填充路径5,从该填充路径测量梯度。图9C表示上述比较。此时比较的输出大于阈值常数E0=0.1,因此该方法将集合fill-paths[5...10]划分为两个集合:fill-paths[5...7]和fill-paths[7...10]。
接着,该方法根据公式(2),比较填充路径5到7之间的颜色梯度与填充路径5到6之间的颜色梯度。图9C表示上述比较。此时比较的输出小于阈值常数E0=0.1,因此输出填充路径5到7的直线性混合。同样,该方法确定填充路径7和8之间的颜色梯度与填充路径7和10之间的颜色梯度类似,因此输出填充路径7和10的直线性混合。然后该方法结束。
可以看出,该方法依据全部渐变填充的直线性,而不是简单地依据迄今为止处理过的那些部分,将存储的全部渐变填充划分为不同部分。因此在确定直线性混合的最佳集合时,确保考虑所有渐变填充,从而保证在最少数目的直线性斜面的情况下,获得原始渐变填充的最佳可能匹配。该方法识别一个渐变填充内较大的不变斜率,并输出它们。这样,该方法能够减少需要描绘的图形对象数。另外,通过将分割的中点作为第一斜面的终点和第二斜面的起点,能够避免马赫条带。
如上所述,该方法依次接收来自GDI层的填充路径,并且根据新接收的填充路径是否满足公式(1)所列的标准,将其添加到当前存储的渐变填充中。如果不满足该标准,则不在当前存储的渐变填充中存储新接收的填充路径,并且该方法处理当前存储的渐变填充内的现有填充路径,以生成一个或多个直线性混合。除公式(1)指定的标准之外,新接收的填充路径,在被添加到当前存储的渐变填充中之前,最好还满足多个其他标准。例如,新接收的填充路径的矩形高度应小于或等于当前存储的渐变填充内的第一条填充路径的矩形高度的两倍,才能将新接收的填充路径添加到当前存储的渐变填充中。否则,如果将新接收的填充路径添加到当前存储的渐变填充中,则眼睛很容易看到不连续混合。以下将详细描述其他标准。
3.0 第一方法
现在转到图10,该图表示生成一个或多个直线性混合的方法1005的流程图。如上所述,将方法1005实现为通用计算机的处理器上执行的软件模块。图17表示适合于实现首选方法的这样一种通用计算机。软件模块最好为图形描绘系统的第一层的一部分,以连接图形设备接口(GDI)层,并接收页面的图形对象,从而将每个图形对象转换为基于边缘的中间格式。在图形描绘系统的第二层中,描绘作业,然后将由此生成的象素输出到诸如打印机或图形卡之类的下行设备上。最好将图形描绘系统的两层实现为用于在计算机的处理器上执行的图形描绘软件应用程序。所有已知的图形描绘软件应用程序都是合适的,前提是进行适当修改以便连接实现方法1005的软件模块。
当被图形描绘系统的第一层进行调用时,方法1005在步骤1000开始操作。当图形描绘系统收到来自GDI层的一个新的图形对象时,调用方法1005。在步骤1000之后,在步骤1010中,方法1005输入当前传送给图形描绘系统的图形对象。同时在步骤1010中,方法1005检查当前接收的图形对象是否是一条填充路径。如果步骤1010确定当前接收的图形对象不是填充路径,则方法1005转到步骤1040,在步骤1040中调用称为flush_ramp的子过程1505。子过程flush_ramp1505处理当前存储的渐变填充中存储的所有填充路径,以生成一个或多个直线性混合,然后传送给图形描绘系统。在生成直线性混合之后,子过程flush_ramp 1505清空存储的渐变填充。以下会参照图15详细描述子过程flush_ramp 1505。
在完成步骤1040之后,方法1005在步骤10100结束,并向图形描绘系统的第一层返回消息SKIP(跳过),该消息表示当前接收的对象不是有效填充路径。接着,图形描绘系统的第一层试图将该填充路径转换为基于边缘的格式(如果可能的话),否则跳过该对象,系统转到下一个对象。可以理解,如果当前接收的图形对象不是有效填充路径,则在转换为基于边缘的中间格式前,方法1005无需进行预处理。
否则,如果步骤1010确定当前接收的图形对象是填充路径,则方法1005转到步骤1020。在步骤1020中,方法1005检查当前接收的填充路径是否具有构成渐变填充所需的基本性质。特别地,步骤1020对新接收的填充路径进行以下测试:其一边至少小于预先确定的可配置的最大长度;正在用接近原色进行填充;包含定义平行四边形的四个点;并且不使用需要目的地的光栅操作。如果当前接收的填充路径满足以上标准,则方法1005转到步骤1030。否则,如果该填充路径不满足以上标准,则方法1005转到步骤1040,在步骤1040中,调用名为flush_ramp的子过程1505。
接着,在步骤1030中,方法1005检查当前存储的渐变填充中的填充路径的数目是否为零。如果方法1005确定当前存储的渐变填充不包括填充路径,则方法1005转到步骤1080。在步骤1080中,方法1005通过将新接收的填充路径添加到当前为空的渐变填充中,初始化一条新的渐变填充。由于填充路径的方向还未确定,所以填充路径的高度未知。在接收第二条填充路径时定义方向,这意味着只有确定第二条填充路径为包含第一条填充路径的渐变填充的一部分时,才累加第一条填充路径的高度。当在步骤1090中调用add_rect子过程1105时,将第一条填充路径的高度累加到存储的渐变填充中。否则,如果当前存储的渐变填充中的填充路径的数目大于零,则方法1005转到步骤1050。
在步骤1050中,方法1005调用名为check_fill的子过程1205,确定是否将当前接收的填充路径添加到当前存储的渐变填充中。如果填充路径将要添加到当前存储的渐变填充中,则check_fill子过程1205返回真,否则,如果不需要添加,则返回假。以下会参照图12详细描述check_fill子过程1205。
在完成步骤1050之后,方法1005转到步骤1060,后者确定check_fill子过程1205返回真还是返回假。如果步骤1060确定已返回一个真,则方法1005转到步骤1090,在步骤1090中,将当前接收的填充路径添加到当前存储的渐变填充中。在步骤1090中,方法1005调用名为add_rect的子过程1105,以便将当前接收的填充路径添加到当前存储的渐变填充中。以下会参照图11详细说明子过程add_rect1105。否则,如果已返回一个假,则方法1005转到步骤1070。
在步骤1070中,方法1005调用上述子过程flush_ramp 1505,以便处理当前存储的渐变填充。在完成步骤1070之后,方法1005转到步骤1080,在步骤1080中,通过将当前接收的填充路径添加到所存储的当前为空的渐变填充中,初始化一个新的渐变填充。
在完成步骤1080或1090之后,方法1005在步骤10100结束。当方法1005结束时,向图形描绘系统的第一层返回参数OK(确定),通知第一层不需要进行转换,并将该填充路径传递给图形描绘系统的第二层。
3.1 add_rect子过程
现在转到图11,该图表示图10所示方法1005调用的add_rect子过程1105的流程图。add_rect子过程1105负责将新填充路径添加到当前存储的已经包含一条或多条填充路径的渐变填充中。当方法1005的步骤1090(图10)调用add_rect子过程1105时,子过程1105在步骤1100开始。同时步骤1090向add_rect子过程1105传递当前接收的填充路径,以添加到当前存储的渐变填充中。
在步骤1100之后,add_rect子过程1105转到步骤1110,在步骤1110中,检查当前存储的渐变填充中的填充路径的数目。如果步骤1110显示当前存储的渐变填充中只有一条填充路径,则add_rect子过程1105转到步骤1120,在步骤1120中,确定当前接收的填充路径的填充方向(如VDOWNRIGHT)。通过调用名为get_alignment的子过程1495实现上述处理。以下会参照图14详细说明get_alignment子过程1495。否则,如果当前存储的渐变填充中的填充路径的数目大于1,则add_rect子过程1105直接转到步骤1160。
在步骤1120中确定填充方向之后,add_rect子过程1105转到步骤1130。在步骤1130中,利用switch语句将方向分成水平(HDOWNRIGHT,HUPRIGHT,HDOWNLEFT或HUPLEFT)和垂直(VDOWNRIGHT,VUPRIGHT,VDOWNLEFT或VUPLEFT)斜面。如果斜面为水平斜面,则执行步骤1140,在步骤1140中,利用x投影(见图7B)定义当前存储的渐变填充中的第一条填充路径和所接收的填充路径的矩形高度。然后将第一条填充路径的高度存储到当前存储的渐变填充中。否则,如果斜面是垂直斜面,则执行步骤1150,在步骤1150中,则利用y投影(见图7A)定义当前存储的渐变填充中的第一条填充路径和当前接收的填充路径的矩形高度。然后将第一条填充路径的高度存储到当前存储的渐变填充中。
在完成步骤1140或1150以后,add_rect子过程1105转到步骤1160,在步骤1160中,将该填充路径以及所有先前填充路径(如果有的话)的累计高度,存储到高度数组中。将当前接收的填充路径的颜色增加到颜色数组中,并且将填充数目加1。同时更新点数组以保存当前接收的填充路径的端点。在完成步骤1160以后,add_rect子过程1105在步骤1170结束,返回到方法1005的步骤10100。
3.2 check_fill子过程
现在转到图12,该图表示图10所示方法1005的步骤1050调用的check_fill子过程1205的流程图。check_fill子过程1205负责检查当前接收的填充路径是否适合于添加到当前存储的渐变填充中。当方法1005的步骤1050(图10)调用check_fill子过程1205时,子过程1205在步骤1200开始。同时步骤1050向check_fill子过程1205传递当前接收的填充路径。
在步骤1200之后,check_fill子过程1205转到步骤1210。在步骤1210中,对于各RGBA/CMYK(取决于使用的颜色空间)色值,check_fill子过程1205计算当前接收的填充路径的颜色与当前存储的渐变填充中最后添加的填充路径的颜色之间的差值(即Cn-Cn-1)。所存储的渐变填充中最后添加的填充路径的颜色为颜色数组的最后位置中存储的颜色。在完成步骤1210之后,check_fill子过程1205转到步骤1220。
在步骤1220中,check_fill子过程1205首先测试当前的渐变填充中是否只存储了一条填充路径。其次,测试当前接收的填充路径是否与当前存储的渐变填充对准。第三,通过调用名为check_output_fill的子过程1305,测试当前存储的渐变填充中的填充路径是否与当前接收的填充路径匹配。最后,测试新填充路径的裁剪区域和光栅操作是否与当前存储的渐变填充中先前添加的填充路径的裁剪区域和光栅操作相同。以下会参照图13详细说明check_output_fill子过程1305。如果肯定满足所有上述测试,则check_fill子过程1205转到步骤1240。否则,如果不满足某项测试,则check_fill子过程1205转到步骤1230。请注意,check_fill子过程1205依次评价各项测试,如果肯定不满足某项测试,则check_fill子过程1205立即转到步骤1230,而不会评价后续测试。例如,如果当前存储的渐变填充中只有一条填充路径,并且该填充是对准的,则满足第一和第二项测试,然后第三项测试调用check_output_fill子过程1305。另一方面,如果当前存储的渐变填充中的填充路径不止一条,则check_fill子过程1205转到步骤1230,而不会评价后续测试。因此,仅当有一条适当对准的当前接收的填充路径并且所存储的渐变填充仅包含一条填充路径时,才调用check_output_fill子过程1305。
接着在步骤1240中,check_fill子过程1205检查前两条填充路径的高度是否相似。最好通过测试当前接收的填充路径的矩形高度是否大于当前存储的渐变填充中的填充路径的矩形高度的两倍,才测试相似性。请注意,在步骤1240中,当前存储的渐变填充中只有一条填充路径。如果测试显示高度相似,则check_fill子过程1205转到步骤1250。否则,如果测试显示两个高度不相似,则check_fill子过程1205在步骤1260结束,并向方法1005的步骤1050返回假,表示不能将当前接收的填充路径添加到当前存储的渐变填充中。
在步骤1250中,check_fill子过程1205存储在步骤1210中计算的两条填充路径的颜色梯度。在步骤1250之后,check_fill子过程1205在步骤1260结束,并向方法1005的步骤1050返回真,从而方法1005将新填充路径添加(步骤1090)到存储的渐变填充(此时仅包含一条填充路径)中。
另一方面,如果在步骤1220中不满足某一需求,则check_fill子过程1205转到步骤1230。接着在步骤1230中,check_fill子过程1205检查当前接收的填充路径是否为需要添加到当前存储的渐变填充中的合适候选项。步骤1230通过执行检查该处理以确保:
1.当前存储的渐变填充中的填充数目大于1;
2.当前存储的渐变填充中的累计高度与当前接收的填充路径的矩形高度之和小于预定的最大值。可以将预定的最大值设置为某个值,使得填充不会延伸到页面以外;
3.当前接收的填充路径与当前存储的渐变填充中最后添加的填充路径之间的颜色梯度具有相同符号,并与存储的梯度类似。检查所用颜色空间内每个颜色指数的梯度(例如,如果颜色空间为RGBA,则检查各指数R、G、B的一致性)。最好进行检查以确保当前接收的填充路径的各颜色通道的颜色通道值Cn满足公式(1)的某个关系;
4.当前接收的填充路径与当前存储的渐变填充中的填充路径正确对准;
5.当前接收的填充路径的高度(矩形高度)与当前存储的渐变填充中最后添加的填充路径的高度相似。最好通过测试当前接收的填充路径的矩形高度是否不超过当前存储的渐变填充中第一条填充路径的矩形高度的两倍,来检查上述相似性;
6.当前接收的填充路径的光栅操作与所存储的渐变填充的光栅操作相同;
7.当前接收的填充路径的裁剪与所存储的渐变填充的裁剪相同。
如果步骤1230确定当前接收的填充路径已通过上述检查1到7,则check_fill子过程1205在步骤1260结束,并向方法1005的过程1050返回真,从而方法1005将新填充路径添加(步骤1090)到当前存储的渐变填充中。否则,如果检查1到7的某个检查失败,则check_fill子过程1205在步骤1260结束,并向方法1005的过程1050返回假,从而不会将当前接收的填充路径添加到当前存储的渐变填充中。
3.3 check_ouput_fill子过程
现在转到图13,该图表示图12的check_fill子过程1205的步骤1220调用的check_output_fill子过程1305的流程图。check_output_fill子过程1305负责确定当前存储的渐变填充中的单一填充路径和当前接收的填充路径是否适合于创建渐变填充。当check_fill子过程1205的步骤1220(图12)调用check_output_fill子过程1305时,子过程1305在步骤1300开始。同时步骤1220向check_output_fill子过程1305传递当前接收的填充路径。
在步骤1300之后,check_output_fill子过程1305转到1310。在步骤1310中,对于各颜色通道(如,红、绿、蓝和阿尔法),check_output_fill子过程1305首先计算当前接收的填充路径的颜色与当前存储的渐变填充中单一填充路径的颜色之间的色差的绝对值。接着在步骤1310中,check_output_fill子过程1305确定并存储色差绝对值最大的计算值(以下称为最大颜色梯度)。在完成步骤1310以后,check_output_fill子过程1305转到步骤1330。
在步骤1330中,check_output_fill子过程1305检查(在步骤1310中计算的)最大颜色梯度是否小于预定的最大值。最大值最好为6。如果检查1330显示小于预定的最大值,则check_output_fill子过程1305在步骤13100结束,并向check_fill子过程1205(图12)的步骤1220返回真。这通知check_fill子过程1205(图12)应当创建渐变填充。另一方面,如果检查1330显示最大颜色梯度大于或等于预定的最大值,则check_output_fill子过程1305转到步骤1340。在后一种情况中,如果各填充路径的高度很小,则仍有可能应当创建渐变填充,而高度是在步骤1340至1390中确定的。
在步骤1340中,check_output_fill子过程1305调用名为get_alignment的子过程1495,以确定填充路径的对准性。该get_alignment子过程1495向check_output_fill子过程1305返回当前接收的填充路径和当前存储的渐变填充中单一填充路径的对准性(如,VDOWNLEFT)。在步骤1340中调用的get_alignment子过程1495结束后,check_output_fill子过程1305转到步骤1350。
在步骤1350中,check_output_fill子过程1305检查步骤1340返回的对准性。如果检查1350显示根本未定义该方向,即get_alignment的子过程1495返回NONE(无),则check_output_fill子过程1305在步骤13100结束,并向check_fill子过程1205的步骤1220返回假,表示不应创建渐变填充。如果检查1350显示方向为水平方向,即get_alignment的子过程1495返回HDOWNLEFT、HUPLEFT、HDOWNRIGHT或HUPRIGHT,则check_output_fill子过程1305转到步骤1360。否则,如果检查1350显示方向为垂直方向,即get_alignment的子过程1495返回VDOWNLEFT、VUPLEFT、VDOWNRIGHT或VUPRIGHT,则check_output_fill子过程1305转到步骤1390。
在步骤1360中,check_output_fill子过程1305将当前接收的填充路径的矩形高度设置为平行四边形沿x坐标轴的侧边的长度(见图7B)。另一方面,在步骤1390中,check_output_fill子过程1305将当前接收的填充路径的矩形高度设置为平行四边形沿y坐标轴的侧边的长度(见图7B)。在完成步骤1360或1390之后,check_output_fill子过程1305转到步骤1380。
接着在步骤1380中,check_output_fill子过程1305检查在步骤1360或1390中计算的矩形高度是否小于某预定的最大高度且大于零。如果检查1380显示并非如此,则check_output_fill子过程1305在步骤13100结束,并向check_fill子过程1205的步骤1220返回假。这样表示不应创建渐变填充。另一方面,如果检查1380显示其高度小于预定的最大高度且大于零,则check_output_fill子过程1305在步骤13100结束,并向check_fill子过程1205的步骤1220返回真。这样表示两条填充路径,即当前接收的填充路径和当前存储的渐变填充中的单一填充路径,可能适合于创建一个渐变填充。
3.4get_alignment子过程
现在转到图14A至图14C,图14A至图14C分别表示图11的add_rect子过程1105、图12的check_fill子过程1205和图13的check_output_fill子过程1305调用的get_alignment子过程1495的流程图。该get_alignment子过程1495负责确定由当前存储的渐变填充中的单一填充路径和当前接收的填充路径组成的梯度的方向。当check_fill子过程1205的步骤1220(图12)、add_rect子过程1105的步骤1120(图11)或check_output_fill子过程1305的步骤1340(图13)调用get_alignment子过程1495时,子过程1495在步骤1400开始。在步骤1400中,步骤1220、1120和1340向get_alignment子过程1495传递当前接收的填充路径。
在完成步骤1400之后,get_alignment子过程1495转到步骤1401,在步骤1401中,get_alignment子过程1495检查当前接收的填充路径是否为矩形。如果检查1401显示当前接收的填充路径为矩形,则get_alignment子过程1495转到步骤1402。在步骤1402中,get_alignment子过程1495检查当前接收的填充路径和当前存储的渐变填充中的单一填充路径是否在x平面上对准。如果检查1402显示它们在x平面上对准,则get_alignment子过程1495转到步骤1404。另一方面,如果检查1402显示它们未在x平面上对准,则get_alignment子过程1495转到步骤1403。
在步骤1403中,get_alignment子过程1495检查是否将当前接收的填充路径连接到当前存储的渐变填充中的单一填充路径的顶边上。如果检查1403返回真(是),则get_alignment子过程1495在步骤14150结束,并向调用它的子过程返回方向UP(上)。另一方面,如果检查1403返回假(否),则get_alignment子过程1495转到步骤1406。
在步骤1406中,get_alignment子过程1495检查是否将当前接收的填充路径连接到当前存储的渐变填充中的单一填充路径的底边上。如果检查1406返回真(是),则get_alignment子过程1495在步骤14150结束,并向调用它的子过程返回方向DOWN(下)。另一方面,如果步骤1406处的检查返回假(否),则get_alignment子过程1495在步骤14150结束,并向调用它的子过程返回方向NONE(无)。可以理解,在后一种情况中,不连接填充路径,表示不进行混合。
在步骤1404中,get_alignment子过程1495检查是否将当前接收的填充路径连接到当前存储的渐变填充中的单一填充路径的左边上。如果步骤1404处的检查返回真(是),则get_alignment子过程1495在步骤14150处结束,并向调用它的子过程返回方向LEFT(左)。另一方面,如果步骤1404处的检查返回假(否),则get_alignment子过程1495转到步骤1405。
在步骤1405中,get_alignment子过程1495检查是否将当前接收的填充路径连接到当前存储的渐变填充中的单一填充路径的右边上。如果检查1405返回真(是),则get_alignment子过程1495在步骤14150结束,并向调用它的子过程返回方向RIGHT(右)。另一方面,如果1405处的检查返回假(否),则get_alignment子过程1495在步骤14150结束,并向调用它的子过程返回方向NONE(无)。可以理解,在后一种情况中,不连接填充路径,表示不进行混合。
另一方面,如果步骤1401处的检查显示当前接收的填充路径不是矩形,则get_alignment子过程1495转到步骤1410。在步骤1410中,检查当前接收的填充路径和当前存储的渐变填充中的单一填充路径,查看其端点1.y是否对准。假如对准的话,则渐变填充为水平类型填充(图6A至图6D),并且get_alignment子过程1495转到步骤1420。否则,渐变填充为垂直类型填充(图5A至图5D),并且get_alignment子过程1495转到步骤1480。
在步骤1420中,get_alignment子过程1495检查当前存储的渐变填充中的单一填充路径,查看其端点1.x是否小于x平面上的端点4.x。假如这样的话,则填充或者为HDOWNRIGHT、HUPRIGHT,或者为NONE(图6A或图6B),并且get_alignment子过程1495转到步骤1450。在步骤1450中,get_alignment子过程1495检查当前存储的渐变填充的填充路径的端点1是否位于边界矩形的上边界附近。假如这样的话,则认为填充是HDOWNRIGHT填充(见图6A),get_alignment子过程1495在步骤14150结束,并向调用它的步骤返回HDOWNRIGHT。否则,get_alignment子过程1495转到步骤1460。在步骤1460中,get_alignment子过程1495检查当前存储的渐变填充的填充路径的端点1是否位于边界矩形的下边界附近。假如这样的话,则认为填充是HUPRIGHT填充(见图6B),get_alignment子过程1495在步骤14150结束,并向调用它的步骤返回HUPRIGHT。否则,认为填充没有方向(即,NONE),get_alignment子过程1495在步骤14150结束,并向调用它的步骤返回值NONE。
另一方面,在步骤1420中,如果get_alignment子过程1495确定当前存储的渐变填充中的单一填充路径的端点1.x大于或等于x平面上的端点4.x,则get_alignment子过程1495转到步骤1430。在步骤1430中,get_alignment子过程1495检查当前存储的渐变填充中的单一填充路径的端点1是否大于x平面上的端点4。若不然,则认为填充没有方向(即,NONE),get_alignment子过程1495在步骤14150结束,并向调用它的步骤返回值NONE。否则,get_alignment子过程1495转到步骤1440。
在步骤1440中,get_alignment子过程1495检查当前存储的渐变填充中的单一填充路径的端点1.y是否位于y平面上的边界矩形的上边界附近。若不然,则认为该填充是HUPLEFT(图6D),get_alignment子过程1495在步骤14150结束,并向其调用步骤返回值HUPLEFT。否则,get_alignment子过程1495转到步骤1470。在步骤1470中,get_alignment子过程1495检查当前存储的渐变填充中的单一填充路径的端点1.y是否位于y平面上的边界矩形的下边界附近。假如这样的话,则认为该填充是HDOWNLEFT填充(见图6C),get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值HDOWNLEFT。否则,认为该填充没有方向(NONE),get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值NONE。
在步骤1480中,get_alignment子过程1495检查对于端点1当前接收的填充路径和当前存储的渐变填充中存储的填充路径是否具有相同的x值。若不然,则填充路径未对准,并且不能构成一个渐变填充,get_alignment子过程1495结束,并向其调用步骤返回值NONE。否则,get_alignment子过程1495转到步骤1490。
在步骤1490中,get_alignment子过程1495测试当前存储的渐变填充中存储的填充路径的端点1是否小于y平面上同一填充路径的端点4。假如这样的话,认为填充是VDOWNLEFT或VDOWNRIGHT(见图5A和5B),并且get_alignment子过程1495转到步骤14120。
在步骤14120中,get_alignment子过程1495检查当前存储的渐变填充中存储的填充路径的端点1是否位于边界矩形的右边附近。假如这样的话,认为填充是VDOWNLEFT(见图5B),get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值VDOWNLEFT。否则,get_alignment子过程1495转到步骤14130。
在步骤14130中,get_alignment子过程1495检查当前存储的渐变填充中存储的填充路径的端点1是否位于边界矩形的左边附近。假如这样的话,认为填充是VDOWNRIGHT(见图5A),get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值VDOWNRIGHT。否则,认为填充路径未对准,get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值NONE。
否则,如果步骤1490返回假(否),则get_alignment子过程1495转到步骤14100。在步骤14100中,get_alignment子过程1495测试当前存储的渐变填充中存储的填充路径的端点1是否大于同一填充路径的端点4(在y平面上)。若不然,认为填充路径未对准,get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值NONE。否则,get_alignment子过程1495转到步骤14110。
在步骤14110中,get_alignment子过程1495测试当前存储的渐变填充中的单一填充路径的端点1是否位于边界矩形的右边附近。假如这样的话,认为填充是VUPLEFT(见图5C),get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值VUPLEFT。否则,get_alignment子过程1495转到步骤14140。
在步骤14140中,get_alignment子过程1495测试当前存储的渐变填充中的填充路径的端点1,检查其是否位于边界框的左边附近。假如这样的话,认为填充是VUPRIGHT(见图5D),get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值VUPRIGHT。否则,认为填充路径未对准,get_alignment子过程1495结束于步骤14150,并向其调用步骤返回值NONE。
可以看出,已经在任何步骤中确定对准性或未对准性,然后仅仅向调用子过程返回对准性。
3.5 flush_ramp子过程
现在转到图15,该图表示方法1005的步骤1040和1070调用的flush_ramp子过程1505的流程图。flush_ramp子过程1505主要负责清空当前存储的渐变填充。当方法1005的步骤1040和1070(图10)调用flush_ramp子过程1505时,子过程1505开始于步骤1500。在开始于步骤1500之后,flush_ramp子过程1505转到步骤1510。
在步骤1510中,flush_ramp子过程1505检查当前存储的渐变填充中的填充路径的数目。如果步骤1510处的检查显示没有填充路径,则flush_ramp子过程1505结束于步骤1560,并向调用步骤1040或1070返回,因为已清空了所有填充路径。否则,如果步骤1510处的检查显示当前存储的渐变填充中有一条或多条填充路径,则flush_ramp子过程1505转到步骤1520。
在步骤1520中,flush_ramp子过程1505再次检查当前存储的渐变填充中的填充数目。此时,如果步骤1520处的检查显示填充数目为1,则flush_ramp子过程1505转到步骤1530。在步骤1530中,在图形描绘系统的第一层中调用外部函数draw_flat,以便将单一填充路径转换为基于边的格式。在完成步骤1530之后,flush_ramp子过程1505转到步骤1550。另一方面,如果步骤1520处的检查显示当前存储的渐变填充中的填充路径的数目大于1,则在步骤1540中调用find_and_put_ramps函数1605。find_and_put_ramps函数1605负责将当前存储的渐变填充分割为多个最佳的直线性混合,并输出到图形描绘系统的第一层,以便转换为基于边的格式。以下会参照图16说明find_and_put_ramps函数1605。当步骤1540中的find_and_put_ramps函数1605完成之后,flush_ramp子过程1505转到步骤1550。
接着,在步骤1550中,flush_ramp子过程1505清空当前存储的渐变填充中的所有填充路径,并将变量numfills(填充数目)复位为零。在完成步骤1550之后,flush_ramp子过程1505结束,并返回到方法1005的调用步骤1040或1070(图10)。
3.6 find_and_put_ramps子过程
现在转到图16,该图表示图15的flush_ramp子过程1505的步骤1540最初调用的find_and_put_ramps子过程1605的流程图。find_and_put_ramps子过程1605负责将当前存储的渐变填充分割为多个最佳的直线性混合,并将它们输出到图形描绘系统的第一层,以便转换为基于边的格式。可以从以下说明中看出,find_and_put_ramps子过程1605是一个递归子过程。在步骤1600中,find_and_put_ramps子过程1605开始,该过程将当前存储的渐变填充路径的填充路径集合的颜色数组、点数组和高度数组作为输入。当flush_ramp子过程1505的步骤1540(图15)最初调用find_and_put_ramps子过程1605时,将当前存储的渐变填充的填充路径的完整集合的颜色数组、点数组和高度数组,传递给find_and_put_ramps子过程1605。为了说明起见,将填充路径的完整集合记作fill-paths[1...n],分别将其颜色数组、点数组和高度数组记作C[1...n],points[1...n]和H[1...n]。
在步骤1600之后,find_and_put_ramps子过程1605转到步骤1610。在步骤1610中,find_and_put_ramps子过程1605根据上述公式(2),检查集成fill-paths[1...n]的前一半填充路径的颜色梯度是否与整个fill-paths[1...n]的颜色梯度不接近(如,RGBA接近原色的红、绿、蓝和阿尔法通道)。同时,步骤1610检查n是否小于预定的最小值,该最小值最好设置为5或一个相同数量级的数值。如果检查1610显示颜色梯度不接近,即不满足公式(2)的要求,并且n不小于预定阈值,则find_and_put_ramps子过程1605转到步骤1630。否则,find_and_put_ramps子过程1605转到步骤1620。
在步骤1630中,find_and_put_ramps子过程1605将fill-paths[1...n]的点数组、颜色数组和高度数组划分为两套点数组、颜色数组和高度数组(C[1..n/2],H[1..n/2],P[1..n/2])和(C[n/2..n],H[n/2..n],P[n/2..n]),其中n为数组的大小,如果n为奇数,则增加n/2,直至到达下一个最接近的整数。在完成步骤1630之后,find_and_put_ramps子过程1605转到步骤1640。
在步骤1640中,find_and_put_ramps子过程1605依次对两个新数组集合(C[1..n/2],H[1..n/2],P[1..n/2])和(C[n/2..n],H[n/2..n],P[n/2..n])的每个集合调用find_and_put_ramps子过程1605。在完成步骤1640之后,find_and_put_ramps子过程1605结束于步骤1660,并且方法1005返回到flush_ramp子过程1505的步骤1550(图15)。
在步骤1620中,find_and_put_ramps子过程1605根据填充方向计算总高度,并计算用于定义将要应用的渐变填充的端点所需的两个端点。需要计算这两个端点,从而沿正确方向应用渐变填充,参见图8A至8C。通常总是将第一个端点定义为所存储的填充路径端点的某个端点。依据渐变填充是水平类型还是垂直类型,通过使用总高度以及图14A至14C所示的公式,查找第二端点(Q,P)。
在完成步骤1620之后,find_and_put_ramps子过程1605转到步骤1650。在步骤1650中,调用外部函数draw_blend,以便利用在步骤1620中确定的两个端点,起始颜色以及每个象素每个颜色通道的颜色梯度,生成一个直线性混合,并输出到图形描绘系统。任何已知的用于生成直线性混合的函数均适用。在完成步骤1650之后,find_and_put_ramps子过程1605结束,并返回到其调用步骤1640或1540。
上述方法1005和子过程包括特定控制流。方法1005可具有其他不同形式,可以使用不同的控制流而并不背离本发明的实质。另外,可以并行执行而不是顺序执行方法1005的一个或多个步骤。
4.0 备择方法
通过按照图18所示的方式修改上述方法1005,可以实现用于生成直线性混合的备择方法。备择方法主要来自get_alignment子过程的简化以及由此引起的其他子过程的必然修改。在以下说明中,利用相同参考标号表示与前述步骤和过程相同的方法步骤和过程。
正如在图18中看到的那样,备择方法1805具有入口点1800,从入口点转到步骤1010、1020、1030和1040,其中各步骤按前述方式运行。来自步骤1030的“否”结果,调用步骤1850,检查渐变填充。步骤1850调用图20的modified_check_fill子过程2005。子过程2005具有入口点2000,从该入口点转到按前述方式运行的步骤1210,然后转到判定步骤2002。
在判定步骤2002中,modified_check_fill子过程2005首先测试当前的渐变填充中是否仅仅存储了一条填充路径。其次,通过调用参照图21说明的alternate_get_alignment子过程2105,测试当前接收的填充路径是否与当前存储的渐变填充对准。第三,通过调用图13所示的check_output_fill流程图的修改流程图,测试当前存储的渐变填充中的填充路径和当前接收的填充路径是否看起来一致。尽管未单独示出其修改流程图,但是根据以下说明以及图13,其修改是显而易见的。在修改中,如果图13的检查步骤1330显示最大颜色梯度大于或等于预定的最大值(即,否),则check_output_fill子过程的当前修改直接结束于步骤13100,并向modified_check_fill子过程2005(图20)的步骤2002返回假。在该经过修改的实现中,完全省略图13的步骤1340、1350、1360、1380和1390。这通知modified_check_fill子过程2005(图20)不应创建渐变填充。最后,判定步骤2002检查当前接收的填充路径的裁剪和光栅操作(ROP)是否与当前存储的渐变填充中存储的填充路径相同。裁剪对象包含一个唯一标识符,利用该标识符检查一致裁剪。唯一标识符是由GDI层设置的。使用与填充路径本身相同区域的裁剪区域被视为空裁剪。
图20所示的modified_check_fill子过程2005的剩余步骤1230、1240、1250与参照图12描述的步骤相对应,因此不再重复,而是经由步骤2060返回图18的步骤1860。
当调用alternate_get_alignment子过程2105时,过程转到图21中的入口点2100。
在步骤2110中,选择某个侧边作为“chosen_side(选定侧边)”。选定侧边基于组成填充路径的端点。在任何时候,新填充路径和存储的填充路径总是具有相同的选定侧边。在这点上,可以将选定侧边定义为某条填充路径的端点0和端点1之间的侧边。由于尚未确定方向,所以假定宽度为选定侧边的长度,假定高度为与选定侧边相邻的侧边的长度。在步骤2110中,如果在该子过程中已经指派了chosen_side,则指派下一个侧边为chosen_side。在任何一次对子过程2105的调用中,不能将某个侧边指派为chosen_side一次以上。
接着,步骤2120检查新接收的填充路径的宽度是否与存储的填充路径的宽度相同,并且宽度的斜率接近。通常两条相邻的填充路径并不完全相同。该算法具有可定义的公差,从而允许新的填充路径与第一条填充路径的宽度和长度有细微差别。利用组成填充路径的端点的各x分量和y分量,计算特定填充路径的宽度和高度。对于各x分量和y分量而言,上述计算中使用的公差最好为±1个象素,但是可根据系统需要容易地改变公差。在测试斜率的近似性时也使用该公差。步骤2120继续检查新填充路径的高度是否等于或不大于第一条所存储的填充路径的高度的两倍。如果高度足够接近,则步骤2120转到步骤2130,否则进行到步骤2140。
接着,步骤2130检查新接收的填充路径的选定侧边的对边是否与存储的填充路径的选定侧边重合(或重叠)。要成为合法重叠,新填充路径和存储的填充路径的全部宽度必须完全重叠。在确定这种重叠时使用一个可配置的公差,公差最好为沿x或y方向±1个象素的数量级。只有重叠高度小于当前存储的渐变填充中的最后填充路径的高度的一半时,重叠才有效。认为彼此不接触的单独的填充路径是不重合或重叠的,即使它们在上述公差标准内。如果侧边重合或重叠,则可以定义方向,并且进行到步骤2150。否则,如果侧边不重合或重叠,则不能确定方向,并且步骤2130转到步骤2140。
在步骤2150中,为当前存储的直线性斜面指派方向。该方向基于当前的选定侧边。如果选定侧边为01,则方向是DIR_21,如果选定侧边为12,则方向是DIR_01,如果选定侧边为23,则方向是DIR_12,如果选定侧边为30,则方向是DIR_10。接着子过程结束于步骤2160,并向调用步骤2002返回适当方向。
在步骤2140中,如果已经选取全部四条边作为选定侧边,则已经用尽所有可能的对准,因此不能为填充路径指派方向,从而在步骤2170向调用步骤2002返回DIR_NONE(无方向)。如果还未用尽全部四条边,则该算法转到步骤2110。
在步骤1850之后,备择方法1805在步骤1860中检查modified_check_fill子过程2005是否已返回真。若不然,步骤1070和1080按前述方式运行。假如这样的话,进行到步骤1890,并利用图19的modified_add_rect子过程1905添加填充路径。子过程1905可用于方法1005或1805。子过程1905具有入口点1900,该入口点转到按前述方式运行的步骤1110。正如在图23A至图23D中看到的那样,如果填充数为1(即,是),则进行到步骤1930,在该步骤直接根据填充方向确定填充的高度。这大大简化了先前在步骤1120、1130、1140和1150(见图11)中执行的过程。
在步骤1930之后,步骤1950继续,在此确定第一条填充路径的高度,并存储在高度数组中。若不然,步骤1160继续,象步骤1950之后那样。接着在步骤1970中,modified_add_rect子过程1905返回到图18的主方法,该方法然后向图形描绘系统的第一层返回参数OK,表示无需进行转换,并将填充路径传递给图形描绘系统的第二层。
当图18的备择方法1805按前述方式运行时,步骤1040和1070调用flush_ramp子过程1505,而后者又调用find_and_put_ramps子过程1605。子过程1605的步骤1620按前述方式运行,以便使用两个端点来定义混合方向。正如在图22中看到的那样,在备择方法1805中,需要计算两个端点,从而沿正确方向应用渐变填充。选择的第一点依赖于渐变填充的遍历方向。如果填充具有方向DIR_01,则选择的第一点为存储的渐变填充中第一条填充路径的点0。如果填充具有方向DIR_10,则选择的第一点为存储的渐变填充中第一条填充路径的点1。如果填充具有方向DIR_12,则选择的第一点为存储的渐变填充中第一条填充路径的点1。如果填充具有方向DIR_21,则选择的第一点为存储的渐变填充中第一条填充路径的点2。通常查找直线B和直线C的交点,确定选择的第二点,在图8中为点2(Q,P)。直线B为与通过渐变填充之第一点的直线A垂直的直线。直线A为通过渐变填充的第一点且与存储的渐变填充中的第一条填充路径的宽度方向平行的直线。直线C为与存储的渐变填充的宽度方向平行且通过沿渐变填充方向描述的第二点的直线(如,对DIR_01渐变填充而言,直线C应通过最后填充路径的点1)。对于沿水平方向或垂直方向遍历的渐变填充而言,渐变填充的第二点为沿着存储的渐变填充中的最后填充路径的填充方向描述的第二点。例如,对于方向DIR_12,渐变填充的第二点为存储的渐变填充中的最后填充路径的点2。
5.0首选装置
最好使用通用计算机系统1700实现图10或图18所示的用于生成一个或多个直线性混合的方法,其中可以将该过程实现为比如计算机系统1700上执行的应用程序软件。特别地,利用计算机执行的软件指令,实现用于生成一个或多个直线性混合的方法的步骤。可以按照一个或多个代码模块的方式构造指令,每个代码模块执行一个或多个特定任务。可以将该软件划分为多个独立部分,其中一个部分执行用于生成一个或多个直线性混合的方法,另一部分管理第一部分和用户之间的用户界面。可以在包括以下存储设备在内的计算机可读介质上存储该软件。从计算机可读介质上将该软件加载到计算机中,并由计算机执行。其上记录有此类软件或计算机程序的计算机可读介质为计算机程序产品。在计算机中使用计算机程序产品可较好地实现用于生成一个或多个直线性混合的有利装置。
计算机系统1700包括计算机组件1701,诸如键盘1702和鼠标1703之类的输入设备,包括打印机1715、显示设备1714和扬声器1717的输出设备。计算机组件1701使用调制器-解调器(调制解调器)收发设备1716与通信网络1720通信,例如,通过电话线1721或其他功能媒介进行连接。能够利用调制解调器1716访问因特网,或诸如局域网(LAN)或广域网(WAN)之类的其他网络系统,并且在某些实现中,可以将调制解调器集成到计算机组件1701中。
计算机组件1701通常包括至少一个处理器1705和一个存储器1706,例如由半导体随机存取存储器(RAM)和只读存储器(ROM)组成的存储器。组件1701还包括许多输入/输出(I/O)接口,如连接视频显示器1714和扬声器1717的音频视频接口1707,用于键盘1702、鼠标1703和可选游戏杆(未示出)的I/O接口1713,用于调制解调器1716和打印机1715的接口1708。在某些实现中,可以将调制解调器1716集成到计算机组件1701中,例如集成到接口1708中。设置了存储设备1709,它通常包括硬盘驱动器1710和软盘驱动器1711。还可以使用磁带驱动器(未示出)。通常提供CD-ROM驱动器1712作为非易失数据源。计算机组件1701的组件1705到1713通常通过互连总线1704进行通信,并采用相关技术人员熟知的计算机系统1700的常规操作方式进行通信。可以实现上述装置的计算机示例包括IBM PC机或其兼容机,Sun Sparcstation或由此演化的计算机系统。
通常,应用程序驻留在硬盘驱动器1710上,由处理器1705读取并控制其执行。通过使用半导体存储器1706(可能需要与硬盘驱动器1710相呼应),中间存储从网络1720上取得的程序和数据。在某些情况中,可以向CD-ROM或软盘上编码的用户提供应用程序,然后通过相应驱动器1712或1711进行读取,作为选择,用户可通过调制解调器设备1716从网络1720上读取应用程序。另外,可以从其他计算机可读介质中将该软件加载到计算机系统1700中。本文使用的术语“计算机可读介质”意指,向计算机系统1700提供指令和/或数据以便执行和/或进行处理的所有存储或传输介质。存储介质的示例包括软盘,磁带,CD-ROM,硬盘驱动器,ROM或集成电路,磁光盘,诸如PCMCIA卡之类的计算机可读卡,而不管此类设备是计算机组件1701的内部设备还是外部设备。传输介质的示例包括射频或红外传输通道,到达其他计算机或联网设备的网络连接,以及因特网或内联网,包括电子邮件传输或网站上记录的信息等。
作为选择,可以利用专用硬件,如执行用于生成一个或多个直线性混合之功能或子功能的一个或多个集成电路,实现用于生成一个或多个直线性混合的方法。此类专用硬件可以作为图形描绘系统的一部分。
工业实用性
上述装置显然适用于计算机制图和印刷行业。
以上仅仅描述了本发明的某些实施方式,可以对本发明进行修改和/或变更而并不背离本发明的范围和实质,实施方式只是说明性的,而不是限制性的。
Claims (17)
1.一种根据限定当前直线性混合的一条或多条填充路径的列表以及至少一条新的填充路径生成直线性混合的方法,其中每条填充路径包括一个单色平行四边形,该方法包括以下步骤:
(a)如果满足条件集合中的每个条件,则将所述一条新的填充路径添加到所述列表中,从而成为所述列表中的最近填充路径,否则转到步骤(c),所述条件集合包括至少一个条件,所述一个条件基于新填充路径和最近填充路径的颜色以及一个阈值,所述阈值被预先设置为这样一个值,从而当新的填充路径在视觉上不构成当前的直线性混合的一部分时,不会将该新的填充路径添加到列表中;
(b)对剩余的每条所述新的填充路径,重复所述步骤(a);以及
(c)根据所述列表中的第一填充路径到所述列表中的最近填充路径,生成多个直线性混合,使得利用最少数目的该直线性混合来近似用所述填充路径表示的原始梯度填充。
2.根据权利要求1的方法,其中所述一个条件包括:
所述新的填充路径和所述列表中的最近填充路径之间的各颜色通道的色差均不大于阈值。
3.根据权利要求2的方法,其中所述阈值为所述列表中的最近填充路径和倒数第二条填充路径之间的色差的两倍。
4.根据权利要求1的方法,其中所述条件集合还包括:
第二条件,即新填充路径与该列表中的最近填充路径物理邻接或重叠。
5.根据权利要求1的方法,其中所述条件集合还包括:
第三条件,即所述新填充路径的高度不超过所述列表中最近添加的填充路径的高度的两倍,所述高度是在按照所述列表中的填充路径的物理位置确定的方向上测量的。
6.根据权利要求1的方法,其中所述条件集合还包括:
第四条件,即当前的直线性混合内的填充路径的数目大于1。
7.根据权利要求1的方法,其中所述条件集合还包括:
第五条件,即所述直线性混合内的填充路径的累计高度与所述新填充路径的矩形高度之和小于预定的最大值。
8.根据权利要求7的方法,其中所述预定的最大值被如此设置以致填充不会越过输出介质的边界。
9.根据权利要求1的方法,其中所述条件集合还包括:
第六条件,即新的填充路径的光栅操作不使用目的地,并且与当前的直线性混合的光栅操作相同。
10.根据权利要求1的方法,其中所述条件集合还包括:
第七条件,即新的填充路径具有与当前的直线性混合相同的裁剪。
11.根据权利要求1的方法,其中所述列表包括一个原始列表fill-paths[1]...[n],所述生成步骤(c)包括以下子步骤:
(ca)确定该列表的fill-path[1]和fi11-path[n]之间的颜色梯度是否在该列表的fill-path[1]和fill-path[n/2]之间颜色梯度的预定公差内;以及
(caa)假如确定的结果在该公差之内,则根据所述列表中的第一条填充路径的颜色和位置以及所述列表中的最近填充路径的颜色和位置,输出列表fill-paths[1]...[n]的直线性混合;否则
(cab)将列表fill-paths[1]...[n]分割为具有至少实质上相同数目填充路径的两个列表;以及
(cb)对每个分割列表重复步骤(ca),直至处理了原始列表fill-paths[1]...[n]中的所有填充路径。
12.根据权利要求11的方法,其中步骤(cab)包括将所述列表分割为两个列表,一个为列表的第一部分fill-path[1]..fill-path[n/2],另一个为列表的第二部分fill-path[n/2]..fill-path[n]。
13.根据权利要求11的方法,其中步骤(cab)包括将所述列表分割为两个列表,一个为列表的第一部分fill-path[1]..fill-path[n/2],另一个为列表的第二部分fill-path[(n/2)+1]..fill-path[n]。
14.根据权利要求11的方法,其中在与填充路径的第一分割列表对应的第一直线性混合的附近,输出与填充路径的第二分割列表对应的第二直线性混合,其中将第二直线性混合的起始颜色设置为第一直线性混合的结束颜色。
15.根据权利要求1的方法,其中定义所述当前直线性混合的所述列表涉及已经接收的一条或多条填充路径,并且所述至少一条新填充路径是新接收的,由此能够实现所述方法。
16.根据权利要求4的方法,其中至少通过比较所述填充路径的对准性确定其毗连性。
17.一种根据定义当前直线性混合的一条或多条填充路径的列表和至少一条新的填充路径生成直线性混合的装置,其中每条填充路径包括一个单色平行四边形,所述装置包括:
添加装置,如果满足条件集合中的每个条件,则将所述一条新的填充路径添加到所述列表中,从而成为所述列表中的最近填充路径,否则启用生成装置,所述条件集合包括至少一个条件,所述一个条件基于新的填充路径和最近填充路径的颜色以及一个阈值,所述阈值被预先设置为这样一个值,从而当新填充路径在视觉上不构成当前的直线性混合的一部分时,不会将新填充路径添加到该列表中;
重复装置,用于对剩余的每条所述新填充路径,重复所述添加装置的操作;以及
所述生成装置,能够根据所述列表中的第一填充路径到所述列表中的最近填充路径,生成多个直线性混合,使得利用最少数目的该直线性混合来近似用所述填充路径表示的原始梯度填充。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
AUPS3005 | 2002-06-17 | ||
AUPS3005A AUPS300502A0 (en) | 2002-06-17 | 2002-06-17 | Generating one or more linear blends |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1472705A CN1472705A (zh) | 2004-02-04 |
CN1287274C true CN1287274C (zh) | 2006-11-29 |
Family
ID=3836566
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB031491286A Expired - Fee Related CN1287274C (zh) | 2002-06-17 | 2003-06-17 | 根据填充路径生成直线性混合的方法和装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US7304648B2 (zh) |
JP (1) | JP3885044B2 (zh) |
CN (1) | CN1287274C (zh) |
AU (1) | AUPS300502A0 (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7900144B1 (en) * | 2000-03-23 | 2011-03-01 | Eastman Kodak Company | Modification of color values in page description files |
US7277095B2 (en) * | 2004-03-16 | 2007-10-02 | Canon Kabushiki Kaisha | Method of rendering graphical objects |
JP2008073946A (ja) * | 2006-09-21 | 2008-04-03 | Kyocera Mita Corp | 画像処理装置及び画像処理プログラム |
AU2009212881B2 (en) * | 2009-08-31 | 2012-06-14 | Canon Kabushiki Kaisha | Efficient radial gradient fills |
AU2009240860B2 (en) * | 2009-11-26 | 2011-12-22 | Canon Kabushiki Kaisha | Determining composite colour for dithered object and contone object |
JP5528209B2 (ja) | 2010-05-20 | 2014-06-25 | キヤノン株式会社 | 画像処理装置および画像処理方法 |
JP5843474B2 (ja) * | 2011-05-09 | 2016-01-13 | キヤノン株式会社 | 画像処理装置、画像処理方法、及び、プログラム |
JP5801598B2 (ja) * | 2011-05-09 | 2015-10-28 | キヤノン株式会社 | 画像処理装置、画像処理方法、及び、プログラム |
US9367933B2 (en) * | 2012-06-26 | 2016-06-14 | Google Technologies Holdings LLC | Layering a line with multiple layers for rendering a soft brushstroke |
US20160282966A1 (en) * | 2015-03-23 | 2016-09-29 | Uhdevice Electronics Jiangsu Co., Ltd. | Input devices and methods |
Family Cites Families (41)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4805116A (en) * | 1986-04-23 | 1989-02-14 | International Business Machines Corporation | Interpolated display characteristic value generator |
US4930092A (en) * | 1987-01-20 | 1990-05-29 | Auto-Trol Technology Corporation | Polygon display apparatus and method |
US5206628A (en) * | 1989-11-17 | 1993-04-27 | Digital Equipment Corporation | Method and apparatus for drawing lines in a graphics system |
JPH06507256A (ja) * | 1991-04-24 | 1994-08-11 | サスマン,マイケル | ディジタル文書拡大表示装置 |
US5159201A (en) * | 1991-07-26 | 1992-10-27 | International Business Machines Corporation | Shape decompositon system and method |
US5457779A (en) * | 1993-01-15 | 1995-10-10 | Silicon Graphics, Inc. | System for accessing graphic data in a SIMD processing environment |
US5402533A (en) * | 1993-04-22 | 1995-03-28 | Apple Computer, Inc. | Method and apparatus for approximating a signed value between two endpoint values in a three-dimensional image rendering device |
JP2769673B2 (ja) * | 1993-11-18 | 1998-06-25 | 大日本スクリーン製造株式会社 | ビネット画像変換装置 |
US5708763A (en) * | 1993-12-21 | 1998-01-13 | Lexmark International, Inc. | Tiling for bit map image |
US5625768A (en) * | 1994-05-23 | 1997-04-29 | Cirrus Logic, Inc. | Method and apparatus for correcting errors in pixel characteristics when interpolating polygons into a pixel grid |
US5673379A (en) * | 1995-03-20 | 1997-09-30 | Hewlett-Packard Company | Scan line generator for area fill of extensible polygons |
US6268859B1 (en) * | 1995-06-06 | 2001-07-31 | Apple Computer, Inc. | Method and system for rendering overlapping opaque graphical objects in graphic imaging systems |
AUPN360295A0 (en) * | 1995-06-16 | 1995-07-13 | Canon Information Systems Research Australia Pty Ltd | Blend control system |
US6121976A (en) * | 1996-02-06 | 2000-09-19 | Ulead Systems, Inc. | Digital image-processing method for conducting color gradient |
US5642774A (en) * | 1996-06-05 | 1997-07-01 | Touchstone, Inc. | Heat exchanger mounting system |
US5896136A (en) | 1996-10-30 | 1999-04-20 | Hewlett Packard Company | Computer graphics system with improved blending |
US6313840B1 (en) * | 1997-04-18 | 2001-11-06 | Adobe Systems Incorporated | Smooth shading of objects on display devices |
JP3514945B2 (ja) * | 1997-05-26 | 2004-04-05 | 株式会社ソニー・コンピュータエンタテインメント | 画像作成方法および画像作成装置 |
US6057850A (en) * | 1997-07-15 | 2000-05-02 | Silicon Graphics, Inc. | Blended texture illumination mapping |
US6016151A (en) * | 1997-09-12 | 2000-01-18 | Neomagic Corp. | 3D triangle rendering by texture hardware and color software using simultaneous triangle-walking and interpolation for parallel operation |
US6421084B1 (en) | 1998-03-02 | 2002-07-16 | Compaq Computer Corporation | Method for interpolating a full color image from a single sensor using multiple threshold-based gradients |
US6329977B1 (en) * | 1998-03-10 | 2001-12-11 | Compaq Computer Corporation | Pre-filtered antialiased lines using distance functions |
US6337692B1 (en) * | 1998-04-03 | 2002-01-08 | Da Vinci Systems, Inc. | Primary and secondary color manipulations using hue, saturation, luminance and area isolation |
US6552726B2 (en) * | 1998-07-17 | 2003-04-22 | Intel Corporation | System and method for fast phong shading |
US6771264B1 (en) * | 1998-08-20 | 2004-08-03 | Apple Computer, Inc. | Method and apparatus for performing tangent space lighting and bump mapping in a deferred shading graphics processor |
US6246805B1 (en) * | 1998-12-04 | 2001-06-12 | Intel Corporation | Efficient beveling of extruded regions in video processing |
US6552731B1 (en) * | 1999-04-16 | 2003-04-22 | Avid Technology, Inc. | Multi-tone representation of a digital image on a digital nonlinear editing system |
US6532081B1 (en) | 1999-07-23 | 2003-03-11 | Xerox Corporation | Weight calculation for blending color transformation lookup tables |
JP3667173B2 (ja) * | 1999-09-27 | 2005-07-06 | キヤノン株式会社 | 画像処理装置および画像処理方法 |
US6774907B1 (en) * | 1999-12-17 | 2004-08-10 | Adobe Systems Incorporated | Tint transformation of fill |
US20040227769A9 (en) | 2000-03-31 | 2004-11-18 | Imation Corp. | Color image display accuracy using comparison of colored objects to dithered background |
US6337925B1 (en) * | 2000-05-08 | 2002-01-08 | Adobe Systems Incorporated | Method for determining a border in a complex scene with applications to image masking |
US6707937B1 (en) | 2000-07-14 | 2004-03-16 | Agilent Technologies, Inc. | Interpolation of edge portions of a digital image |
US6809740B1 (en) * | 2000-07-26 | 2004-10-26 | Lexmark International, Inc. | Dithered quantization using neighborhood mask array to approximate interpolate |
JP2002140030A (ja) * | 2000-10-31 | 2002-05-17 | Seiko Epson Corp | カラー表示方法及びそれを用いる半導体集積回路 |
US6660489B2 (en) * | 2000-12-01 | 2003-12-09 | Becton, Dickinson And Company | ATP extraction method |
US6914602B2 (en) * | 2001-01-19 | 2005-07-05 | Adobe Systems Incorporated | Approximating gradients with offset midpoints |
US6870954B1 (en) * | 2001-04-04 | 2005-03-22 | Adobe Systems Incorporated | Methods apparatus for generating shaped gradient fills |
US6894695B2 (en) * | 2001-04-27 | 2005-05-17 | National Semiconductor Corporation | Apparatus and method for acceleration of 2D vector graphics using 3D graphics hardware |
US6879327B1 (en) * | 2001-08-21 | 2005-04-12 | Adobe Systems Incorporated | Creating gradient fills |
US7130491B2 (en) | 2003-03-14 | 2006-10-31 | Hewlett-Packard Development Company, L.P. | System and method for interpolating a color image |
-
2002
- 2002-06-17 AU AUPS3005A patent/AUPS300502A0/en not_active Abandoned
-
2003
- 2003-06-11 US US10/458,329 patent/US7304648B2/en not_active Expired - Fee Related
- 2003-06-17 CN CNB031491286A patent/CN1287274C/zh not_active Expired - Fee Related
- 2003-06-17 JP JP2003171946A patent/JP3885044B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP3885044B2 (ja) | 2007-02-21 |
AUPS300502A0 (en) | 2002-07-11 |
JP2004145856A (ja) | 2004-05-20 |
US20040012617A1 (en) | 2004-01-22 |
CN1472705A (zh) | 2004-02-04 |
US7304648B2 (en) | 2007-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1147822C (zh) | 图象处理的方法和系统 | |
CN1114888C (zh) | 图像处理方法、设备和系统 | |
CN1253010C (zh) | 图像压缩方法及装置、图像编码装置及图像编码方法 | |
CN1287274C (zh) | 根据填充路径生成直线性混合的方法和装置 | |
CN1293464C (zh) | 混合光栅内容文件的产生和编译方法 | |
CN1045835C (zh) | 产生字符的方法和装置 | |
CN1110745C (zh) | 具有面向目标的打印接口的操作系统 | |
CN1945599A (zh) | 图像处理装置,图像处理方法和计算机程序产品 | |
CN1648894A (zh) | 文件处理装置和文件处理方法 | |
CN101046848A (zh) | 图像处理设备和图像处理方法 | |
CN1445650A (zh) | 面向像素子分量的图像的硬件加强图形加速 | |
CN1115650C (zh) | 图象生成系统和方法 | |
CN101060629A (zh) | 图像压缩/解压方法及图像编/解码器和解码电路 | |
CN101030251A (zh) | 信息处理装置、信息处理方法及计算机可读介质 | |
CN1859541A (zh) | 图像处理设备及其控制方法 | |
CN1878232A (zh) | 图像处理装置及图像处理方法 | |
CN1828591A (zh) | 命令行数据类型发现和转换 | |
CN1519753A (zh) | 程序、字符输入编辑方法、装置及记录媒体 | |
CN1595448A (zh) | 图像处理信息关联处理器、打印系统、启动布局数据输出方法与程序 | |
CN101035189A (zh) | 图像处理设备和图像处理方法 | |
CN1026629C (zh) | 由单一屏面定义文件生成多版屏面 | |
CN1599408A (zh) | 图像处理方法、装置和系统以及打印机、打印指示终端 | |
CN1218917A (zh) | 图像处理装置及方法 | |
CN1846229A (zh) | 图像处理设备、图像处理程序和计算机可读记录介质 | |
CN1107939C (zh) | 用于处理字符的方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20061129 Termination date: 20140617 |
|
EXPY | Termination of patent right or utility model |