具有面向目标的打印接口的操作系统的制作方法

文档序号:6408240阅读:213来源:国知局
专利名称:具有面向目标的打印接口的操作系统的制作方法
技术领域
本发明涉及计算机系统的改进,尤其涉及用于打印图形和文本文件的操作系统软件。本专利申请的部分内容受版权保护,版权拥有人允许专利与商标局对本申请进行复制,但保留其他权利。
现有计算机系统的最主要特性之一是生成可由计算机控制,可视显示以及存储的文本信息或图形的“硬”拷贝。为了实现这一任务,一个计算机系统通常包括与该计算机系统电连接并由其控制以便在一选定介质上生成永久图象的打印设备。常用的打印设备包括点阵打印机,喷墨式打印机,以及激光打印机,它们可以在计算机控制下把图象永久固定在纸张上,虽然纸张是最常用的介质,但象感光胶片之类的其他介质可使用。
为了把显示器上显示或存在存储器中的文件打印出来,有几个操作要进行。首先,由于打印介质通常有一确定尺寸。可打印的信息必须被分成若干部分以使之可与选定介质的大小相吻合,这一处理称之为标页号。此外,信息可能需要从显示或存储的格式被重新格式化成为适于控制打印设备以便在介质上实行执行打印的格式。重新格式化的步骤包括把控制命令插入可打印的信息中以便控制该打印设备。这些加入的命令可以包括例如回车,换行,换格式,空间和字型信息,所有这些把打印信息格式化了,重新格式化也可能包括把一个图形显示转换成打印设备使用的格式的转换步骤。
所需的标页号和重定格式化以便把打印信息转换成可由一给定打印设备打印的格式,这些通常是由计算机系统中运行的软件程序所完成的。在计算机系统中运行的软件程序可分为两大类即特定于一种计算机系统并包括使计算机系统完成基本操作(例如在外围硬盘存储器中存储和检索信息,在相关的视频显示器上显示信息,执行包括生成,命名和重新命名文档的基本文档操作,在某些情况下,执行诊断操作以发现或找出错误)的实用程序集的操作系统。
操作系统本身通常只提供非常基本的功能并必须由“应用程序”实现,该应用程序与操作系统交互可以提供更高级的功能以及与用户的直接交互。在应用程序和操作系统之间交互的过程中,应用程序通常把一系列任务命令送到要执行所请求的任务的操作系统以利用操作系统,例如应用程序可以请求操作系统在计算机硬盘存储器上存储特定信息或在视频显示器上显示信息。


