具体实施方式
为了提高光栅化处理的效率,节省内存资源,本发明实施例提供一种光栅化处理的方法和装置,将符合可重用条件的Form对象作为一个单独的非物理页面进行语法解释,从而生成相应的点阵,将点阵和相关的参数信息进行全局缓存,之后读取所述缓存的相应点阵和相关参数,逐行组装待输出的页面点阵。
下面结合说明书附图对本发明实施例的方法和装置进行详细说明。
本发明实施例提供一种光栅化处理的装置,如图1所示,包括Form管理器操作单元、Form语法解释单元和Form组装单元。
所述Form管理器操作单元,用于对可重用Form的管理和存取,从Form语法解释单元获取重用Form的点阵及相关参数并存储起来,为Form组装单元提供组装时所需要的参数和数据;进一步还可在作业的开始和结束阶段,创建、释放重用Form管理资源。
所述Form语法解释单元,用于对可重用的Form对象进行语法解释,生成点阵和参数信息,并传递给Form管理器操作单元。
所述Form组装单元,用于根据从重用Form管理器操作单元所获得的可重用Form的点阵和相关参数,逐行组装待输出的页面点阵;进一步所述重用Form管理器操作单元采用取消冗余点阵的方式对可重用Form进行缓存,则所述Form组装单元可根据从重用Form管理器操作单元所获得的可重用Form的类型、点阵和相关参数,逐行组装待输出的页面点阵。
下面对Form管理器操作单元进行详细说明。
Form管理器操作单元对重用Form进行管理和缓存。该缓存是全局的,对需要缓存的重用Form以单个动态链表的形式进行管理,标识Form实例的ID即为该实例在链表中的位置,链表的每一个节点是一个重用Form的实例,实现对单个重用Form点阵和参数信息的存取。
图2是本发明实施例中以动态链表的形式对缓存的Form对象进行管理的示意图。从图2中可见,缓存的点阵是按照不同色面分别保存的,这样便于在读取时快速定位,也利于对缓存空间的大小进行管理。由于重用的Form尺寸一般较大,所以缓存的点阵采用分段缓存和按行组装的方式。点阵缓存时,首先要根据Form的ID号在缓存中查找到对应的重用Form实例,而后将Form点阵在缓存区的偏移量等信息保存至实例中,便于读取时快速定位。随后生成的每一段的点阵按不同色面存入缓存区,直至拼成完整的Form点阵。对于空白段,不用缓存点阵,只需将每段的起止位置保存起来,在空白段嵌入到输出页面时用来做定位。在后端组装时,逐行从缓存区中读取相对应的重用Form点阵,放置到页面当中去,空白点阵的数据由程序自行生成。
在VDX文件中,每一个对象的大小一般按照版面大小来描述,因此,除了保存重用Form的点阵之外,还必须要保存一份重用Form的Mask点阵。Mask点阵是与Form点阵大小一致的一位点阵,其取值为0或1,取值为0值时,对应Form点阵中的点不绘制到待输出的页面上;取值为1时,则绘制到待输出的页面上。它的存取方式与Form点阵的存取方式一致,但是只缓存一份,即在第一个Form色面生成的时候生成并缓存,其他色面共用该Mask点阵。
一般而言,缓存的重用Form,它的生命期贯穿其PDF文件的整个RIP过程,在PDF文件解释之前,建立起缓存链表,解释完成后,清除缓存链表。但是,可能不同的作业会使用同一个PDF文件,这样如果当前作业完成以后就释放缓存的话,可能会导致下一个作业又要生成一遍Form点阵。此时,上层会在作业传票中设一个标志位,提示是否在需要在作业完成时释放链表资源,如果没有释放,之后的作业就可以直接使用缓存中的点阵了。
本发明实施例对Form管理器操作单元作出了3点优化,以提高光栅化处理的效率,节省内存资源。下面详细说明3点优化。
第一,多个重用Form实例可以共用一个缓存点阵。
共用同一个缓存点阵,是通过关联Form来实现的。所述关联Form,是为了节省内存资源而提出的。重用Form对象用Name Index可以唯一确定,但是同一个Form可能会因为当前的空间变换矩阵CTM的不同而有不同的点阵表现。解释时先对CTM进行分析,对于Name Index和位深度相同、但是CTM的表现不同的两个Form,如果其缩放比例一致,且相对旋转角度为0度或者180度,在缓存时,可以只将一个Form的点阵缓存起来,另一个Form的点阵就不必缓存了,只需写入相关参数,在组装过程中,后者可以跟据其CTM从前者缓存的点阵来计算出它的点阵结果,因此实现多个重用Form实例可以共用一个缓存点阵,这样可以节省很大的内存资源。下文中,前者称为A类型缓存Form对象,后者称为B类型缓存Form对象,前者称为后者的关联Form。注意:这些操作对调用者而言都是透明的。同理,Mask的重用方式也采用类似的方法。
所述B类型缓存Form对象与其所关联的A类型缓存Form对象,相互之间存在的空间关系包括相对旋转角度为180度,或者X、Y方向的平移,或者二者兼有。对于一位数据,由于每一位即表示一个像素,旋转180度需要对每一个字节的位顺序进行反转,为了提高位操作效率,一位点阵不包括旋转的空间关系。
从图2中可见,实例a和c为A类缓存类型,它们将每个重用Form平展后的点阵缓存在内存或硬盘上,链表中每一个节点的Form点阵按顺序分色面保存;Mask点阵单独使用一个缓存空间,将每一个重用Form的Mask点阵顺序存储在其中。实例b为B类缓存类型,其Name Index与实例a相同,CTM的缩放系数与实例a一致,且相对旋转角度为0度或者180度,因此,只保存重用Form的一些相关参数,但并不缓存Form点阵和Mask点阵,其点阵可以从关联实例a的缓存点阵中变换求取。
第二,筛选低效重用Form。
使用重用Form机制的根本目的就是为了提高文件的解释效率,但是对于某些Form,对它们进行重用比一边解释一边组装所花费的时间还多,此类Form称之为低效重用Form。这类Form多是单纯由文本和图形对象所构成的。重用Form机制是将Form解释为一个图像对象,然后将其点阵缓存起来留待后用。对于低效重用Form,在后端,将其图像点阵铺到页面当中,显然不如将文字对象一个个放置到页面当中或将图形对象直接绘制到页面上效率高。页面的分辨率越高,这种效率上的差别越大。
为了把低效重用Form筛选出来,特规定如果不能满足以下任一条件,该Form将被视为低效重用Fom:
a)、Form的Resource词典中含有XObject对象;
b)、Form的Resource词典中含有Shading对象;
c)、Form的Resource词典中含有Pattern对象;
d)、扫描Resource词典中的所有图形状态,确认入口ca/CA/BM/SMask中至少有一个指定了非省缺值。若有一个指定了非缺省值,则有透明对象存在。这些参数的缺省值分别为:ca=CA=1.0,BM=/Normal,SMask=/None。
重用Form如果是低效重用Form,那么它的Name Index将被保存在低效重用Form列表之中;如果待解释的重用Form的Name Index在列表之中,该Form将被视为低效重用Form而跳过。
第三,裁剪重用Form。
VDX文件中的每一个对象的大小,一般是按照整个版面大小来描述的。因此,如果按照版面大小来对重用Form进行缓存,会造成资源上很大的浪费,也会很明显地降低解释的效率。因此,需要根据Mask所标识的实际有效数据的大小对重用Form的点阵进行裁剪,只缓存有用的数据。
重用Form是被作为一个子页面来解释的,采用了分段组装的机制。在每一个分段当中,根据由Mask所得来的实际有效数据的最小外接矩形,来裁剪Form点阵,并将裁剪后的数据作为该段实际缓存的Form点阵。而各个段的实际有效数据的最小外接矩形可能并不一样,需要取整个页面的有效数据最小外接矩形作为重用Form点阵的大小,记录在Form实例当中,而不是取页面大小的值。这样,既减少了缓存中冗余数据的存储,也保证了所有实际有效数据仍在一个边界范围内,便于后端通过计算读取。裁剪后的大小,需要在段组装完毕后进行更新。
图3是本发明实施例中对重用Form点阵的裁剪图,重用Form子页面共分五段。实际有效数据分布在第一、二和四段,粗黑实线边框所围区域为该段所实际缓存的点阵的BBox,虚线边框所围区域为裁剪后重用Form新的BBox大小。由图3可知,经裁剪后的重用Form实际缓存的点阵的BBox大小明显变小很多,既保留了实际有效数据,又减小了内存的资源开销,提高了缓存点阵的效率。
本发明实施例还提供一种光栅化处理的方法,参见图4所示,包括下列主要步骤:
S1、对页面描述文件中符合可重用条件的Form对象进行语法解释,以生成点阵及相关参数,并将该点阵和/或相关参数缓存。
S2、从缓存区中读取相应的点阵和相关参数,并逐行组装待输出的页面点阵。
以下按照先后顺序,对可重用条件、相关参数、重用Form的解释和生成点阵并缓存、读取点阵和相关参数,以及组装逐一进行详述。
所述的可重用条件,是指同时满足以下三个条件:
条件1:Form对象是由转换前的VDX文件中的不变数据生成;
条件2:Form对象的点阵和/或相关参数并未被缓存;
条件3:Form对象不是低效重用Form。
下面详细说明这3个条件的判断方法。
所述条件1可根据VDX转换成PDF文件过程中,对不变数据所添加的标记(一般为Form词典中的一个自定义Key)来进行判断。
所述条件2的判断需要将当前待解释的Form与已被缓存的Form一一进行比较,资源ID、当前空间变换矩阵(CTM)和位深度都一致的,表示当前待解释的Form已被缓存。
所述条件3所指的低效重用Form,是指那些对其进行重用比一边解释一边组装所花费的时间还多的Form,这类Form多是由纯粹的文本或图形对象所构成。
这三个条件必须同时满足,方可对Form对象采用重用处理机制。
下面详细说明可重用Form对象的相关参数。
可重用Form对象的相关参数包括:Form对象的Name Index、CTM、位深度、BBox、色面数、Form点阵和Mask点阵的分段数以及各段的Y方向起止坐标、各段在缓存中的偏移量和大小、空白段标示符,以及关联Form的ID值。
下面详细说明重用Form的语法解释和生成点阵并缓存。
重用Form的语法解释部分以及重用Form子页面的分段组装是在本发明所提及的Form语法解释单元中实现的。需要解释的重用Form,将创建一个新的非物理页面,来生成Form点阵。所述重用的Form指的是一般的Form对象。对于Form字典中Type类型为Group的Form对象,单独按照透明组来进行处理,重用机制并不涉及。
如图5,本发明实施例对重用Form进行解释的步骤如下:
步骤501:定位Form资源;
步骤502:判断该Form实例是否需要重用,若需要重用,转到步骤503;若不需要重用,转到步骤508;
步骤503:在Form管理器操作单元中查找该Form实例;
步骤504:判断在Form管理器操作单元中是否找到该Form实例,若找到,转到步骤512;若没有找到,转到步骤505;
步骤505:在Form管理器操作单元缓存新的重用Form实例;
步骤506:判断该Form实例是否需要缓存点阵,若需要缓存点阵,转到步骤507;若不需要缓存点阵,转到步骤512;
步骤507:在Form解释单元中新建一个Form子页面;
步骤508:解释Form对象;
步骤509:判断Form对象是否需要缓存点阵,若需要缓存点阵,转到步骤510;若不需要缓存点阵,转到步骤512;
步骤510:组装重用Form点阵并缓存;
步骤511:将Form ID和中间指令发送到中间文件;
步骤512:解释结束。
对步骤502进一步说明:
在VDX文件转换到PDF文件后,Form字典中会生成一个自定义的关键字FormRefs,表示该Form被重用的次数。但是,并非所有的定义该关键字的Form都可以被重用,低效重用Form应当被筛选出来,仍走以前的Form解释流程。
对步骤505进一步说明:
在缓存新的重用Form实例之前,需要将重用Form的BBox变换到相对于父页面的坐标,此时,坐标原点应当是在左下角,如需要,应当进行调整。注意:按32位对齐。
在缓存新的重用Form实例之前,如果Form需要缓存点阵,需要重新设置CTM,将父页面的CTM转换到子页面的CTM,从而使得Form坐标经过CTM变换后的坐标,直接相对于子页面的左下角。
在缓存新的重用Form实例之后,如果实例添加成功,则将缓存的当前Form对象指向新加入的实例,而后对该实例的一些参数进行赋值,包括位深度、BBox等。注意:如果页面存在透明,Form是要强制8位生成的,此时,必须要在向管理器中添加新的重用Form实例之前,将相关参数调整,如位深度。
对步骤506进一步说明:
如果重用Form不必缓存点阵,可能会需要按照关联的Form大小进行调整,以保证数据能准确地取出。究其原因,是因为同一个FormBBox经过不同的matrix变换后大小会发生变换,但应当不会超出一线的大小。
在解释Form子页面的过程中,为效率考虑,在组装输出页面的段循环开始之前,开辟两块内存空间用于分别存放从缓存中读取的Mask数据和Form数据。这两块数据区取版面上一个数据行的大小作为其内存空间大小。
对步骤507进一步说明:
将可重用Form作为一个子页面来处理,其组装的过程与Pattern子页面的处理过程相类似。但有两个明显的不同,一是生成Form点阵的同时,还需要生成相应的Mask点阵,并根据实际有效数据的最小外接矩形对两个点阵进行裁剪,将裁剪后所得的点阵缓存;二是Form点阵是分段组装、分段缓存的,由于Form页面比较大,所以需要分段来组装(这里称之为前端组装)。
如图6,重用Form子页面的分段组装方法步骤如下:
步骤601:开始段循环;
步骤602:判断段循环是否结束,如果段循环结束,转到步骤615;如果段循环没有结束,转到步骤603;
步骤603:判断是否先分段后分色面,如果是先分段后分色面,转到步骤605;如果不是先分段后分色面,转到步骤604;
步骤604:判断是否是第一个色面,如果是,转到步骤605;如果不是转到步骤610;
步骤605:判断Mask点阵是否含有效数据,如果是含有效数据,转到步骤606;如果不含有效数据(每点像素的Mask均为零),转到步骤609;
步骤606:根据Mask点阵,计算出当前段的实际有效数据的最小外接矩形;
步骤607:根据上述矩形的大小,对段的Mask点阵进行裁剪;
步骤608:将X方向的大小按照32位对齐,Y方向大小按照16位对齐,将裁剪后的Mask点阵及其信息缓存,转到步骤611;
步骤609:不缓存Mask点阵,只将Mask信息缓存,转到步骤602;
步骤610:不是第一个色面,由于存储Mask的内存空间已被释放,所以需要从缓存中获取当前段缓存的Mask的大小,转到步骤611;
步骤611:判断Form点阵当前段是否为空白段,如果是空白段,转到步骤614;如果不是空白段,转到步骤612;
步骤612:根据上述Mask点阵实际缓存大小,裁剪Form点阵;
步骤613:缓存裁剪之后的Form点阵及段信息,转到步骤602;
步骤614:只缓存与Form相关的段信息,转到步骤602;
步骤615:计算出所有段的实际有效数据的最小外接形,作为该Form的BBox大小,备份原始的Form大小,在后端组装时还会被用到;
步骤616:Form子页面组装结束。
下面详细说明读取点阵和相关参数。
读取过程在本发明实施例的光栅化处理的装置中的Form组装单元中实现。
所述读取点阵和相关参数的步骤包括:从缓存的数据中读取待组装的重用Form实例,如果为A类型缓存Form对象,直接从其实例中读取相应的点阵;如果为B类型缓存Form对象,需要根据其关联Form的ID值,获取关联的Form点阵,而后根据CTM、BBox等相关参数的取值,来计算最终需要绘制的点阵。
下面详细说明组装页面点阵(后端组装)。
重用Form的组装过程,在本发明实施例的光栅化处理的装置中的Form组装单元中实现。
所述后端组装的步骤包括:首先判断当前的页面段是否与重用Form的BBox范围相交,如果相交,计算出相交区域,逐行到缓存区内获得相应的Form点阵和Mask点阵,根据Mask取值以顶层占优的方式将Form点阵放到页面当中;如果待读取的点阵数据行与空白段相交,则该行数据不作处理,保持原有页面的内容不变。
参见图7,详细说明重用Form点阵组装到输出页面的流程,包括下述步骤:
步骤701:从中间文件读取Form ID;
步骤702:定位到Form ID对应的重用Form实例;
步骤703:获取当前Form的BBox,并计算与输出页面组装段的相交区域;
步骤704:如果相交区域不为空,转到步骤705;如果为空,转到步骤715;
步骤705:判断是否先分段后分色面,如果是先分段后分色面,转到步骤707;如果不是先分段后分色面,转到步706;
步骤706:组装色面数为1,转到步骤708;
步骤707:组装色面数为实际所含色面数;
步骤708:判断是否组装各色面完毕,如果组装各色面完毕,转到步骤715;如果组装各色面没有完毕,转到步骤709;
步骤709:更新至当前组装色面的Name Index;
步骤710:保存段背景;
步骤711:判断缓存Form是否为8位,如果是8位,转到步骤712;如果不是8位,转到步骤713;
步骤712:按8位数据组装,转到步骤714;
步骤713:按1位数据组装;
步骤714:实施裁剪,恢复背景,再转到步骤708;
步骤715:结束操作。
为了提高组装的效率,采用按行到缓存区内获得相应的Form点阵和Mask点阵,每一行数据的读取起止坐标必在版面范围内,是Form大小的子集,之后,根据Mask取值以顶层占优的方式将Form点阵数据行放到页面当中。如果待读取的点阵数据行与空白段相交,则该行数据不作处理,保持原有数据内容不变。
与现有的光栅化处理方法相比,本发明实施例提出的技术方案有益效果如下:
一、提高页面点阵的组装效率。在语法解释阶段,对可重用Form预先生成点阵信息并缓存起来;在组装页面阶段,再从缓存中直接读取点阵信息,以顶层占优的方式组装到最终的输出页面,这一过程虽然可能在解释阶段比现有的一次解释过程要多花些时间,但在之后成百上千次的重用组装过程,就简化为一个内存拷贝的过程,无须再次解释;而现有技术对每一个Form对象都是单独解释的。所以将本发明一次解释多次组装所用的时间与现有技术对每一Form对象单独解释并组装的累加时间相比,显然在效率上的提升是非常显著的。
二、降低页面组装过程中所需要的内存开销。如果Form对象内包含透明、Pattern、Shading等对象,若单独解释一次该Form,就需要对其产生的图元信息进行存储,这样,当在同一页面内调用达到一定的次数,内存便会溢出,导致光栅化过程的失败。如果采用了可重用Form的机制,只需要对这些图元信息作一次存储和调用,大大地降低了光栅化过程中所需要的内存资源开销。
综上所述,基于本发明公开的光栅化处理的方法及其装置,采用重用Form机制,使基于可变数据生成的PDF文件在RIP内实现高速解释,提高了光栅化处理的效率,节省了内存资源。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。