图1是利用应用程序和操作系统的典型计算机系统的示意图,该计算机系统由点划线框100表示,应用程序由点划线框102表示而操作系统由框106表示。应用程序102与操作系统106之间的交互由箭头104指示,该双向程序系统用于许多计算机系统中,其范围涵盖大型机到个人机。
但是,处理打印的方法则各自不同,图1示出了一个现有技术的个人机系统。为提供打印功能,应用程序102与打印机驱动软件110交互(如箭头108所示)。打印机驱动软件110通常与一个应用程序相关联互,在必要时,重新格式化和转换可打印的信息。由于每个打印机都有其自己特定的格式以及控制命令组(它们必需适当地嵌入文本以控制打印机),所以打印机驱动软件110必须专门设计以便与一种或一个打印机合作工作。
打印机驱动软件110产生重新格式的信息流,它包括箭头114所示的嵌入命令。该被转换的信息流依次被送至打印机端口112,该端口112包括把进入的信息流转换成电信号的电路。该信号再由电缆116依次送到打印机118,打印机118通常包括一个“图象机”,这是一个硬件或一个可编程的ROM计算机,它接收进入的信息流并将其转换成需要驱动实际打印单元的电信号。该结果是一个在选定的介质上给出的“硬拷贝”。
虽然图1所示配置通常的工作还算满意,但其有几个缺点,由于打印驱动软件110专用于每种打印机,所以必须为每种打印机提供单独的驱动程序以便与应用程序合作。在个人机中,有很多不同种类的打印机与每种计算机兼容,因此,随着打印机的种类日益增多,用于每个应用程序的打印驱动程序也增加了,以便使程序与大部分打印机兼容。因此,应用程序开发者必须为每个应用程序提供越来越大量的打印机驱动程序,这导致耗时耗力且消耗保持现驱动的程序的硬盘空间,因为就特定用户而言,只有一个或两个驱动程序是对他们有用的。不幸的是,若用户购买了一个应用程序且其不包括可以控制用户所拥有的打印机的打印机驱动程序的话,可能发生不可预测的操作,从而导致退货和用户的不满。
此外,对于每个应用程序而言,有必要提供高级打印功能,例如标页号和页面组合(包括加页边,脚注,图号等等)。结果,每个应用程序开发者必须花时间来开发程序以实现专用于每个程序的常规打印功能,从而导致双倍的工作并浪费时间。
为克服上述困难,修改示于图2中的已有技术的配置。有新配置中,计算机系统200仍由应用程序202与操作系统206一起(如箭头204所示)所控制。但是,图2中所示的操作系统206包括打印机驱动程序214。一个单独的打印机驱动程序仍需提供给每个不同类型的打印机,但打印机驱动程序作为操作系统的一部分一起出售。结果,每个应用程序不必有其自己的打印机驱动程序。例如应用程序202通过一个标准接口210与打印机驱动程序通信。两个常规接口称之为“转接端口(grafports)”或“设备转接”。应用程序202以一标准格式把信息提供(由箭头208所示)给转接端口210,转接端口210把信息传送到打印设备214(如箭头212所示),打印设备214把信息依前述方式重新格式化并转接成为打印机要求的格式,打印机驱动程序214的输出按箭头216所示提供给打印机端口218,它再把该输出转换成电信号,电信号通过电缆220被传送给打印机202。
图2所示配置的优点是在于应用程序开发者无需担心程序将在其上顺序运行而把打印能力提供给应用程序的特定的计算机和打印机组合。但是,其缺点是所需的标页号和页面组合一类的高级打印能力仍需设计到每个应用程序中,从而使程序编码工作量加倍并浪费编程资源。
因此,本发明的一个目的是提供灵活自主的打印接口以便一个应用程序可由一个简单的命令结构提供高级打印能力而无需担心实际的实施细节。
本发明的另一目的是提供一种灵活的打印接口,它可使需要在打印处理上进行细节控制的程序开发者通过一组可由每个应用程序所用但不必一定使用的打印命令实现控制。
本发明的实施例解决上述问题并达到上述目的,该实施例有一面向目标的打印接口,它包括文件分组或页码目标。在例示时,文件成组或页码目标提供完整和灵活的打印能力。这种打印能力是对应用程透明的。打印接口目标包括能够以几种不同方式自动对打印信息编页号的目标,从而提供页面组合(包括加页边,脚注,页号及登录标记以及把文本材料和图形材料相组合)。
本发明的面向目标的打印接口通过一个标准接口(例如一个转接端口)而与操作系统的其余部分通讯,打印机驱动程序被提供用于操作系统中的每种打印机。如此,一个应用程序不仅无需担心与其合作的特定打印机/计算机组合,也不必有固有的文件格式能力。
结合附图对本发明的叙述将会对本发明的目的和优点有更深入的理解。
图1是现有技术计算机系统的框图,其示出了应用程序和操作系统以及打印机驱动程序的关系。
图2是图1所示系统的改进型,它可使应用程序与一标准打印接口交互;图3是一计算机系统(例如个人计算机系统)的示意框图,本发明的面向目标的打印接口即在其上操作;图4是一改型的计算机系统示意框图,其中操作系统包括一个本发明的面向目标的打印接口;图5是信息通道和硬件的示意框图,可印信息是通过中间存储到达打印设备;图6示出了可由应用程序引用的打印接口中的打印目标;图7为一简化的分类层级图,示出了主分类、子分类,以及在一个连续页面页码目标(tiled page folio object)构成中所涉及的相关分类;图8示出了称之为“视图”的可打印信息的布局是如何由本发明的标页号目标分解成为各个“页面尺寸”的;图9是网格系统的示图,该网络系统可加在于一个视图之上以便实现扫描次序排序;图10是一个页组,示出了8个样本“光栅”扫描排序;图11是一方法流程图,该方法用于根据标页号程序目标所用的一个标页号模型而把一个视图标页号成为多个适当大小的页面。
图12是根据标页号程序目标所用的第2个标页号模型把一个视图标页号成为多个有适当尺寸的页面的方法流程图;图13是根据标页号程序目标所用的第三个标页号模型而把一个视图标页号成为多个有适当尺寸的页面的方法流程图;图14A-14C是根据示出的标页号目标所用的三个标页号程序模型的每一个所产生的页面的图示。
图15是以标示为“右下”扫描排序的扫描次序寻找下一页的方法流程图;图16是此示为“左上”扫描排序的扫描次序的寻找下一页的方法流程图;图17是由一个页面重复程序所用的打印例行程序流程图,用于使其以一预选扫描次序迁定第一页以供打印;图18是由页重复程序以一预选扫描次序选定下一页以供打印例行程序流程图;图19是用于打印页码目标的页面的例行程序流程图;图20是一个简化的分类层级图,示出了主分类,子分类以及在构成复合页面页码目标中涉及的相关分类;图22所示出了复合页面页码重复程序用来以一预选扫描次序选择下一页以供打印的打印例行程序流程图;图23示出了一个简化的分类层级图,展示了主分类、子分类以及在构成页面组合程序目标中涉及的相关分类;图24A~24B示出了由n-up页合成程序目标以及页面组合程序目标完成的页面布局;
图25A~25B构成了由一个n-up页面组合程序目标以一预定扫描次序选择第一页面以供打印的打印例行程序流程图的两部分;图26A~26B构成了由一个n-up页面组合程序目标以一预定扫描次序选择一页面供打印的打印例行程序流程图的两部分;图27是由一个u-up页面组合程序目标以一预定扫描次序选择一特定页面供打印例行程序流程图。
图28是由排版顺序程序对用于在一选定页面上进行排版的源文件的下一页进行选择的例行程序流程图;图29是由排版顺序程序对在选定页面上排版的选定的源页面旋转进行选择的例行程序流程图;图30是由一个页面排版程序目标以一选定扫描次序对第一页面进行选择以供打印的打印例行程序流程图;图31是由一个页面排版程序目标以一预定扫描次序选择下一页面以供打印的打印例行程序流程图;以及图32是由一个页面排版程序目标以一预定扫描次序选择一特定页面以供打印的打印例行程序流程图。
本发明最好用作IBM的PS/2或苹单公司Macintosh之类的个人机中的操作系统。图3示出了典型的硬件环境,它说明了本发明的计算机300的典型硬件配置。计算机300由中央处理单元302控制,它可以是常规的微处理器;多个其它单元通过系统总线308内连以实现特定的任务。虽然一个特定计算机只有图3所示的那些单元的某些部分或其他未示出的部件,但大部分计算机至少包括示出的这些单元。
具体而言,图3的计算机包括一个用于永久存储计算机的配置和基本操作命令的ROM304,一个暂时存贮信息的RAM306,以及用于把外围设备,例如硬盘313和打印机314通过电缆312和315分别连到总线308的I/O适配器310。用户接口适配器用于把输入设备(例如键盘320)以及其它未示出的接口设备(包括鼠标器、喇叭和麦克风)连到总线308。与总线308相连的显示适配器318把视频输出送至显示设备322(例如一个视频监视器)。该工作现有Apple Sys-tem/l操作系统之类的操作系统软件并由其控制和协调。
在最佳实施例中,是由采用面向目标的编程技术的C++编程语言实现本发明的。C++是一种编译的语言,即,程序是以人类可读的文稿写成,且该文稿然后提供给称为编译程序的另一程序,它生成可被计算机装入并直接执行的机器可读数字吗。如下所述,C++语言有某些特性,可使软件开发者轻易地使用他人编写的程序而依然对程序的再使用提供很大控制以防止其被破坏或不当使用,C++语言已为人知且许多文章和论述都对其进行了详细叙述。此外,C++编译程序已由若干厂家提供,包括Borland国际公司以及微软公司。因此,C++语言的细节及C++编译程序的操作在此不再赘述。
如本领域技术人员所知,面向目标的编程(OOP)技术涉及对“目标”的定义,生成,使用和破坏。这些目标是软件实体,它们包括数据元素和例行程序,或功能,用于管理数据元素、数据和相关功能被软件当作是一个实体且可被生成,使用和消除,如果它们是一个单独项的话。数据和功能一起根据其特性而把目标成型为任意现实社会中的实体,它们可由数据元素以及其行为(由其数据元素表示)所表示。以这种方式,目标可以成型具体事物,比如人或计算机,而且他们亦可成型为数码或几何设计之类的抽象概念。
通过生成“分类”来定义目标,分类本身不是目标,但其作为样本指示编译程序如何构成实际目的。一个分类可以指定例如数据变量的数目和类型以及控制数据的功能所涉及的步骤。通过称为构成程序的特定功能而在程序中实际地生成目标,该构成程序使用相应的分类定义及附加信息(例如在目标生成过程中的自变量)来构成该目标。类似地,由一称为破坏程序的特定功能破坏目标,通过使用其数据调用用其功能即可使用目标。
面向目标的编程技术的好处主要来自于三个基本原理封装,多形性和继承,具体而言,目标可被设计以隐藏或封装所有或部分内部数据结构以及内部功能尤其是在程序设计过程中,开发者可以定义目标,其中所有和某些数据变量以及所有或某些相关功能被认为是“私有的”或只由目标本身使用。其它数据和功能可为“公共”或由其它程序所用。其他程序对私有变量进行的访问可由为一个目算定义的公共功能所控制。这些公共功能可对目标的私有数据进行访问。公共功能在私有数据和“外界”之间形成了受控和一致的接口,任何书写直接访问私有变量的程序码的企图会导致编译程序在程序编译过程中产生错误,该错误则停止编译处理并防止程序开始运行。
多形性允许目标和功能(它们有全部相同的格式但与不同数据工作)有不同的功以产生一致结果。例如,加功能可被定义为变量A加变量B(A+B)而且这一相同的格式可被使用,无论A和B是数字,字符或币值。但是,执行这一相加的实际程序码可以大不相同,取决于包括A和B的变量类型。多形性允许写三种单独的功能定义,一种用于每类变量(数字,字符和币值)。在功能已定义之后,程序可在稍后由其常规格式(A+B)引用该加法功能,而且,在编译过程中,C++编译程序通过检查变量类型确定三个功能中哪个被实际使用。该编译程序然后将取代适当的功能码。多形性允许产生相似的结果的类似功能在程序源码中“成组”,以产生更逻辑和清楚的程序流程。
进行面向目标编程的第三个原理是继承,它允许程序开发者易于再使用以前的程序并避免由擦除生成软件。继承的原理使软件开发者说明相关的分类(以及由其稍后生成的目标)。具体地,分类可指定为其他主分类的子分类。一个子分类“继承”并已访问了其主分类的所有公共功能,只要这些功能出现在子分类中,另外,一个子分类可以置换某些或全部继承的功能或可能通过只是由相同格式定义一个新功能的方式对某些或全部继承的功能进行修改。(置换或修改并不改变主分类的功能,而只是修改子分类中功能的使用),生成的新的子分类具有其他分类的某些功能(通过选择性修改),从而允许软件开发者易于对现有码进行定制以满足其特定需求。
虽然面向目标的编程提供了优于其他编程概念的显著改进,程序开发仍需大量时间和工作,尤其是现有软件程序不适于修改的情况下。结果,先有技术向程序开发者提供了一组预先定义的内连分类,它们生成一组目标及其他杂项例行程序,这些例行程序在一特定环境下用于执行常规任务。这类预先定义的分类和程序通常标为“应用程序结构applica-tion framework”并主要提供用于一个工作应用的预制结构。
例如,用于同户接口的应用程序结构可以提供一组预定义的图形接口目标,它们用于生成视窗,滚动条,选项屏等等,并为图形接口目标提供支持和“预置”行为。由于应用程序结构基于面向目标的技术,预定义分类可用作主分类而且固有预置行为可由开发者定义的子分类继承,修改,或替换以使开发者扩展该结构并在特定的专家领域生成定制的方案,这种面向目标的方案可以提供大大优于常规编程的好处,其原因在于程序员不仅不改变原始程序,还可扩展原始程序的能力。此外,开发者不再盲目地通过编码层级工作,因为结构提供了体系结构指南和模型,并在同时使开发者不再提供只对问题范畴唯一的特定行为。
根据涉及的系统级及要解决的问题类别,可以有许多种适用的应用程序结构,结构的种类涵盖协助开发用户接口的高级应用程序结构及提供基本系统软件服务(例如通讯、打印、文档系统支持,图形等)的低级结构。应用程序结构的商用产品包括MacApp(Apple),Bedrock(Symantec),OWL(Bor-land),NeXT Step App Kit(NeXT)以及Smalltalk-80MVC(ParcPlace)。
虽然应用程序结构方式利用了目标层级中的封装,多形性和继承原理,并且是在其他编程技术上的一大改进,但其仍有困难提出,这些困难是由这一事实引起的,即开发者易于再使用他们自己的目标,却难于使用由其他程序生成的目标,进而,应用程序结构通常包括至少一个在一单一操作系统上的“层级”,并且甚至具有目标层级的灵活性,但其仍需通过笨拙的过程调用以直接与操作系统交互。
以与应用程序结构向开发者提供应用程序的预置功能性相同的方式,一个系统结构(例如包括在一个最佳实施例中的结构)可以提供用于系统级服务的预置功能性,该系统级服务可由开发者修改或置换以生成定制的方案,从而避免先有技术应用程序结构编程中所必需的笨拙的过程调用。例如,考虑一个可以提供用于由一应用程序生成的可打印信息的自动标页号,预打印处理以及页面排版的基础的打印结构。一个需要这些能力的应用程序软件开发者通常必须写特定例行程序以提供这些功能。而借助于结构来提供这些功能时,开发者只需提供最终输出的行为和特性,而结构会提供执行这些任务的实际例行子程序。
一个最佳实施例采用结构的概念并将其用于整个系统,包括应用和操作系统。对于商用和公司开发者,系统集成者,或原设备制造商而言,这意味着象MacApp一类的结构所展示的所有优点可以不仅影响文本和用户接口之类的事物的应用级,还可影响用于服务(例如打印,图形,多媒体,文档系统,I/O及测试等)的系统级。
图4示出了利用本发明的面向目标的打印接口的计算机系统示意图。该计算机系统由点划线线框400表示,应用程序402和操作系统406提供用于控制和协调计算机的操作。应用程序402与操作系统406按箭头404所示进行通信。但是,根据本发明的最佳实施例,应用程序402不是直接与转接端口410之类的标准接口通信,而是在希望打印信息时在较高级与操作系统406通讯。这一交互是通过提供如框424所示的一个面向目标的打印接口来实现的。正如以下将详细讨论的,打印接口424响应应用程序402生成一系列简单命令以执行各种格式化和标页号功能。格式化的可打印信息然后按箭头426所示传送给转接端口410。可以让应用程序402按先有技术设置的那样与转接端口410直接通信。但是,并非大部分应用程序都将如此,除非需要特殊过程。
在任何情况下,信息通过转接端口410,如箭头412所示,然后提供给打印机处理程序414。打印机处理程序414与前述打印机驱动程序类似。但是,它是“智能”的并提供一些以后即将叙述的附加能力。基本上,打印机处理程序414对箭头412所示的输入数据进行处理,并加入必要的打印机命令以控制相关的打印机(由422表示),重新格式化后的数据按箭头416所示提供给打印机端口418,它把数据转换成电信号,然后电信号再经电缆420传送到打印机422。
有关由打印接口424产生的文件传送到打印机422的实际过程由图5更详细地说明。具体地说,打印接口424(以后将详述)产生一个称之为文件页码(图5中示为文件页码500)的实体。该文件页码可包括文本、图形或其组合,所有它们按应用程序指定的方式被格式化和设置。文件页码信息按箭头512所示提供给打印通道502。打印通道是一个目标,它能生成以把信息传递给一个适当的打印机,打印通道使用一个打印作业描述以及一个打印机标识,它们由应用程序提供以便把可打印信息传给适当打印机。
更具体而言,在打印通道502接收一个打印作业后,它把可打印信息按箭头514所示传到一个假脱机程序518,假脱机程序518按进入顺序接收信息流并将其存在中间存储位置522,如箭头520所示。打印通道502然后通过链接504而把一个通告送到打印服务器程序506,该通告通知打印服务器程序506有一个新的打印作业存在,打印服务器程序506是标准程序,它监测所有生成的打印作业并检查适用的打印机以确定其状态。
一旦打印机作业已完全解脱机或已存在中间存储器522中,打印服务器506就通过链接508通知打印机处理程序510。打印机处理程序510是一种打印机驱动程序,它控制和驱动特定的打印机,其目的是把文本和图形信息转换成任何特定类型打印机可读的打印机格式。通常,打印机处理程序只能处理一个打印作业而任何被生成和去往相关打印机的其他作业被排队以等候处理。打印机处理程序包括一个去除假脱机程序(由框516所示),它从中间存储器522中捡出脱机数据(如箭头524所示)并由箭头526所示方向把信息供给图象机532。图象机532再把输入数据流转换成用于驱动打印文件以生成最终打印文件的命令信号。如箭头430所示,命令被供给实际的打印机设备528以供打印。
一旦打印作业完成之后,打印处理程序510检查其排序以找到另一打印作业。若一作业出现,则开始处理该作业。替换之,若无新的打印作业要处理,则打印机处理程序变成无效。在一特定打印作业完成之后,存在中间存储器522中的信息被删除且重新请求存储。
以下将详述在打印前保留有格式化打印信息的文件包的准备。如图6所示,应用程序600通过四个主要的打印目标604~610而与本发明的打印接口602交互。这些预定义的目标是由需要的应用程序生成并在可打印信息上执行特定的操作以便以许多不同方式将信息标页号,组合文本和图形并执行打印预处理,包括格式和尺寸的改变以及加上页号和页边之类的装饰。
虽然下面将对四个主要打印目标的操作进行叙述,但通常每个目标都从应用程序接收对一个“视图”的说明,该视图标识可打印的信息。如此所述,“视图”被定义为一个包含打印信息的矩形区域。这些打印信息包括文本,图形,文本和图形的组合,位映象区或任何可在打印机上打印的其他信息。在这方面,视图更象存在计算机存储器中的信息,而不象在计算机显示终端上显示的信息。例如,一个视图可以包括字处理文件中的所有文本信息,尽管在字处理程序的操作中,文本信息被分为若干部分以供观察。替换之,一个视图可包括由绘图程序(例如APPLE MacDraw程序)生成的大图形区域。
一个视图是由对应于矩形左上角的x、y坐标以及对应可矩形右下角的x、y坐标所限定的一个矩形区域所确定的。图6所示的四个打印目标涵盖了对视图标页号并构成页码的四种不同方式。例如,连续页页码目标604以与MacDraw程序或展开页程序类似的方式进行相应标页号,在展开页程序中,视图被分成多个没有交错间隔的连续页面。在使用该目标时,应用程序要么指定全部页面总数并保留一定页边作为其余部分以涵盖整个视图区域,要么指定视图边缘处的部分页面,页边可以独立设置。
图6中的书籍页面页码606所表示的目标与连续页面页码604类似,其不同之处只在于指定的页面是全部页面,且每页面之间有间隔。由这一模式执行的标页号与典型字处理程序执行的模式相似。典型字处理程序包括MacWrite,其中,打印信息被分成“若干页面”。每页面都有其自己的页边或边界。因此,这种模式被称之为“MacWrite”模式。
图6所示的复合页面页码目标608可为应用程序用于生成其他类型的页面页码集。在这方面,它象一个页队列一样动作,其他页面页码可加至其中并从其中去除。此外,它可接收其他复合页面页码,它尤其有用于合并不同类型的页面页码,例如,连续页面页码目标可以将书籍页面页码目标合并作为一个整体打印。
由页面排版程序目标610规定的最后一个打印目标,作为用于规则打印文件的预打印处理程序;在上下文中的排版等同于取出一个现有页面页码,将其挪开,重新对其安排并将其与一新格式,新尺寸,新联结以及可供选择的某些装饰(例如页数或边界)一起推回。排版是一个任选处理,它可在任何其他类型的页面页码上执行而页面排版目标可用于任意页码目标和其他页面排版目标,以便页面排版程序可通过由每个页面排版程序把一个特定装饰或修改加到信息的方式而嵌套至任意深度。最后,页面排版程序目标可被打印,但其无法在没有标志的情况下打印,即其必须有其他可打印的东西,在这方面,它非常象一个迭代程序。本发明的打印接口包括许多不同种类的页面排版程序,例如生成排版配置和n-up打印的排版程序。
如前所述,图6所示的每个目标包括数据和在数据上操作的功能,为理解每个目标的操作,有必要看一下目标及某些主要功能例行程序的构成,这些例行子程序包括目标的行为,在审视目标时,对用于构成目标的分类进行检查是很有用的,如前所述,这些分类作为构成目标的属性单元。如此,分类和每个分类中的功能的关系可用于指出构成目标的行为。
连续页面页码目标图7示出了连续页面页码目标604的简化分类层级图。它示出了用于构成连续页面页码目标的某些分类。尤其是,用于构成连续页面页码目标的分类712是两个主分类(包括页面页码分类700和标页号程序分类702)的子分类。因此,当由应用程序生成一个连续页面页码目标(通过调用其构成程序)时,主目标下的构成程序亦将被调用以便构成并有选择地初始化该主目标。主目标因此被构成而没有应用程序的直接参与。
页面页码分类700是打印系统中文件的一个抽象表述并可能认作是一个顺序页面集,它在打印时以某种逻辑次序展现在读者面前,正如此后将叙述的,被打印页面的次序实际是由一个叫做页面迭代程序的目标建立的;由分类700构成的页面页码目标只作为组合或收集这些页面。一个页面页码目标有可以生成一个页面迭代程序目标的固有功能,该迭代程序可以在页面页码的页面上重复执行。页面页码目标还包括可以打印页码目标一部分页面的功能。但是当页面页码目标打印页码目标的页面时,整个页面组被打印出来。若不想打印整个页面组,则须生成分离的页面迭代程序目标以及用于打印那些页面的迭代程序目标中的打印功能。
连续页面页码目标712也从生成它的应用程序中接收其他许多参数。它们包括如管理物理页面尺寸及该页面上的打印面积(某些打印机不能打印整页)之类的参数的页说明目标710。其它可提供的参数是一个页面有效区目标(未示出),若该“有效“区小于打印区的话。
由页面页码分类而来的标页号程序主分类702从子分类中接收页面说明目标710并利用该页面说明参数把由应用程序生成的视图分为一组页面或一个“标页号”的视图。一个标页号的视图可表示一单独页面,它有通常的页边,间隔以及偏移或其可表示具有同一尺寸并以类似栅格结构组合成的同样配置的许多页面。这些页面可被认为是在延伸矩形(视图的区域)上截断的边界,或视为形成一个大的全视图的子视图。
如此后将详述的,标页号程序目标构成程序是多形的,并且根据在目标生成期间送到构成程序的参数类型,一个标页号程序目标可被构成,从而用连续模式、书籍模式或一个n-up模式将延长的矩形标页号。
说标页号程序有一个相关的标页号程序迭代程序目标,如框704所示,该目标用于根据一个“网格”模式、一个扫描排序和一个网格范围(它们将在以后进行叙述)对每个页面进行迭代处理,更具体而言,顺序页面的次序可由应用程序通过把一个扫描次序说明送到连续页面页码目标712的方式而予以确定。该扫描排序说明被依次用于生成一个扫描排序目标706用于控制被引用页面的排序。此外,页面范围说明可由页面范围目标716送到页面迭代程序目标714。由于页面迭代程序目标714是标页码程序迭代程序704的子分类,所以在页面迭代程序目标被构成时就构成了标页号程序迭代程序目标。
页面范围目标716由页面迭代目标714用来确定是否要打印一个特定页面,即要将该页面包括在迭代中还是跳过该页。页面范围目标716返回关于一选定页面范围的基本信息,而该范围是由一组包含在该范围内的页面积限定的,而该范围是由一组包括在该范围内的页面所限定的。在这一范围内的一个特定页面由其页号选定,且在该范围内的这些页面通常形成了在整个文件中的页面子集。该页面范围目标包括可用于询问该范围以确定该范围中的页面的多个功能,这些功能包括以下(为简便起见略去了变量)IsEmpty();IsFull();IsPageInRange();IsPageInRangeAndAdjustOffset();GetPageCountInRange();GetFirstPageInRange();GetLastPageInRange();IsEmpty 26能返回一个布尔值,指示是否该范围为空,即是否文件的任意页面在该范围中。类似地,IsFull功能返回一个值,指示是否文件中所有页面都在该范围中。这两个功能提供了快速检测,快速检测被设计用于避免分析整个范围以确定是否有任一或所有页被包含。IsPageInRange功能返回以指示是否有一特定页面在该范围中。IsPageInRange-AndAdjustOffset功能做同样工作,但返回在该范围中上至一特定页面的页面的数量。GetPageCountInRange返回该范围选择的页面的总数(它可以多于或少于一个文件中的页面数量)。GetFirstPageInRange返回范围中第一页的数码,而Get-LastPageInRange返回该范围中最后一个页面的数码。
这包括的是可用于改变范围内选定页面并允许在该范围内随意选择任何页面组的多个功能。这些功能包括下列(为简便略去变量)SetRange();Union();Intersection();Difference();Xor();Not();SetRangeEmpty();SetRangeFull();SetRange功能允许范围被设置以包括在另一页面范围中指定的页面。例如,可设置范围以包括所有偶数或奇数页面,其方式是通过设置该范围至另一选择偶数或奇数页面的范围。Union功能把在两个单独的页面范围选择的页面组合到一起。类似地,Intersection功能只选择位于两个范围之中的那些页面。Difference功能则删除或不选指定页面。Xor功能选择两个范围的异或页面。而Not功能则选择所有当前未被选择的页面,SetRangeEmpty功能和SetRangeFull功能只把范围设置为空(无页面被选择)或全满(所有页面被选择)。
当页面迭代程序目标714由其后通过连续页面页码目标712中的“CreatIterator”功能所叙述的方式生成时,前述功能适用于应用程序。
标页号程序目标702的操作及其标页号迭代程序704可参照通过把一个视图标页码成为四个页面的图8而加以理解。尤其是一应用程序生成文件800,该文件包括一个视图802,虽然视图802示为文件的一部分,但实际上它可包含整个文件并可包括文本,图形,或二者之组合,标页号处理把视图802分为页面大小的部分。尤其是该标页码程序在可以包括整个视图或部分视图的延伸矩形808上操作。该延伸的矩形由其x方向的延伸和y方向的延伸所确定。页面尺寸,如矩形814所示的,也可由其x和y的延伸确定。用于标页号的页面尺寸可以是实际页面的尺寸,可打印矩形页面尺寸或其他指定的矩形尺寸。在所示的特定示例中,页面由垂直间隔812和水平间隔818所隔开,这两个间隔的宽度不同,其垂直和水平页边810和816的宽度是任选的。
为方便起见,通过在将页码延伸矩形的位置(即由左上角的x、y坐标)可以对多个单独页面进行引用或寻址。例如页面822由左上角806的x、y坐标寻址。同样重要的是用于标页号处理的左上部偏移804的x和y坐标以及右底部偏移820的坐标。
一个标页号程序迭代程序目标的基本部件是一个二维网格,例如图9所示的网格900。为了把一个视图标页号,这样的一个网格被叠加在一个视图上,且每个网格单元或网格部件对应于一个页面。为标示的目的,每个单元有一个在网格中标志其位置的坐标地址。在示出的标页码程序迭代程序目标中,相关的网格的x和y坐标地址为(0,0),它相应于顶部左上角中的网格单元。正图9所示,x坐标在左上角起始于零并沿向下方向增加。如此,一个任选网格单元,例如单元902的网格坐标地址为(6,3)。此外,该网格有一由x方向的单元总数和y方向的单元总数确定的总尺寸;如此一来,图9所示网格的网格尺寸为(11,8),指示出在X方向有11个单元而在y方向有8个单元。
网格单元也可以顺序标号为从0到n-1以保持与坐标标志法的一致性,这里n为单元总数且由x网格尺寸乘以y网格尺寸得出。但是,分配给网格尺寸乘以y网格尺寸所得分。但是,分配给网格中每个单元的部件号取决于分配数码的次序以及数码的起始位置,许多方法可用来排序。例如,可从网格的左上角开始并沿X方向顺序把单元编号直到达到右上角为止。然后,移下一行且从网格的左边开始沿x方向编号直到再次到达右边时为止,就这样从上到下逐行移动。次序的选择称为“光栅”排序,因为它与在电视或显示屏上展示一个图象的顺序相类似。该排序过程由图10中的框1000所示,并被称为“右下”光栅排序,因为该排序首先去往右边然后而下。当然,也可以在不同位置处开始并向不同方向推进行获取多个其他的光栅排序。将所有可能的组合相结合便提供了图10所示的8种不同排序。这些排序根据框1000所用规则而命名于表1中。表1
也可以其他排序对网格单元排序,这些排序包括随机排序,旋转排序,螺旋排序,以及档板排序等等。但是,为了简化讨论,上列8个排序用于其后的讨论。
网格范围目标708包括一个二维项目集,可用于表示在一个网格格式中标号和设置的任意项目集。这一概念与位映象图象中所用概念和区域类似,这些区域可由Quick Draw(Apple‰)之类的绘图程序的限定。正如前述的页面范围目标716,网格范围目标708可包括多个可以询问网格范围和返回有关包含项目的信息的功能。例如,这些功能包括(为简便而略去变量)
Contains();IsEmpty();IsFull();GetItemCountInRange();GetBounds();Contains功能在一个指定项目的网格坐标位于网格范围内时返回一个真值。IsEmpty在范围为空或没有项目指定时返回一个真值。类似地,IsFull功能在至少在该范围中会有一个项目时返回一个真值。GetItemCountInRange以及Get-Bounds功能计算并返回在该范围内的所有项目的总数。
还有改变范围结构的功能,例如下面这些SetRange();SetRangeEmpty();SetRangeFull();Union();Intersection();Difference();Xor();abt();SetRange功能可用于随机地把网格范围设置成一个矩形区域,该区域包含一个“起始”(from)点到一个“终止(to)”点。换言之,选择的区域是半开的[from,to)。“起始”是包含在区域中而“终止”点则不在其中,虽然“起始”和“终止”点可指示该矩形区域的任意两个相对角落,围绕的区域总是从左上角半开到右下角。其结果,所有下列范围说明是等同的“起始(from)” “终止(to)”(0,0) (1,1)(1,1) (0,0)(0,1) (1,0)(1,0) (0,1)而且所有上述范围包含元素(0,0)。以这种方式指定范围的目的要空白区可被“from=to”之类的语句所迅速标识。这种指定范围方式被用于并前述功能中并为标页号程序迭代程序目标用来选择标页号的页面。
借助于网格、单元排序以及网格范围的概念,可对标页号程序目标进行详细解释。如前所述,标页号程序目标被构成为连续页面页码目标的主分类,而且生成的标页号程序目标类别的由从连续页面页码目标到标页号目标构成程序所通过的变量所确定的。当构成时,标页号程序目标包括多个内部(或私有)的变量,它们包括网格尺寸,延伸的矩形的尺寸,页面尺寸,顶部左偏移坐标,底部右偏移坐标,垂直和水平间隔尺寸以及两个布尔变量,其中之一用于指定是否标页号包括全部或整个页面,或是否部分页面可以出现在右边和底部边界;而另一布尔变量则指示是否延伸的矩形被认为是固定的。
用于计算延伸矩形的页面数量以及间隔和偏移设置的公式必须满足下列基本关系延伸=顶部左偏移+底部右偏移+n*(页面尺寸+间隔)—间隔这里,n表示指定在x和y方向上延伸区域中所包含的页面数量一对的数字,且n大于或等于(1,1)。可以把上述公式理解成实际上是一个二维矢量公式且每一变量实际包括两个数字。例如,所述的延伸实际上由指示在x和y方向上的延伸的两个数字构成。类似地,顶部左偏移是一个两个数字变量,指示延伸长方形左上角的x和y坐标值。
有三种用于展示标页号程序目标的标页号模型;第一种(由连续页面页码目标使用)使用一个固定长度的长方形,它的长度固定而与页面尺寸的改变无关。这一模型被称为“MacDraw”模型并要求标页号程序接收来自连续页面页码目标的页面尺寸,延伸,顶部左偏移,底部右偏移以及间隔参数。然后标页号程序计算页面频率或在x和y方向上的页面数量(等于网格尺寸)。由标页号程序用于计算页面频率或等效地网格尺寸的示例程序示于图11中,该程序始于步骤1100并去往1102,在该处,指示长度固定的变量被设为TRUE。然后,在步骤1104处根据公式计算一个中间“页面程序”变量页面程序=(长度-顶部左偏移-底部右偏移+间隔)/(页面尺寸+间隔)在计算出页面程序变量之后,网格尺寸的x和y分量设为页面程序变量的X和y分量,如步骤1106所示。最后,底部右偏移被复位。在这一模型中,底部右偏移度要处理成更象一个指南而非一个抽象参数,该底部右偏移还在修改延长的长方形时吸收“空余的部分”。底部右偏移根据下式进行再计算底部右偏侈=长度-顶部左偏移-[网格尺寸*(页面尺寸+间隔)]+间隔如步骤1108所示,例行程序然后在步骤110结束。
由标页号程序目标的所用的另两个模型构成了其他页面页码目标中标页号的基码。例如,另一标页号模型是一灵活的模型,它有一个全面延伸的矩形尺寸,该尺寸可相对页面变化进行调整;多余的页面或页面的行可加至该模型以增加整个矩形的长度。后一模型被称之为“MacWrite”模型,它与一个常规字处理程序产生的输出类似。第三个模型是一个可变n-up页面模型,其中一个子页面尺寸根据页面频率和整个延伸的矩形尺寸进行计算。然后在一个整页面上安排子页面。虽然后两种模型可不用于现在讨论的连续页面页码目标,但它们包括于此以便提供完整的标页号程序模型。
图12和13展示了后两个标页号模型的计算。参见图12,其示出了在固定阵列或“MacWrite”模型中涉及的计算。在这一模型中,标页号程序接收由来自相应的页面页码目标的页面频率,页面尺寸、顶部左偏移,底部右编移以及间隔所确定的页面数并计算延伸矩形。在计算中采用的起始于步骤1200并去往计算步骤1202。该步骤采用以下公式延长=顶部左偏移-间隔+(网格尺寸*(页面尺寸+间隔)程序结束于步骤1204。
其余使用n-up页面模型的标页号程序需要标页号程序接收来自相关页面页码目标的延伸的矩形尺寸,页面频率,顶部左偏移,底部右偏移以及间隔,并计算页面尺寸,图13所示例行程序始于步骤1300并在步骤1302处由下式进行计算页面尺寸=(延长-顶部左偏移+底部右偏移+间隔)/(网格尺寸)-间隔这里,网格尺寸包括两数字数码,指定在X方向的网格单元数和y方向上的网格单元数,然后例行程序在1304处结束。
图14A-14C中示出了不同标页号例行程序产生的输出中的不同。图14A示出了由“MacDraw”模型执行的标页号,其中,固定尺寸的延伸矩形1402被分解为一样大小的连续页面1400。在右边的页边1404和底部页边1406可能是不完全页,而且通常在页之间是没有间隔的。
替换之,图14B示出了MacWrite标页号程序的输出。它与MacDraw标页号程序类似,其不同之处只在于标页号的页面1408和1410一般而言是整个页面但在页面之间具有水平和垂直间隔。页面的新行或列可轻易地加入以便沿x或y方向扩展该阵列。
图14C示出了n-up标页号模型的输出。所示模型是一个4-up模型,虽然标页号可以随意扩展到任意多。在本例中,模型的每个页面包括在页面上依序排列的四个子页,当然,任意数量的子页可包括在标页号程序生成的每个页面上。
将页号序迭代程序704按照内部生成或由应用程序提供的排序而通过页面迭代程序714将页面排序。在标页号的视图中的页面根据其在视图中的位置使用上述网格特性被标号。除非已由应用程序设置或由标页号程序本身设置,系统预置的页面标号按“右下”光栅排序(图10中的框1000)依次标号。内部指定的页面标号是起始于零的主要标号并无需表示由应用程序赋予的页面标号或由一特定选代产生的实际打印排序,它们仅仅是用于引用页面的内部标号。
除了内部面页标号之外,可由位于标页号程序扩展矩形中各个页面的位置对各个页面寻址,即用每页左上角的坐标位置。应用程序可通过网格坐标,标页号程序网格,页面坐标,视图坐标或内部页面标号来引用任意页面的选择。页面坐标取决于应用程序指定的页边和间隔设置,而页面标号和网格坐标则不然。
标页号程序迭代程序704的功能是要根据由应用程序提供的扫描排序或系统预置的扫描排序和用于该标页号程序的任选范围对标页号程序的页面进行分析。该迭代处理实际上始于应用程序生成页面迭代程序714之时,该生成是由在连续页面页码目标中调用称之为“CreatIterator”的功能而实现的。由于页面迭代程序714是标页号程序迭代程序704的子分类,标页号程序迭代程序也在生成页面迭代程序时被生成。
扫描排序是由定义图10所示的8个扫描排序之一的单独分类区并在根据应用程序选择的迭代过程中的分类之一中生成一个扫描排序目标的方式而处理的。这8个扫描排序分类相应于表1中所列的每一扫描排序的命名而予命名。每个扫描排序也在构成标页号程序迭代程序704时分配到一个从0~7的随机数,它包括了指示选定的扫描排序的变量。该变量被初始化为零,从而导致生成一个扫描排序目标,其作用是对扫描进行“右下”排序。
利用在页面迭代程序714中的固有功能AdoptScanOrder,应用程序可改变扫描排序。响应于AdoptScanOrder功能,页面迭代程序714送出一改变扫描排序请求纥标页号程序迭代程序714,这是通过在标页号选代程序中调用“AdoptScanOrder”功能而实现的。后一功能导致标页号程序迭代程序中的扫描排序被设置成一个新的扫描排序。与之响应,一新的扫描排序目标被生成。
每个扫描排序目标包括在网格单元上扫描的若干功能。在扫描排序目标中最重要的功能之一是SeekNext功能,它接收当前页面的网格坐标并以选定的扫描排序返回下一页面的网格坐标。SeekNext例行程序当然与每个扫描排序目标不同,以便使每个目标行为不同。另一重要功能是用应用程序通过的参数而来的标页号程序目标计算的网格尺寸来确定x和y方向上的网格边界。
图15示出了“右下”扫描排序目标(系统预置排序)的SeekNext功能该功能接收一个初始输入坐标,该坐标指示当前页面网格坐标。它将坐标值复位为下一页面的网格坐标并返回一个TRUE值或FALSE值,以指示是否扫描排序中的下一页面是在选定的页面范围之内。正如其后所解释的,返回值被用于确定是否在打印处理期间达到了打印范围的终端。
具体地说,SeekNext例行程序起始于步骤1500并去往判别框1502,在其中,输入网格坐标被检测以确定是否选中的单元位于网格边界之内。如上所述,网格边界是由页面频率或由标页号程序目标计算的网格尺寸确定的。若选择的单元不在网格边界内,错误条件被指示且一FALSE值在步骤1518处返回,然后例行程序结束于步骤1516。替换之,若输入坐标位于网格边界内,例行程序去往步骤1504,在该处,X网格坐标被增值,从而使选择的网格单元向右移动一个空间。
在判别框1506处,新的X坐标被检查以确定其是否超过X网格边界。若没有,则在扫描排序中的下一页面的坐标已被发现而且例行程序在步骤1514处返回一个TRUE值并在1516处结束。
替换之,若新的x坐标位于x栅格边界处,则扫描次序必须返回到下一行的开始。所以,在步骤1508,y坐标增值,使所选择的单元移向下一行。在步骤1510中检查新的y坐标以确定它是否小于y栅格边界。如果是,x坐标设置为零,以指示扫描次序在一个新的行上开始,步骤1512。TRUE的返回值在步骤1514返回,在1516程序终止。
替换之,若新的y坐标位于y网格边界之外,则网格范围的端部已经达到,且一个FALSE值在步骤1518处返回且例行程序结束于步骤1516之处。
如前所述,SeekNext例行程序只对“右下”扫描排序目标有效,且例行程序将与每个扫描排序目标不同。另一“左下左”扫描排序目标(相应于图10中的框1002)的示例程序示于图16中,其中的扫描排序例行程序与图15中的右下扫描排序结构相当类似,不同之处仅在于x和y坐标的增量排序不同。具体地说左下例行程序始于步骤1600可去往判别步骤1602,其中,输入坐标被检测以确定是否位于网格边界之中。若不是,一个FALSE值在步骤1618处返回且例行程序结束于步骤1616处。
替换之,若输入坐标位于边界之内,则在1604处时y坐值增值,从而实现下移一行。在步骤1606中,检查相对y网格边界的y值以确定是否y坐标已超出网格边界。若没有,则扫描排序中的下一页面已被确定且例行程序去往步骤1614,在该处返回一个TRUE值并结束于步骤1616处。
反之,若y坐标已达到或超出了y网格边界,则X坐标在步骤1608处减值,从而把选定的页面以扫描排序向左移一个位置。在步骤1610中,新的X坐标被检测以确定其是否为零。若其已达到零,则已达到扫描排序的终端,一个FALSE值在步骤1618处返回而程序结束于步骤1616。
反之,如果x坐标不为零,则在步骤1612中y坐标设为零,TRUE值在步骤1614中返回,例行程序在步骤1616处结束。
以与前述两个扫描排序类似的方式,每个其他扫描排序目标都包括一个SeekNext例行程序,这些是以图15和图16所示的SeekNext例行程序类似的方式设计的,因此为简便起见而略去其程序细节。
在扫描排序目标中发现的SeekNext例行程序由两个在页面迭代程序中发现的例行程序所用,这两个例行程序使页面迭代程序在选定的页面范围中选择第一页面和扫描次序,并然后在打印操作中通过选择的页面。这两个例行程序被标示为SeekFirstPageInRange例行程序和SeekNextPageInRange例行程序。SeekFirstInRange例行程序示于图17中。
例行程序起始于步骤1700并去往步骤1702以检查网格范围是否有效。若其无效,则在步骤1704处获得该范围中的第一个网格单元且例行程序结束于步骤1718。替换之,若网格范围有效,则在步骤1706处用一标准矩形生成例行程序生成一个“假设”矩形,该“假设”长方形的生成是用来增加程序的性能且只供展示—其他执行同样全部任务的例行程序马上会为本领域的技术人员所理解。该例行程序然后去往步骤1708以设定假定矩形尺寸为网格边界。这给出了跨越整个网格的初始矩形。
在步骤1710处,确定具有最小页面号码的网格,该页面号码包含了假设长方形的一角。由于根据选择的扫描排序,起始位置将改变,所以这一步骤被执行,一旦把具有最小页面号码的网格单元定位后,就在步骤1712处把网络单元页面号码转换成当前坐标。
在步骤1714处检测当前坐标以确定是否其位于选定的网格范围之内;若否,则程序结束于步骤1718处。替换之,若新的当前坐标位于选定的网格范围内,则在网格排序中的下一项目通过利用相应于图15和16所示的那些选择的扫描排序的SeekNext例行程序而在步骤1716中获得。
在已获得下一项目之后,则将其与当前网格范围比较以确认是否其位于网格范围中,程序在下一项目落入当前网格范围之外时结束。下一项目落入当前网格范围之外意味着已经到达了网格范围的终端。
图18示出了SeekNextPageRange例行程序;程序始于步骤1800并去往步骤1802,在该处检测网格范围是否有效。若其无效,则在步骤1804中以扫描排序选择下一个网格单元,而且程序结束于步骤1818。
替换之,若网格范围有效,则在步骤1806处生成一个“假设”矩形,并在步骤1808中设置网格边界。在步骤1810处,假设矩形的当前坐标被设定为下个网络单元坐标,程序进而去往步骤1812处,在该处,新网格单元被检测以便看看是否其超出了范围的终端。若该新网格单元位于选择的范围之外,则例行程序结束于步骤1818;否则,在步骤1814处对当前坐标进行检测以确认其是否位于当前网格范围之中。
若当前坐标位于当前网格范围之外,则整个范围已被通过且程序结束于步骤1818。假设当前坐标位于当前网格范围之内,则在步骤1816处用图15和16的所示的SeekNext程序根据应用程序所选择的扫描排序获得网格排序中的下一项目。
SeekNextpPageInRange程序操作在步骤1814和1816之间继续进行直到项目的当前坐标落入当前网格范围之外的区域,则该坐标点处程序在步骤1818处结束。
在实际执行页面打印的页面迭代程序打印例行程序期间采用了SeekFirstPageInRange功能和SeekNextPagelnRange功能。上述例行程序详示于图19中开始于步骤1900。在步骤1902处检测是否页面计数不等于零。若其等于零,则处理停止且去往步骤1924。
假设页面计数不等于零,则例行程序去往步骤1904以使包括区域、偏移、位置,视图和页面叙述在内的多个变量可根据应用程序所提供的信息产生和装入。
例行程序然后去往步骤1906以调用从页面迭代程序而来的SeekFirstPageInRange功能,该功能已在前面结合图17进行了详细叙述。然后在步骤1908处进行检测以确认刚进行的查找是否有效。如前所述,SeekFirstPageInRange程序在查找实际返回位于有效页面范围内的页面坐标时返回一个TRUE值。该SeekFirstPageInRange程序返回一个FALSE以指示返回的页面坐标位于有效页面范围之外而且以前查找的结果因此处于不定状态。在后一情况下,程序在步骤1924处结束。
反之,如果以前查找的结果指示已获得有效页面坐标(在步骤1910处),则获得了视图的坐标,这些坐标是由应用程序提供的并在这一阶段被引用以确保为每一页面获得了适当的视图,根据本发明的原理,可对每个页面用不同视图以便在打印每个页面之前必须获得适当的视图。
然后程序去往步骤1912以检查是否在步骤1910处获得的视图有效;若无效,则程序结束于步骤1924(必须用来检测一个有效视图的步骤被封装在与视图相关的目标中。该目标并不形成本发明的部分且不在此详加叙述)。若该视图有效,则程序去经步骤1914以便从SeekFirst PageInRange程序中获得页面坐标。程序然后去往步骤1916以便从应用程序提供的变量中获得页面说明以及有效区域(这些变量可随页面视图从页面到页面进行变化并必须在每个页面打印之前被请求)。
使用在步骤1918中获得的页面坐标、页面说明以及有效区域值,中把选中的页面翻译成相应于其在输出页中的新位置的新页面坐标。这一翻译是由直接翻译程序完成的,在步骤1920处打印该页面(排队到假脱机的打印道道)并在步骤1922处由图18的详示的SeekNextPageInRange程序获得页面范围中的下一页面。
打印程序然后去往步骤1908以检测以前的查找操作是否有效。若有效,则获得页面并以扫描排序进行打印直到步骤1908中的查找有效判别结果指示到达范围的终端,在这点上,由Seek OK步骤1908检测一个FALSE返回,步骤1908然后导致程序在结束步骤1924处退出。
除页面坐标之外,所有页面迭代目标的Seek功能返回一个可打印页面目标,它可用于绘制其坐标刚由在先的Seek功能返回的画面。可打印页面目标只是表示一个将要打印(或由终端屏幕显示)的页面。可打印页面目标包括多个可检索有关页面信息并绘制该页面的功能。这些功能包括GetPageNumber();GetPageDescription();GetPageActiveArea();Draw();GetPageNumber功能返回当前选择页面的页号,Get-PageDescription功能返回所期望的页面的说明,GetPageActiveArea功能返回一个位于由应用程序选择的页面之内的有效可打印区域。Draw功能允许页面可绘制在任何转接端口打印机或显示器上。Draw功能的一个实施可包括例如在一个转接端口中生成一个“页面矩阵”。将该页面转换到该页面矩阵中的正确区域;把转换的页面连接到一个端口;截断该页面可把截断的页面由以下C++语句绘制到端口上(这里,fPageIterator是生成打印目标的页面迭代程序)void Draw(const TGrafPort&port)const{TGrafMatrix pageMatrix;pageMatrix.TranslateBy(fPageIterator->GetPageAreaAs());TSimpleCoordinateSystem pageSystem(PageMatrix);TLinkedViewCoordinatePort pagePort(port,&pageSystem);TSimpleClipBoundary pageClip(fPageIterator->GetPageAreaAs());TLinkedClipPort pageClipPort(pagePort,&pageClip);fPageIterator->GetPageView()->Draw(PageClipPort);}
书籍页面页码目标书籍页面页码目标的操作基本与连续页面页码目标的操作类似。不同之外发生在当书籍页面页码目标生成的时候,如前所述,标页号程序是多形的而且可以根据构成标页号程序目标时供给构成程序的变量执行若干不同功能。尤其是在构成书籍页面页码目标期间,可由书籍页面页码目标提供顶部左偏移,间隔,网格尺寸(页面数量)以及页面尺寸给标页号程序构成程序。这一参数选择导致标页号程序构成程序构成一个标页号程序目标,它根据图12所示流程图操作以计算所需延长以便该标页号程序操作于“MacWrite”模式之下虽有以上改变,书籍页面页码目标的操作基本与连续页面页码目标类似。
复合页面页码目标复合页面页码目标是一个表示其他类型页面页码集的目标。其基本结构与双端队列(deque)类似且其他页面页码可以一直接方式加入队列并从队列中去除。
图20示出了复合页面页码目标的继承图,它指示出复合页码页面目标2006来自于页面页码目标2000和页面双端队列目标2002。目标2002有其自己的双端队列选代程序2004,它是在由双端队列目标构成程序生成该双端队列目标的时候生成的。
双端页面队列是一在已有技术中已知的标准存储目标。通常,该双端队列是由多个功能操纵的,该多个功能允许在队列起始或结束之处,或在队列中的一指定点加入项目。附加程序提供来删除在双端队列中的某些或全部项目。由于在一个双端队列中操纵目标的程序是众所周知的,因此为简便起见在此不再赘述。
与页面双端队列一样,复合页面页码目标2006有其自己的页面迭代程序2008以及一个相关的页面范围2010。复合页面页码目标允许页面组以不同方式组合以产生其他复合结构并将接受任何包括其他复合页面页码目标的页面页码目标。因此,复合页面页码目标可被嵌套至任意给定深度。
内部而言,实际上存在双端队列结构中的实体是用于每个相关页面页码目标的页面迭代程序。当把一个页面页码目标加到页面双端队列时,生成相应的页面页码迭代程序且该迭代程序被加入以取代之。结果,在复合页面页码中的页面可能通过顺序调用在双端队列中存储的每个页面页码目标的迭代程序的方式而予以打印。尤其在打印处理过程中,页面迭代程序2008调用双端队列迭代程序2004,它随即选择存储在页面双端队列中的第一个迭代程序,被选中的页面迭代程序然后通过它的所有页面而被选代,从而在其相关的页面页码目标中打印这些页面。双端队列迭代程序然后从双端队列中调用下一页面迭代程序且操作以此方式进行,直至在该复合页面页码中的所有页面被打印出来。该打印操作示于图21中。
在打印循环过程中,复合页面迭代程序与和前述的连接页面页码和书籍页面页码关联的页面迭代程序的功能很相似。实际的打印例行程序与图9所示基本相似。不同之处在于在页面迭代程序打印程序中所用的SeekFirstPageInRange和SeekNextPageInRange功能已被修改得适合多页面迭代程序的直接使用。
更具体而言,在复合页面迭代程序中所用的SeekFirst-PageInRange程序起始于2100,并在步骤2102处,该例行程序检测是否该复合页面迭代程序有效。若无效,则当前页面的坐标在2114处返回且程序结束于步骤2116。
另一方面,若在步骤2102中复合页面迭代程序被发现有效,则检查双端队列迭代程序是否有效(步骤2104)。若其无效,则程序再次通过步骤2114并结束于步骤2116处,但是,若双端队列程序在步骤2104处被判定有效,则在步骤2106处用双端列迭代程序从与复合页面目标关联的双端列中检出第一页面页码迭代程序。该迭代程序然后被检测以确定其是否有效(步骤2108)。若该第一迭代程序无效,则程序中止于步骤2114和2116。另一方面,若该第一页面迭代程序有效,则在步骤2110处同有效的迭代程序通过程序(例如结合图17所述的程序)在预选的页面范围内检索第一页面。
在步骤2112处,检查SeekOk例行程序以确定以前检索的返回有效页面坐标。若该查找确实完成,则返回当前页面的坐标且程序结束于步骤2114和2116之处。若在步骤2110处的SeekFirstPagelnRange例行程序没产生有效的页面坐标,则在步骤2118处双端队列迭代程序用于在双端队列中检索下一页面迭代程序。例行程序然后去往步骤2108以检查该页面迭代程序是否有效,若是,则用该迭代程序用于在其相关的页面页码中检查第一页面,操作以此方式继续直到在步骤2102中的SeekOk程序返回选择页面的有效坐标时,从一个页面页码中成功地获得第一页面,或直到在返回当前页面坐标的点无有效页面迭代程序保留在页面双端队列中。
SeekNextPageInRange例行程序也用在复合页面页码打印之中,如图22所示,该例行程序的功能与前述复合页面页码的SeekFirstRageInRange例行程序类似;其中,页面迭代程序从页面双端队列中顺序检出,然后每个页面迭代程序被用作检索其相关范围内的下一页面。图22示出了复合页面页码的SeekNextPageInRange例行程序。在步骤2200之后,复合页面迭代程序和双端队列的有效性分别在步骤2202和2204处被检测。如果在任一步骤发现迭代无效,则程序在步骤2216中返回当前页面的坐标并结束于步骤2200之处。
若在步骤2202和2204处确定双端队列和复合页面迭代程序都有效,则检查当前页面迭代程序的有效性,并在步骤2216处返回当前页面的坐标之后,一个无效页面迭代程序导致例行程序在步骤2220处退出。若当前页面迭代程序在步骤2208处有效,则用页面迭代程序通过利用SeekNextPageInRange例行程序(正如以前所述的)在相关页面页码中的获得下一页面,而且在步骤2210处,确定下一页面坐标是否有效。若查找返回一有效页面,则在步骤2216上返回该页的坐标并在步骤2220处结束该程序。
替换之,若步骤2210处确定查找没有导致有效的页面坐标(可能指示当前页面迭代程序已经到达其范围的终端),则用双端队列迭代程序获取下一页面迭代程序,如步骤2212所示,最终在步骤2214处,用新获得的迭代程序由前述查找例行程序在相关页面页码中获得第一页面。
在步骤2218处,检查用于在页面页码中获得第一页面的查找以确定返回的坐标是否有效。若有效,则在步骤2216处返回且程序结束于步骤2220处。替换之,若用于在新的页页码中获取第一页面的查找未返回有效坐标,则程序返回到步骤2206以检查页面迭代程序的有效性,并在其仍有效时,用来以前述方式在范围中检查下一页面,以此方式反复执行程序直到页面双端队列中存储的所有页面迭代程序已经全部循环过或者直到获得一个有效的下一页面。
页面组合程序目标最后一个主要打印目标是一个页面组合程序目标,它执行常规打印文件的预打印处理并把定位标记,装饰,裁剪和标记,注释和处理色彩特征之类的增强功能加到页面。其他可执行的功能包括生成标记,n-up打印或仅只改变现有页面边界。一个页面组合程序可被裁剪为特定的页面页码目标,而非没有继承排序可被裁剪为特定的页面页码目标,而非没有继承排序或目标信息的组合程序。根据本发明生成的组合程序可用到任意页面页码对象且可被嵌套至任意深度。一个页面组合程序目标也可被打印,但其不可在没有页面页码目标要打印的情况下打印。
一般来讲,每个页面组合程序执行一个特定功能。例如,一个特定页面组合程序可把定位标记加到目标页面页码文件中。另一页面组合程序可以用来加边界等。为说明之目的,在此详细叙述两个特定的页面组合程序目标,它们实现页面排版程序和n-up打印。
图23示出了页面组合程序目标的简化分类层级图。如图所示,页面组合程序分类2302是页面迭代程序分类2300的子分类。分类2300已在前面有关页面页码目标部分进行了详细叙述(但是,页面组合程序分类无需是页面迭代程序分类的子分类)。如图23所示,页面组合程序分类2302有两个子分类一个n-up组合程序分类2304和一个页面排版程序分类2306。根据上述,可以构成其他子分类以提供其他页面组合功能,例如加边界等。此外,页面排版程序2306与一个排版程序2308相关联。
由于页面组合程序分类2302是页面迭代程序分类2300的子分类,所以它继承了展现在页面迭代程序分类中的许多功能,包括前述的基本打印例行程序。从图23示出的分类中构成的页面迭代程序目标及其操作和功能将结合n-up组合程序目标和页面排版程序目标而在下面予以详述。
n-up打印处理已结合标页号程序目标作了部分描述。N-up打印是把多个页面视图(或部分页面视图)定位到一张纸面上的处理。在该纸面上,所有视图的方向一致。相反,排版是这样一种处理,它把多个页面定位到一张纸面上以便当该页纸以一定顺序折合区沿某些折合线剪剪裁时,产生一个具有一适当页面排序的可读文件。理想的排版类型是由多种因素决定的,它们包括每张纸上的页面数量,该页是两面打印还是单面打印,以及折合该张纸的方法。
n-up打印和排版之区别示于图24中。图24示出了根据4-up打印准备的输出,其中,4个页面被打印在一张纸上。具体地说,页面2402,2404,2406和2410安排在一张纸2408上,其黑点2400指示每个页面左上角的位置。正如所看到的,所有页面的方向都是一致的。
与之相比,图24B示出了从一张两面打印的纸张上产生一个八个页面的小册子的排版打印。页面2412示出了该页面前面的安排而页面2420则示出了后面的安排。点划线2418指示出一条折合线而实线2416则指示了一条裁剪线。该小册子的页面必须放在该纸张上以便每页的前后都有适当的顺序且在纸张每页面的“排版”位置和方向上使页面以正确次序出现并在最终产品上有正确方向。排版组合程序目标完成这一任务;如图24A,每个页面的角上的黑点指示左上角并且页面的标号示于每个页面的中心。例如,页面2414相应于最终小册子的页面4。
由于n-up组合程序是页面组合程序的子分类,它依次又是页面迭代程序分类的子分类,所以由n-up组合程序所用打印功能与页面迭代程序所用的打印功能(示于图19中)相似。其不同之处在于SeekFirstpagelnRange和SeekNextPageInRange。这两个功能较为复杂,其原因在于在n-up组合程序中,在一单独页面上安排了一组图象,在n-up组合程序子目标中所用的SeekFirstInRange功能详示于图25A和25B中。当垂直安排时,这些图形形成了一个流程图,它展示了SeekFirstPageInRange例行程序。
在n-up组合程序目标中的内部打印程序在每个页面形成时利用了几个内部变量来追踪页面。每个页面由子页面形成并由一个主页面标号标示。一个步进计数对每个主页面上的页面总数进行管理。应用程序提供有关主页面的步进计数以及一个页面范围。这些变量允许打印程序打印基本页面页码中的部分或全部页面。SeekFirstPageInRange始于步骤2500并去往2502以检查目标页面页码的有效性。若其无效,程序通过链接环路2523和2530去往步骤2548,在该处,当前的页面坐标值被返回;然后程序结束于步骤2550处。
反之,若在步骤2502处发现目标页面页码有效,则程序去往步骤2506检查n-up目标页面范围以及目标页码页面(Target folio Page)范围,若二者已满,则文件中的所有页面被包括在范围之中且可通过文件中的第一页面的检索而获得第一页面。在这一情况下,程序去往步骤2508以获取在扫描排序中第一页面的坐标。通过链接回路2518和2528,程序去往步骤2540,其中,用来获取第一页面坐标(步骤2508)的查找功能被检查以确定是否第一页面有效。此外,进一步进行检查以确保被处理的页面的主页面标号位于应用程序提供的范围之内。
若当前页面的主页面标号处于应用程序指定的范围之外,则程序去往步骤2548以返回现在的页面坐标并结束于步骤2550处。
反之,若查找程序获取的第一页面有效且主页面标号位于指定范围之内,则在步骤2542处获得当前页面编号,当前页面坐标在步骤2546处被设置成(0,0)并在步骤2548处返回且程序结束于步骤2550。
回到步骤2506,若在n-up页面范围和目标页面范围内有多个页面,由在步骤2510处完成查找建立,其中,内部页面编号变量以及步进计数被设置成应用程序提供的值。程序然后去往步骤2512以便利用已为目标页面号码所定义并已叙述过的SeekFirstPageInRange功能在目标页码页面范围中获取第一页面。
在步骤2514中,主页面编号设置成零,它指示正在检查第一页面。在判别步骤2516,新的主页面编号与由应用程序所指定的主页面编号范围比较。若其落入页面范围之内,而且先前的查找操作指示检查的页面是有效的,则程序通过链接回路2518和2528去往步骤2540,如前所述,获得当前页面编号。在步骤2546中设置页面坐标为(0,0)并在步骤2548中返回,例行程序在步骤2550处结束。
但是,若在步骤2516中发现主页面编号位于应用程序提供的范围之外,则主页面编号被增值直至其落入范围之内。每次主页面编号增值,则在每个主页面上发现的子页面编号也必须在该项目标页面页码中传送。具体地说,在后一种情况下,程序通过连接回路2520和2524去往步骤2526以便对主页面编号增值。相应于被跳越过的主页面的目标页面页码的页面被循环所跳越过,该循环包括比较判别步骤2543、处理步骤2538和2544。具体地位把循环计数器在步骤2532处设置成零并在步骤2534处与步进计数比较。若计数器值小于步进计数,则在步骤2538中用前述的SeekNextPageInRange功能从目标页面页码中检索下一页面。
为继续该循环,在步骤2544处对计数器值增量并重复该循环直到跳越过对应于主页面的子页面编号。在这点上,程序通过连接回路2536和2522返回步骤2516,在该处,新的主页面编号与目标范围相比较。若主页面编号仍位于目标范围之内,则重复处理过程直到主页面的标号落入目标范围内。在这种情况下,程序通过连接回路2518和2528去获取当前页面编号并返回当前页面坐标。
n-up页面组合程序打印程序也包括一个已详细示于图26A和26B中的SeekNextPageInRange功能。象图25A和25B一样,图26A和26B在垂直放在一起时构成了一个完整的流程图,详细示出了执行SeekNextInRange功能的n-up组合程序操作。
该程序始于步骤2600且去往步骤2602检查目标页面页码的有效性。若其无效,则程序通过连接回路2624和2634去往步骤2650,在该处,当前页面的页面坐标值被返回且程序结束于步骤2652。
反之,若在步骤2602处发现目标页面页码有效,则n-up页面范围和目标页面页码范围被检查以查看是否所有的文件页面包括于这些范围之中。若是,在网格顺序中的下一页面被获取且程序通过链接回路2618和2632去往步骤2642检查主页面是否位于预定范围之内。若不是,则在步骤2650处返回当前页面值且程序结束于步骤2652。
另外,若在步骤2642处,主页面编号位于指定范围之内,则在步骤2646处获得当前页面编号,在步骤2648处把页面坐标设置成(0,0)且在步骤2650处返回页面坐标,程序然后结束于步骤2652处。
现在回到步骤2606,若在n-up页面范围和目标页面页码范围中有页面,则程序去往步骤2610以获取目标页码范围中的当前页面。利用详示于图27中的SeekToPageNum-ber程序执行该操作。
现在假设在步骤2610处已经获得了当前页面的页面坐标,程序去往步骤2614以便对主页面标号增值。在步骤2616处,将增值的主页面编号与应用程序指定的主页面范围比较以确定是否下一主页面位于应用程序指定的范围之内。若不是,则程序通过连接回路2618和2632去往步骤2646以获得当前的页面编号,并在步骤2648处将页面坐标设定成(0,0),然后在步骤2650处返回页面坐标,最后程序结束于步骤2652。
在步骤2616处,若主页面编号不在指定范围之内,则程序通过连接回路2620和2628对主页面编号增值并对目标页面中的子页面的相应编号增值,直到主页面编号落入预定范围之内。这一操作由循环计数器管理的程序循环来实现。在步骤2630处,循环计数器被设置成零,而且在步骤2638处,当前的循环计数和指示每个主页面上的子页面的总数相比较。在步骤2638中,若循环计数器小于步进计数(它指示可将其它页面放在正被检查的主页面上),则在步骤2640中且获得目标页面页码的下一页面,循环计数器增值(步骤2644),程序然后去往步骤2638,在该处将增值的循环计数器再次与步进计数相比较,操作以此方式进行直到被旁路的每个主页面上的所有页面也在目标页面页码中被跳跃过去。
当步骤2638指示等于步进计数的页面编号已经被跳跃过去之时,程序便退出循环且经连接回路处2626和2622返回步骤2614,此处对主页面编号再次进行增值并在步骤2616之处,将其与应用程序指定的范围比较。最后,主页面编号落入应用程序指定的范围之内且程序通过连接环路2618和2632去经步骤2642,并按前述过程完成处理。
如上所述,可用一个单独程序从主页面编号和步进计数中获得当前页面编号的值。该程序示于图27中并始于步骤2700。然后程序去往步骤2702以确定是否目标页面页码有效。若否,则在步骤2714处返回当前页面坐标且程序结束于步骤2716。
替换之,若目标页面页码在步骤2702中发现有效,则程序去往步骤2704从而根据应用程序指定的值将页面编号和步进计数复位。然后在步骤2706中把主页面编号与主面面总计数相比较。若主页面超过该总计数,则程序去往步骤2714以返回当前页面坐标并结束于步骤2716。
反之,若在步骤2706确定的主页面编号小于该页面总计数,则程序去往步骤2708以便把主页面编号设定成当前页面编号并通过把主页面编号乘以步进计数的方式确定与目标页面页码中当前页面相应的一个新的目标页面编号。当在步骤2708处已获得了目标页面编号时,在步骤2710中检索相应页面,并在步骤2712处把当前页面坐标设定成(0,0),然后程序去往步骤2714和2716以返回页面坐标并结束程序。
页面排版目标功能与n-up组合目标类似。其中,多个子页面被放在一个主页面上。但是,以下将讨论它们之间的两个不同之处。在排版处理中采用了几个术语以便于理解该处理。第一个术语是“章节(sections)”,也被称为“书帖(Signa-ture)”或“选层(sleeves)”。章节涉及页面集,它们就象放在一起的报纸的章节;“章节,书帖,以及选层通常可交换使用。但是,更严格讲,“章节”是订在一起的折叠纸张的集合,而一个“书帖”则是指打印在一张折叠页上的出版物的所有页面,而“选层”是一个非正式的用语,是指任何堆垛在一起的纸张。而术语“排版”则是指把子页面放在纸张上以供其后的装订,从而使页面全都位于适当顺序和方向的处理。
页面排版目标利用一个称为页面排版排序程序的目标,它是一个无状态分类,用于返回有关一个特定排版方法的信息。除了在选层或章节中的页面编号之外,不能改变一个特定的排版顺序程序目标来定义新行为,若需要新行为,必须有一个新的排序程序是子分类且被生成。其他定义一个排版目标的信息包括是否打印一张的两面以及在章节或选层中的纸张数量。
在页面排版目标中提供的功能包括接收排版顺序中的编号,进行计算并返回将用于顺序中的那一位置的源文件的正确页面编号。其他功能还告诉在那一位置中页面所用的旋转角度。具体地说,应用程序指定了页面编号的排序,这些页面编号一般总是以光栅顺序提供的,排版程序页面目标返回在顺序中那一位置的正确源页面编号。
图28示出了返回一特定排版位置所用的源文件的页面编号的程序。该程序接收页面顺序,例如,一个8页面顺序[5,4,8,1,3,6,2,7],该顺序指示出分布在主页面上的每个页面的页面编号顺序。
该程序连接收索引号,它指示出8个页面中的那一个正在被定位。该排版程序始于步骤2800并去往步骤2802,在该处将一个纸张变量设定为应用程序提供的章节尺寸。然后在步骤2804处把一个内部变量n设定成为索引号被8除,数8作为纸张数的模数。
在步骤2806处把一个内部“块”变量设置成索引号,它被由8乘以纸张编号的所得相除。最后,在步骤2810处把一个内部“结果”变量设定成“块”编号。
然后程序去往步骤2812,它是一个“转换”语句,导致可能的多通路之一被选择。该转换通路选择由出现在索引模数8的位置处的页面顺序编号所确定。在这一位置处是一个位于1和8之间的页面编号,而这一页面编号用来选择通道之一(步骤2814),以便进行一个计算。在每一通道中,根据一个数码对结果变量增值,该数码由一个示于图28的编号n和纸张变量所决定。
修改后的结果变量然后在步骤2816处返回且程序结束于步骤2818。
图29示出了确定每一页面的旋转的类似程序。在一般排版配置中,每个页面的旋转或是0°,或是180°;页面或以正常方向打印,或是沿水平轴向翻转打印。程序始于步骤2900并去向“转换”步骤2902,其转换是由索引值模数8定位的页面顺序数码所计算的转换索引决定的。转换计算输出再次导致一个位于1和8之间的数码,它用于在2904中选择一个通道。选择的通道导致0°或180°旋转;结果在步骤2906处返回而程序结束于步骤2908。
由页面排版程序目标利用的打印程序与页面迭代程序目标所用的打印程序类似,因为页面排版程序目标是由构成页面组合程序目标的分类的子分类生成的,而页面组合程序目标又是由页面迭代程序目标所用的SeekFirstPageInRange功能被详细示于图30中。该程序始于步骤3000并去往步骤3002以检查目标页面页码的有效性。若其无效,则程序去往步骤3010以返回当前页面坐标并在步骤3012处结束该程序。
反之,若在步骤3002中目标页面页码确定有效,则程序去往步骤3004以检查排版程序页面范围以及目标页面范围是否包括所有文件页面。若是,则在步骤3008中获得文件的第一页面,其坐标值则在步骤3010处返回且结束于步骤3012。
替换之,若在步骤3004处有页面位于排版程序页面范围和目标页面范围之中,则范围中的一个偏移页面的页面坐标在步骤3006中接收。步骤3006中执行检索的程序示于图32中且收在稍后予以讨论。在获得偏移页面之后,在步骤3010年返回页面坐标值且该程序结束于步骤3012处。
图31详细示出了在排版程序目标中所用的SeekNextPageInRange程序。它始于3100可去往3012以检查目标页面页码的有效性。一个无效的页面页码导致当前页面坐标返回(在步骤3112中)并在步骤3114处结束该程序。
替换之,若目标页面页码有效,则在步骤3104中对主页面计数器增值,在步骤3106处调节范围偏移并在3108处检查范围偏移以确定是否该范围偏移导致范围超出了应用程序提供的页面范围。若范围偏移调整无效,则程序去往步骤3112以返回范围偏移坐标并结束于步骤3114。
替换之,若步骤3108中确定范围调整有效,则在3110处将顺序计数器复位使其等于主页面计数乘以在每个主页面(由应用程序提供)上的页面数之值。然后该程序去往步骤3112以便返回从范围偏移调整程序中接收的页面坐标,程序然后结束于步骤3114。
图32详细示出了用于在图30所示的SeekFirst-PageInRange功能中的所用范围内获得偏移页面的程序。该程序始于步骤3200并去往步骤3202以检查排版程序页面范围以及目标页面范围,确定是否它们包括了所有文件页面。若是,则在步骤3206处由应用程序提供的预定的页面偏移接收下一页面的页面编号。该页面的坐标然后在步骤3218处返回并在3220处结束程序运行。
替换之,若不是所有文件页面都包括在排版程序页面范围和目标页面范围之内,则程序去往步骤3204,在该处由应用程序指定的值将页面计数和步进计数复位。在步骤3208处检查选定范围中的页面计数以确定否其大于零,若否,则在步骤3214处把顺序计数器复位成页面同计数乘以主页面上的页面数之值。在步骤3218处返回当前页面的页面坐标且程序结束于步骤3220。
替换之,若在步骤3208处的范围中的页面计数大于零,则在3210处把主页面计数设置成一个偏移数,并在步骤3212处检查页面范围的有效性。若其无效,则在3214处返回页面坐标,然后程序结束于步骤3220。
进而,若在步骤3212处确定范围有效,则在步骤3216处调整范围中的偏移。然后在步骤3214中时顺序计数器复位,在3218处返回页面坐标,并在步骤3220处结束该程序。
打印实例现在利用上述本发明的打印接口目标(用C++码写成)对一个完整的打印实例进行讨论。应注意到本例包括码段而非完整程序。这是示例给本技术领域一般技术人员有关打印接口分类的使用。但是,必须提供其他编码以使其如由一般技术人员所理解的那样进行操作。例如,某些在下面提出的编码中指定的值实际上可从应用程序中的用户接口中获得。
为说明之目的,下述打印实例将生成一个由两页文本随后的一个卡通的四份复制件的小册子。这四个卡通复制被设计在同一页面上。即为说明之目的,假设动画视图是一个约为4×5inch的动画图形,而文本被假设是包含在一个四页子视图的一个大视图之中。
打印处理的第一步是说明两个视图目标,叫做demoView和text View,表示文本和动画图形,这一说明完成如下TVeiw*demoViewTView*textView这里*指示印说明的目标是指针且Tview是一个视图分类。
处理的下一步是从动画视图中利用上述打印接口目标生成一个可打印的文件页码。它将包括一单独含有图形的页面并将用于生成一个包括文本和动画图形的较大的多页面页码。这是由获得指示一个特定指针的打印机目标实现的,其具体实现如下TPrinter printer;下一步则是生成该视图的页面说明,可能从指示打印机的可打印区域的打印机中得到一个页面说明,但是,可能构成矩形区域的页面说明装置,它们如下方式完成
TPageDescription demoPage(TPageBounds(TGRect(TGPoint(0,0)TGPoint(298,370)),TGRect(TGPoint(0,0)TGPoint(288,360));这里TPage Bound是一个确定页面尺寸和打印区域的目标,它接受两个矩形区域说明。TGRect生成并处理矩形区域,TGPoint是另一个处理成对编号的目标。由TGRect生成的矩形区域由两个对应于左上角和右下角的点限定,这样,由两个TGRect目标生成的长方形区域对应于页面尺寸(长方形
以及打印区域(长方形
)。因此,页面说明对应于其物理尺寸稍大于该视图且其打印长方形正好是视图的页面说明。现在可利用页面说明和视图使页面说明可以打印。这可用一个连续页面页码目标来表示该页面的方式完成。连续页面页码目标可通过调用如下的构成程序而生成TTiledPageFolioDemoTiledPageFolio(demoPage,demoView);这段指令使连续页面页码目标由页面的可打印区域示例一个上述的标页号程序目标。同样处理可用于文本视图,不同之处在于文本包括位于一个标准8.5×11时格式中的几个内部视图,为说明起见,假设在文本中有若干页面大小的视图,每个视图间的间隔为0.5inch。在这种情况下,必须生成指定文本页面配置的新页面说明,而且在定特定情况下,可通过检索一个在下面编码行中所述的系统预置页面说明而从打印机中获得文本页面配置
TPageDescription textPage(printer.GetDefault-PageDescription());为生成一个文本页码页面,另一连续页面页码目标按如下方式生成。
TTiledPageFolio demoTextPages(textPage,textViewTRUE,TGPointkOrigin,TGPointkOrigin,TGPoint(0,26)这里,功能TGPointkOrigin生成了一个包括点(0,0)的TGPoint目标。该连续页面页码目标生成了连续页面页码目标并指定应没有部分页面使用,没有左上偏移,没有右下偏移且间隔为(0,0.5)。用于标页号的有效页面区是系统预置的物理区域。
在这一阶段,有两个单独的连续页面页码目标且它们需被合并以形成一个目标。这可由使用一个复合页面页码目标的方式而予完成,而该复合而面页码目标可通过调用下述构成程序而予以生成TcompoundPageFolioanimationFolio;这一复合目标最初是空的以便加入需要的页面。要做的第一件事就是把下面的四面动画加入animationFolio.AddPages(&demoTiledPageFolio);animafionFolio.AddPages(&demoTiledPageFolio);animationFolio.AddPages(&demoTiledPageFolio);animationFolio.AddPages(&demoTiledPageFolio);
下一步就是用页面组合程序目标把所有四个页面放在一页上。用一个如下生成的u-up页面组合程序目标可完成的任务TNup fourUp(&animationFolio,TULongPair(2,2));这里,目标TULongPair是处理长整数对的目标。两个指定数是行和列数。如此,页面组合程序目标生成一个N-up打印配置,它有两行两列。下一步是把文本和页面结合以制成一个文件页码,通过生成另一复合页面页码并把动画页面和文本页面按如下加入,即可使用TCompoundPageFolio brochureFolio;brochureFolio.AddPages(&fourUp);brochureFolio.AddPages(&demoTextPages);在这点上,完成和打印文件页码。为说明起见,假设文本的第二页在打印输出中是不需要的。如前所述,可直接打印文件页码。但是,当打印时会打印出全部页面。由于不想打印第二页文本,必须生成页面迭代程序。通过在文件页码中按如下方式使用CreatPageIterator程序即可做到这一点TPageIterator demoIterator=brochure.Folio.CreatePageIterator();然后设定文件页面范围以将文本第二页排除在外。由于文件页面范围总是预置为整个页码,所以必须删除页面3(第一页是动画页),用如下的页面范围目标中的Difference功能即可实现该目的demoIterator->GetPageRange->Difference(3);
最后,通过生成一个打印通道并把文件送到该打印通道,便可打印该文件。其结果是一个四页的小册子。其中,第一页是一个u-up组合而其他页是文本页,且第二个文本页是空的。
权利要求
1.用于控制打印设备以产生格式化打印输出的计算机系统,其特征在于包括(a)用于产生可打印信息的应用程序(b)存储设备(c)用于在存储设备中存储可打印信息并从存储设备中检索可打印信息的处理器;(d)存储在存储设备中并与处理器共同操作以控制打印设备的操作系统;以及(e)由来自应用程序从根据存储在操作系统中的命令和功能由应用程序生成的第一打印接口目标,该打印接口目标控制处理器以操纵从应用程序接收的可打印信息,从而改变打印输出的格式。
2.权利要求1所述计算机系统,其中的第一打印接口目标控制处理器以操纵从应用程序接收的可打印信息,从而生成具有第一格式的可打印信息,该计算机系统还包括一个第二打印接口目标,用于控制处理器以操纵从应用程序接收的可打印信息,从而生成具有第二格式的可打印信息。
3.权利要求2所述计算机系统,其中的第一打印接口目标控制处理器以对从应用程序接收的可打印信息进行标页号,以生成标页号的可打印信息。
4.权利要求3所述计算机系统,其中的第二打印接口目标控制处理器根据从第一打印接口目标接收的标页号可打印信息而生成一个n-up打印配置。
5.权利要求3所述计算机系统,其中的第二打印接口目标控制处理器以根据从第一打印接口接收的标页号可打印信息生成一种排版打印配置。
6.权利要求3所述计算机系统,其中的标页号可打印信息有一排序且第一打印接口目标包括用于生成可以重新安排标页号可打印信息的排序的页面迭代目标。
7.权利要求2所述计算机系统,还包括一个第三打印接口目标,它响应于具有第一格式的可打印信息和具有第二格式的可打印信息以便将具有第一格式的可打印信息和具有第二格式的可打印信息合并成为一个单独的文件。
8.权利要求2所述计算机系统,其中的第一打印接口目标导自于一个多形标页号程序目标,该多形标页号程序目标响应从应用程序接收的一组预定参数而把可打印信息以从预定的多个格式中选择的一种格式进行标页号。
9.权利要求8所述计算机系统,其中的标页号以一预定排序进行,而且该多形标页号程序目标包括生成标页号程序迭代程序的装置,它响应于可打印信息改变预定的标页号排序。
10.权利要求9所述计算机系统,其中的标页号迭式程序包括用于生成一个扫描排序目标的装置,该扫描排序目标确定一个改变预定标页号排序的光栅扫描排序。
11.权利要求9所述计算机系统,其中的标页号可打印信息有一排序且第一打印接口目标包括生成页面迭代程序目标的装置,该页面选代程序目标可以重新安排标页号可打印信息的排序,而且的页面迭代程序目标导自于标页号程序迭代程序目标。
12.用于控制打印设备以生成格式化的打印输出的计算机系统,其特征在于包括(a)用于生成可打印信息的应用程序;(b)存储设备;(c)用于在存储设备中存储可打印信息并且从存储设备中检索可打印信息的处理器;(d)连接到打印设备并响应可打印信息以控制打印设备进行打印的接口设备;(e)存储在存储设备中并与处理器共同操作而把来自存储设备的可打印信息传送到接口设备的操作系统,该操作系统包括打印命令和功能;以及(f)根据操作系统中的打印命令和功能由应用程序生成的第一打印接口目标,该第一打印接口目标控制处理器在可打印信息被提供给接口设备之前操纵从存储设备接收的可打印信息以改变打印输出的格式。
13.权利要求12所述的计算机系统,其中的第一打印接口目标控制处理器而从存储设备中以预定尺寸的部分检索可打印的信息以便产生标页号的可打印信息。
14.权利要求13所述计算机系统,其中的第一打印接口目标包括响应可从应用程序接收的参数确定所述部分的尺寸。
15.权利要求14所述计算机系统,其中从应用程序中接收的参数包括可打印信息的总尺寸以及部分的参数。
16.权利要求14所述计算机系统,其中,从应用程序接收的参数还包括在部分之间的间隔以及页边尺寸。
17.权利要求13的计算机系统,还包括一个响应于从第一打印接口目标接收的标页号可打印信息而控制处理器把预定数量的部分合成为一个文件的第二打接口目标。
18.权利要求17所述计算机系统,其中的第二打印接口目标包括在文件中安排所述部分以便每一部分与其他部分有相同方向的装置。
19.权利要求17所述计算机系统,其中的第二打印接口目标包括在文件中安排所述部分以便每一部分相对其他部分有不同的相对方向,从而允许文件被裁剪和折合以产生一个打印文件的装置。
20.权利要求13所述计算机系统,其中所述第一打印接口目标包括生成一个第一页面迭代程序目标装置,该第一页面迭代程序目标可以在存储设备之间以一个第一预定排序传送所述部分。
21.权利要求20所述计算机系统还包括(a)由应用程序根据操作系统中的打印命令和功能生成的一个第二打印接口目标,该打印接口目标控制处理器以操纵在可打印信息供给接口设备之前从存储设设备接收的可打印信息,以改变打印输出的格式;以及(b)一个第三打印接口目标,它响应第一打印接口目标生成的第一打印信息以及第二打印接口目标生成的第二可打印信息而把该第一和第二可打印信息合并成一个文件。
22.权利要求21所述计算机系统,其中的第二打印接口目标包括生成一个第二页面迭代程序目标的装置,该第二页面迭代程序目标可以在存储设备和接口设备之间以一预定的第二排序进行所述部分的传送,而且第三打印接口目标包括一个队列目标,用于暂时存储第一和第二页面迭代程序。
23.权利要求20所述计算机系统,其中所述部分以一预定排序从存储设备中检索出来,而且第一打印接口目标包括生成一个标页号程序迭代程序的装置,该标页号程序迭代程序响应从应用程序接收的命令以改变预定的检索排序。
24.权利要求23所述计算机系统,其中的标页号程序迭代程序包括生成一个扫描排序目标的装置,该扫描排序目标确定一个光栅扫描排序以改变预定的检索排序。
25.权利要求23所述计算机系统,其中的页面迭代程序目标导自于标页号程序迭代目标,以致在生成页面迭代程序目标时自动生成标页号程序迭代程序目标。
26.一种由计算机系统控制打印设备以生成格式化打印输出的方法,所述计算机系统有一应用程序和一操作系统,该方法的特征在于包括以下步骤(a)由应用程序在一预定位置处生成可打印信息;(b)根据存储在操作系统中的命令和功能生成一个第一打印接口目标;(c)将可打印信息的预定位置传送给第一打印接口目标;(d)利用第一打印接口目标操纵可打印信息而对可打印信息进行第一格式处理;以及(e)将格式化的可打印信息送到打印设备以供打印。
27.权利要求26所述方法,其中的步骤(d)包括对可打印信息标页号以生成标页号的可打印信息的步骤(d1)。
28.权利要求27所述方法。其中的步骤(d)包括从标页号的可打印信息中产生一个n-up打印配置的步骤(d2)。
29.权利要求27所述方法,其中的步骤(d)还包括从标页号的可打印信息中产生一个排版打印配置的步骤(d3)。
30.权利要求26所述方法,其中的步骤(b)要包括生成一个页面迭代程序目标的步骤(b1),该页面迭代程序目标可以重新安排标页号的可打印信息的排序;而且步骤(d)包括用步骤(b1)生成的页面迭代程序目标对可打印信息以一预定排序进行标页号的步骤(d4)。
31.权利要求26所述方法,还包括以下步骤(f)根据存储在操作系统中的功能和命令生成一个第二打印接口目标;(g)把可打印信息的预定位置传给第二打印接口目标;以及(h)用第二打印接口目标操纵可打印信息以第二格式把可打印信息格式化。
32.权利要求31所述方法,还包括以下步骤(i)生成一个第三打印接口目标;(j)将具有第一格式的可打印信息提供给第三打印接口目标;(R)将具有第二格式的可打印信息提供给第三打印接口目标;(D)用第三打印接口目标把具有第一格式和第二格式的可打印信息合并成一个文件。
33.权利要求26所述方法,其中的步骤(b)包括从一个多形标页号程序目标中导出第一打印接口目标的步骤(b2),该多形标页号程序目标响应于应用程序接收的一组预定参数以从多个预定格式中选中的一个格式而将可打印信息标页号。
34.权利要求33所述方法,其中的步骤(b2)包括生成一个标页号程序迭代程序目标以便以一预定的标页号排序对可打印信息标页号的步骤(b2a)。
35.权利要求34所述方法,其中的步骤(b2)包括生成一个扫描排序目标的步骤(b2b),该扫描排序目标确定一个用于改变预定的标页号排序的光栅扫描排序。
36.权利要求35所述方法,还包括导出一个页面迭代程序目标的步骤(m),该页面迭代程序目标可以对来自标页号程序迭代程序目标的标页号的可打印信息的排序进行重新安排。
37.一种用于生成应用程序的打印接口的方法,该应用程序和操作系统共同操作以控制可打印信息生成格式化的可打印信息,该方法的特征在于包括以下步骤(a)生成一个第一打印接口的分类,该分类包括操作系统中的标页号命令和功能;(b)在应用程序中引用第一打印接口分类以生成一个导自第一打印接口分类的第一打印接口目标;以及(c)生成第一打印接口目标的实例以操纵可打印信息生成格式化成为若干页面的可打印信息。
38.权利要求37所述方法,其中步骤(a)包括生成第一打印接口分类的步骤(a1),该多形分类根据从应用程序接收的参数所确定的方式对可打印信息标页号。
39.权利要求37所述方法,其中步骤(a)包括生成第一打印接口分类的步骤(a2),该第一打印接口分类包括至少一个生成一个页面迭代程序目标的功能,该页面迭代程序目标可以顺序通过多页格式化可打印信息。
40.权利要求39所述方法,其中步骤(b)包括引用应用程序中的第一打印接口分类并提供预定参数以便生成一个从第一打印接口分类导出的一个第一打印接口目标的步骤(b1),所述第一打印接口分类以一确定方式对可打印信息标页号。
41.权利要求10所述方法,还包括下列步骤(d)生成一个第二打印接口分类,该分类包括一个用于存储页面迭代程序目标的队列结构以及用于操纵操作系统中的队列结构的功能;(e)在应用程序中引用第二打印接口分类以生成一个导自第二打印接口分类的第二打印接口目标;以及(f)生成第二打印接口目标的实例以进一步操纵在步骤(c)中生成的格式化可打印信息。
42.权利要求41所述方法,还包括以下步骤(g)在操作系统中生成一个第三打印接口分类,该第三打印接口分类包括进一步操纵格式化可打印信息中的多个页面的命令和功能;(h)在应用程序中引用第三打印接口分类以生成一个导自第三打印接口分类的第三打印接口目标;以及(i)生成第三打印接口目标的实例以进一步操纵在步骤(f)中生成的格式化可打印信息。
43.权利要求42所述方法,其中的步骤(g)包括步骤(g1),该步骤(g1)包括用于从格式化可打印信息中的多个页面的第三打印接口分类生成一个n-up打印配置的命令和功能。
44.权利要求43所述方法,其中步骤(g1)包括步骤(gla),该步骤(gla)包括用于把格式化可打印信息中的每个页面转换成一预定位置的命令。
45.权利要求42所述方法,其中的步骤(g)包括在操作系统中生成一个第三打印接口分类的步骤(g2),该第三打印接口分类包括从格式化可打印信息中的多个页面中生成一个排版打印配置的命令和功能。
46.权利要求44所述方法,其中的步骤(g2)包括一个包括一个将格式化可打印信息中的每个页面转换成一预定位置的命令以及旋转格式化可打印信息中的每个页面到一预定位置的命令。
全文摘要
面向目标的打印接口包括文件成组或页码目标,它们在生成之后提供完整灵活并与应用程序透明的打印能力。打印接口目标包括以若干不同格式自动对打印信息标页号的那些目标,并提供页面组合,该页面组合包括加页边,脚注,页编号以及定位标记,n-up打印和页面排版,以及合并文本和图形材料。
文档编号G06F9/44GK1114514SQ94190669
公开日1996年1月3日 申请日期1994年1月6日 优先权日1993年6月21日
发明者L·拜利斯霍尔特 申请人:塔里根特公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1