DE69409487T2 - Betriebssystem mit objektorientierter druckschnittstelle - Google Patents
Betriebssystem mit objektorientierter druckschnittstelleInfo
- Publication number
- DE69409487T2 DE69409487T2 DE69409487T DE69409487T DE69409487T2 DE 69409487 T2 DE69409487 T2 DE 69409487T2 DE 69409487 T DE69409487 T DE 69409487T DE 69409487 T DE69409487 T DE 69409487T DE 69409487 T2 DE69409487 T2 DE 69409487T2
- Authority
- DE
- Germany
- Prior art keywords
- page
- printable information
- iterator
- printing
- format
- 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 - Lifetime
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/12—Digital output to print unit, e.g. line printer, chain printer
- G06F3/1296—Printer job scheduling or printer resource handling
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/103—Formatting, i.e. changing of presentation of documents
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/12—Digital output to print unit, e.g. line printer, chain printer
- G06F3/1201—Dedicated interfaces to print systems
- G06F3/1202—Dedicated interfaces to print systems specifically adapted to achieve a particular effect
- G06F3/1203—Improving or facilitating administration, e.g. print management
- G06F3/1205—Improving or facilitating administration, e.g. print management resulting in increased flexibility in print job configuration, e.g. job settings, print requirements, job tickets
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/12—Digital output to print unit, e.g. line printer, chain printer
- G06F3/1201—Dedicated interfaces to print systems
- G06F3/1223—Dedicated interfaces to print systems specifically adapted to use a particular technique
- G06F3/1224—Client or server resources management
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/12—Digital output to print unit, e.g. line printer, chain printer
- G06F3/1201—Dedicated interfaces to print systems
- G06F3/1223—Dedicated interfaces to print systems specifically adapted to use a particular technique
- G06F3/1237—Print job management
- G06F3/1244—Job translation or job parsing, e.g. page banding
- G06F3/1247—Job translation or job parsing, e.g. page banding by conversion to printer ready format
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/12—Digital output to print unit, e.g. line printer, chain printer
- G06F3/1201—Dedicated interfaces to print systems
- G06F3/1278—Dedicated interfaces to print systems specifically adapted to adopt a particular infrastructure
- G06F3/1285—Remote printer device, e.g. being remote from client or server
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/12—Digital output to print unit, e.g. line printer, chain printer
- G06F3/1293—Printer information exchange with computer
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Record Information Processing For Printing (AREA)
- Accessory Devices And Overall Control Thereof (AREA)
Description
- Abschnitte dieses Patentes enthalten Material, das dem Urheberrechtsschutz unterliegt. Der Eigentümer des Urheberschutzrechtes gestattet jedermann, eine Faksimilereproduktion des Patentdokumentes oder der Patentoffenbarung anzufertigen, so wie sie in den Dateien oder Aufzeichnungen des Patentamtes erscheinen.
- Diese Erfindung betrifft im allgemeinen Verbesserungen an Computersystemen und insbesondere an einer Betriebssystem-Software zum Drucken von Grafiken und Textdokumenten.
- Einer der wichtigsten Aspekte eines modernen Computersystems ist die Fähigkeit, einen Ausdruck von als Text vorliegenden Informationen oder Grafiken zu erzeugen, die vom Computer manipuliert, visuell dargestellt und gespeichert werden können. Um diese Aufgabe zu erfüllen, umfaßt ein Computersystem im allgemeinen eine Druckvorrichtung, die elektrisch an das Computersystem angeschlossen ist und von diesem gesteuert wird, um ein dauerhaftes Abbild an einem ausgewählten Medium zu erzeugen. Beispiele für Druckvorrichtungen, die häufig verwendet werden, sind Punktmatrixdrucker, Tintenstrahldrucker und Laserdrucker, die dauerhafte Abbilder auf Papier gemäß der Steuerung durch den Computer erzeugen. wenngleich Papier das am häufigsten verwendete Medium darstellt, kommen auch andere Medien, wie zum Beispiel Photopapier, oft zum Einsatz.
- Um ein Dokument, das am Monitor angezeigt wird oder im Speicher gespeichert ist, zu drucken, müssen mehrere Schritte ausgeführt werden. Da das Druckmedium im allgemeinen eine festgelegte Größe aufweist, müssen die druckbaren Informationen zuerst in Teile unterteilt werden, die klein genug sind, so daß sie auf das ausgewählte Medium passen. Dieser Prozeß wird als Seitenumbruch bezeichnet. Darüber hinaus müssen die Informationen von dem Format, in dem sie entweder angezeigt oder gespeichert werden, in ein Format umformatiert werden, welches zur Steuerung der Druckvorrichtung geeignet ist, um den eigentlichen Druckvorgang am Medium durchführen zu können. Das Neuformatieren in diesem letzteren Schritt kann auch das Einfügen von Steuerbefehlen in die druckbaren Informationen umfassen, um die Druckvorrichtung zu steuern. Zu diesen hinzugefügten Befehlen können zum Beispiel unter anderem Befehle wie Wagenrückläufe, Zeilenvorschübe, Formularvorschübe, Leerstellen und Zeichensatzinformationen gehören, die alle dazu dienen, die druckbaren Informationen zu formatieren. Das Neuformatieren kann auch einen Umwandlungsschritt umfassen, bei welchem eine grafische Darstellung in jene Form umgewandelt wird, die von der Druckvorrichtung verwendet wird.
- Der zum Umwandeln der druckbaren Informationen in eine Form, die von einer gegebenen Druckvorrichtung gedruckt werden kann, notwendige Seitenumbruch und die Neuformatierung werden im allgemeinen von Softwareprogrammen ausgeführt, die innerhalb des Computersystems laufen. Softwareprogramme, die auf einem Computersystem arbeiten, können im allgemeinen in zwei große Gruppen eingeteilt werden: Betriebssysteme, die für gewöhnlich einem Computersystem- Typ zugeordnet sind und aus einer Sammlung von Hilfsprogrammen bestehen, die das Computersystem befähigen, grundlegende Operationen auszuführen, wie zum Beispiel das Speichern und Laden von Informationen auf bzw. von einem peripheren Plattenspeicher, das Darstellen von Informationen auf einer dazugehörigen Videoanzeigevorrichtung, das Ausführen grundlegender Dateioperationen einschließlich der Erstellung, Benennung und Umbenennung von Dateien, und, in manchen Fällen, das Durchführen von Diagnoseoperationen, um Fehlfunktionen erkennen oder beheben zu können.
- Das Betriebssystem selbst bietet im allgemeinen nur sehr grundlegende Funktionen und muß von einem "Anwendungs"-Programm begleitet werden. Das Anwendungsprogramm interagiert mit dem Betriebssystem, um Funktionalitäten auf viel höherer Ebene und eine direkte Schnittstelle zum Benutzer zu bieten. Während der Interaktion zwischen dem Anwendungsprogramm und dem Betriebssystem verwendet das Anwendungsprogramm typischerweise die Funktionen des Betriebssystems, indem es eine Reihe von Aufgabenbefehlen an das Betriebssystem schickt, welches daraufhin die angeforderten Aufgaben ausführt. Zum Beispiel kann das Anwendungsprogramm das Betriebssystem auffordern, bestimmte Informationen im Plattenspeicher des Computers zu speichern oder die Informationen an der Videoanzeigevorrichtung darzustellen.
- Figur 1 ist eine schematische Darstellung eines typischen Computersystems, welches sowohl ein Anwendungsprogramm als auch ein Betriebssystem verwendet. Das Computersystem wird schematisch durch die strichlierte Box 100 dargestellt, das Anwendungsprogramm wird durch die Box 102 dargestellt, und das Betriebssystem wird durch die Box 106 dargestellt. Die Interaktion zwischen dem Anwendungsprogramm 102 und dem Betriebssystem 106 wird schematisch durch den Pfeil 104 dargestellt. Dieses Doppelprogrammsystem wird auf vielen Computersystem-Typen verwendet, angefangen von Mainframes bis hin zu Personalcomputern.
- Das Verfahren zur Handhabung des Druckens ist jedoch von Computer zu Computer unterschiedlich, und in dieser Hinsicht repräsentiert Figur 1 ein Personalcomputersystem des Standes der Technik. Um Druckfunktionen zur Verfügung zu stellen, interagiert das Anwendungsprogramm 102 (wie schematisch durch den Pfeil 108 dargestellt) mit der Drukkertreiber-Software 110. Die Druckertreiber-Software 110 steht im allgemeinen mit einem Anwendungsprogramm in Verbindung und formatiert die druckbaren Informationen nach Bedarf neu und wandelt sie, falls nötig, um. Da jeder Drucker sein eigenes Format und seine eigene Steuerbefehlsgruppe besitzt, die korrekt im Text eingebettet sein müssen, um den Drucker zu steuern, muß die Druckertreiber- Software 110 speziell entwickelt werden, um mit einem Drucker oder einem Druckertyp arbeiten zu können.
- Die Druckertreiber-Software 110 erzeugt einen neuformatierten Informationsstrom, der die eingebetteten Befehle enthält, wie dies schematisch durch den Pfeil 114 dargestellt ist. Der umgewandelte Informationsstrom wird wiederum zu einem Druckeranschluß 112 geschickt, der einen Schaltkreis enthält, welcher den einlangenden Informationsstrom in elektrische Signale umwandelt. Die Signale werden wiederum über ein Kabel 116 zum Drucker 118 geschickt. Der Drucker 118 enthält fur gewohnlich eine "Abbildemaschine", bei der es sich um eine Hardware-Vorrichtung oder einen ROM-programmierten Computer handelt, der den einlagenden Informationsstrom in Empfang nimmt und ihn in jene elektrischen Signale umwandelt, die zum Antrieb der eigentlichen Druckelemente notwendig sind. Das Ergebnis ist ein Ausdruck, der auf das ausgewählte Medium ausgegeben wird.
- Wenngleich die in Figur 1 dargestellte Konfiguration im allgemeinen auf zufriedenstellende Weise arbeitet, weist sie doch mehrere Nachteile auf. Da die Druckertreiber- Software 110 speziell für die einzelnen Druckertypen erstellt wird, muß ein eigener Treiber für jeden Druckertyp, mit dem das Anwendungsprogramm zusammenarbeiten soll, zur Verfügung gestellt werden. Im Personalcomputer-Markt gibt es eine große Anzahl unterschiedlicher Druckertypen, die mit den einzelnen Computertypen kompatibel sind. Daher stieg mit zunehmender Anzahl an Druckertypen auch die Anzahl der Druckertreiber, die für jedes einzelne Anwendungsprogramm notwendig waren, damit das Programm mit den meisten verfügbaren Druckern kompatibel war. Daher mußten Programmierer von Anwendungsprogrammen mit jedem Anwendungsprogramm eine immer größer werdende Anzahl an Druckertreibern erstellen, was zu Verschwendung an Zeit und Arbeit und zu verschwendetem Plattenspeicher führte, der notwendig war, um die Treiber zu speichern, yon denen nur einer oder zwei für einen Anwender von Interesse waren. Wenn jedoch ein Anwender ein Anwendungsprogramm kaufte und dieses keinen Druckertreiber enthielt, der in der Lage war, den Drucker, den der Anwender besaß, zu steuern, kam es zu unvorhersehbaren Operationen, was zu Programmrückgaben und Unzufriedenheit bei den Anwendern führte.
- Darüber hinaus mußte auch jedes Anwendungsprogramm Druckfunktionen hoher Ebene zur Verfügung stellen, wie zum Beispiel die Funktionen Seitenumbruch und Seitenzusammenstellung (einschließlich dem Hinzufügen von Rändern, Fußnoten, Abbildungsnummern, usw.), wenn derartige Funktionen erwünscht waren. In der Folge mußte jeder Programmierer von Anwendungsprogrammen viel Zeit für die Entwicklung von Programmen aufwenden, um allgemeine Druckfunktionen zu implementieren, die für jedes Anwendungsprogramm eigen waren, was zu verdoppeltem Arbeitsaufwand und vergeudeter Zeit führte.
- Um die zuvor erwähnten Schwierigkeiten zu beseitigen, wurde die Anordnung des Standes der Technik wie in Figur 2 dargestellt modifiziert. In dieser neuen Anordnung wird das Computersystem 200 immer noch vom Anwendungsprogramm 202 gesteuert, welches, wie schematisch durch den Pfeil 204 dargestellt, mit dem Betriebssystem 206 zusammenarbeitet. In dem in Figur 2 dargestellten System umfaßt das Betriebssystem 206 jedoch Druckertreiber 214. Es muß zwar noch immer ein eigener Druckertreiber für jeden einzelnen Drukkertyp zur Verfügung gestellt werden, aber die Druckertreiber werden mit dem Betriebssystem verkauft und stellen einen Bestandteil desselben dar. Daraus ergibt sich, daß es nicht mehr notwendig ist, daß jedes Anwendungsprogramm seine eigene Druckertreibergruppe besitzt. Ein Anwendungsprogramm, wie zum Beispiel das Anwendungsprogramm 202, kommuniziert mit dem Druckertreiber 214 mit Hilfe einer standardisierten Schnittstelle 210. Zwei allgemein verwendete Schnittstellen werden als "grafports" oder "device contexts" bezeichnet. Auf veranschaulichende Weise sendet das Anwendungsprogramm 202 Informationen (schematisch dargestellt durch den Pfeil 208) in standardisierter Form an den grafport 210. Der grafport 210 leitet die Informationen wiederum, wie durch den Pfeil 212 dargestellt, zum Druckertreiber 214 weiter, welcher die Informationen, wie oben beschrieben, neu formatiert und in das vom Drucker benötigte Format umwandelt. Die Ausgabe des Druckertreibers 214 erfolgt (wie auf veranschaulichende Weise durch den Pfeil 216 dargestellt) zum Druckeranschluß 218, wo sie in elektrische Signale umgewandelt wird, die über das Kabel 220 zum Drucker 222 übertragen werden.
- Die in Figur 2 dargestellte Konfiguration weist den Vorteil auf, daß sich der Entwickler des Anwendungsprogramms nicht um die jeweilige Kombination von Computer und Drucker kümmern muß, auf der das Programm letztlich laufen wird, um das Anwendungsprogramm mit entsprechenden Druckfähigkeiten auszustatten. Diese Möglichkeit weist jedoch immer noch den Nachteil auf, daß Druckfähigkeiten höherer Ebene, wie zum Beispiel die Funktionen Seitenumbruch und Seitenzusammenstellung, soferne diese gewünscht werden, immer noch in jedes einzelne Anwendungsprogramm eingebaut werden müssen, wodurch ein Duplizieren von Programmcode und ein Verschwenden von Programmierressourcen verursacht wird.
- Demgemäß ist es eine Aufgabe der vorliegenden Erfindung, eine flexible und weitgehend autonome Druckerschnittstelle zu schaffen, so daß ein Anwendungsprogramm Druckfähigkeiten hoher Ebene mittels einer einfachen Befehlsstruktur zur Verfügung stellen kann, ohne sich um die eigentlichen Einzelheiten der Implementierung kümmern zu müssen.
- Es ist eine weitere Aufgabe der vorliegenden Erfindung, eine flexible Druckerschnittstelle zu schaffen, die es Programmierern von Anwendungsprogrammen, die eine exakte Steuerung des Druckprozesses benötigen, erlaubt, diese Steuerung durch eine umfangreiche Gruppe von Druckbefehlen zu erzielen, die verfügbar sind, aber nicht von jedem Anwendungsprogramm verwendet werden müssen.
- Die zuvor erwähnten Probleme werden durch ein System und ein Verfahren gemäß Anspruch 1 und 12 gelöst. Eine veranschaulichende Ausführungsform der Erfindung zeigt eine objektorientierte Druckerschnittstelle mit Dokumentengruppierungs- oder Numerierungsobjekten, die nach Instantiierung vollständige und flexible Druckfähigkeiten zur Verfügung stellen, die für das Anwendungsprogramm unsichtbar sind. Die Druckerschnittstellenobjekte umfassen Objekte, die in der Lage sind, auf verschiedene Arten automatisch Seitenumbrüche an druckbaren Informationen durchzuführen, wobei sie eine Seitenzusammenstellung einschließlich dem Hinzufügen von Rändern, Fußnoten, Seitennummern und Orientierungsmarken und das Kombinieren von Textmaterial mit Graphikmaterial ermöglichen.
- Die erfinderische objektorientierte Druckerschnittstelle kommuniziert mit dem Rest des Betriebssystems mittels einer Standardschnittstelle, wie zum Beispiel einem grafport, und innerhalb des Betriebssystems stehen Druckertreiber für jeden Druckertyp zur Verfügung. Somit muß sich eine Anwendung nicht um die jeweilige Drucker-/Computerkombination kümmern, mit der sie zusammenarbeiten soll, und es müssen auch keine Fähigkeiten zur Dokumentenformatierung in sie eingebaut sein.
- Die oben genannten sowie weitere Vorteile der Erfindung können besser durch die Bezugnahme auf die folgende Beschreibung in Verbindung mit den begleitenden Zeichnungen verstanden werden, in denen:
- Figur 1 ein schematisches Blockdiagramm eines Computersystems des Standes der Technik ist, welches die Beziehung zwischen dem Anwendungsprogramm und dem Betriebssystem und dem Druckertreiber zeigt;
- Figur 2 ein schematisches Blockdiagramm einer Modifizierung des in Figur 1 dargestellten Systems des Standes der Technik ist, um dem Anwendungsprogramm die Schaffung einer Schnittstelle zu einer Standard-Druckerschnittstelle zu ermöglichen.
- Figur 3 ein schematisches Blockdiagramm eines Computersystems, wie zum Beispiel eines Personalcomputer-Systems, darstellt, auf welchem die erfinderische objektorientierte Druckerschnittstelle arbeitet;
- Figur 4 ein schematisches Blockdiagramm eines modifizierten Computersystems darstellt, bei welchem das Betriebssystem eine erfinderische objektorientierte Druckerschnittstelle umfaßt;
- Figur 5 ein schematisches Blockdiagramm der Informationspfade und der Hardware darstellt, durch welche druckbare Informationen durch einen Zwischenspeicher zu einer Druckvorrichtung geleitet werden;
- Figur 6 ein schematisches Diagramm darstellt, welches auf veranschaulichende Weise Druckobjekte in der Druckerschnittstelle zeigt, die vom Anwendungsprogramm referenziert werden können;
- Figur 7 ein vereinfachtes Klassenhierarchie-Diagramm ist, das die Basis, die Unterklassen und die zugeordneten Klassen zeigt, die in der Konstruktion eines Einzelseiten- Numerierungsobjektes involviert sind;
- Figur 8 eine schematische Ansicht ist, die zeigt, wie eine Anordnung von druckbaren Informationen, die als "Ansicht" bezeichnet wird, vom Paginierungsobjekt der Erfindung in einzelne Stücke "paginiert" wird;
- Figur 9 eine schematische Darstellung eines Gittersystems ist, das über eine Ansicht gelegt werden kann, um die Festlegung der Reihenfolge der Abtastordnung zu erleichtern;
- Figur 10 eine Sammlung von Seiten ist, welche acht "Raster"-Musterabtastordnungen zeigt;
- Figur 11 ein veranschaulichendes Flußdiagramm eines Verfahrens ist, mit dessen Hilfe eine Ansicht gemäß einem Paginierungsmodell, das vom Paginator-Objekt verwendet wird, in seitengroße Stücke paginiert wird;
- Figur 12 ein veranschaulichendes Flußdiagramm eines Verfahrens ist, mit dessen Hilfe eine Ansicht gemäß einem zweiten Paginierungsmodell, das vom Paginator-Objekt verwendet wird, in seitengroße Stücke paginiert wird;
- Figur 13 ein veranschaulichendes Flußdiagramm eines Verfahrens ist, mit dessen Hilfe eine Ansicht gemäß einem dritten Paginierungsmodell, das vom Paginator-Objekt verwendet wird, in seitengroße Stücke paginiert wird;
- Figur 14A-14C schematische Diagramme von Seiten darstellen, die jeweils gemäß den drei vom veranschaulichenden Paginator-Objekt verwendeten Paginator-Modellen erzeugt wurden;
- Figur 15 ein veranschaulichendes Flußdiagramm eines Verfahrens zur Suche der nächsten Seite in einer beispielhaften Abtastordnung darstellt, welche als "Abtastordnung rechts unten" bezeichnet wird;
- Figur 16 ein veranschaulichendes Flußdiagramm eines Verfahrens zur Suche der nächsten Seite in einer beispielhaften Abtastordnung darstellt, welche als "Abtastordnung links oben" bezeichnet wird;
- Figur 17 ein veranschaulichendes Flußdiagramm einer Druckroutine ist, die von einem Seiten-Iterator verwendet wird, um die erste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 18 ein veranschaulichendes Flußdiagramm einer Druckroutine ist, die von einem Seiten-Iterator verwendet wird, um die nächste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 19 ein veranschaulichendes Flußdiagramm einer Routine ist, die zum Drucken von Seiten eines Seitennumerierungsobjektes verwendet wird;
- Figur 20 ein vereinfachtes Klassenhierarchie-Diagramm ist, das die Basis, die Unterklassen und die zugeordneten Klassen zeigt, die in der Konstruktion eines Mischblatt- Numerierungsobjektes involviert sind;
- Figur 21 ein veranschaulichendes Flußdiagramm einer Druckroutine ist, die von einem Mischblatt-Numerierungsiterator verwendet wird, um die erste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 22 ein veranschaulichendes Flußdiagramm einer Druckroutine ist, die von einem Mischblatt-Numerierungsiterator verwendet wird, um die nächste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 23 ein vereinfachtes Klassenhierarchie-Diagramm ist, das die Basis, die Unterklassen und die zugeordneten Klassen zeigt, die in der Konstruktion eines Seitenzusammensetzungsobjektes involviert sind;
- Figur 24A-24B schematische Diagramme von Seitenanordnungen sind, die von n-aufwärts-Seitenzusammensetzungsobjekten und Seitenausschießer-Objekten ausgeführt werden;
- Figur 25A-25B zwei Teile eines veranschaulichenden Flußdiagramms einer Druckroutine darstellen, die von einem n-aufwärts-Seitenzusammensetzungsobjekt verwendet werden, um die erste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 26A-26B zwei Teile eines veranschaulichenden Flußdiagramms einer Druckroutine darstellen, die von einem n-aufwärts-Seitenzusammensetzungsobj ekt verwendet werden, um die nächste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 27 ein veranschaulichendes Flußdiagramm einer Druckroutine darstellt, die von einem n-aufwärts-Seitenzusammensetzungsobjekt verwendet wird, um eine bestimmte Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 28 ein veranschaulichendes Flußdiagramm einer Routine darstellt, die von dem Ausschieß-Sequenzer verwendet wird, um die nächste Seite des Quelldokumentes für das Ausschießen einer zuvor ausgewählten Seite auszuwählen;
- Figur 29 ein veranschaulichendes Flußdiagramm einer Routine darstellt, die von dem Ausschieß-Sequenzer verwendet wird, um die Drehung der ausgewählten Quellseite für das Ausschießen an einer zuvor ausgewählten Seite auszuwählen;
- Figur 30 ein veranschaulichendes Flußdiagramm einer Druckroutine ist, die von einem Seitenausschieß-Objekt verwendet wird, um die erste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 31 ein veranschaulichendes Flußdiagramm einer Druckroutine ist, die von einem Seitenausschieß-Objekt verwendet wird, um die nächste Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen;
- Figur 32 ein veranschaulichendes Flußdiagramm einer Druckroutine ist, die von einem Seitenausschieß-Objekt verwendet wird, um eine bestimmte Seite in einer zuvor ausgewählten Abtastordnung zum Drucken auszuwählen.
- Die Erfindung wird vorzugsweise im Zusammenhang mit einem Betriebssystem angewandt, das sich auf einem Personalcomputer, wie zum Beispiel dem IBM PS/2 oder einem Apple Macintosh Computer, befindet. Eine repräsentative Hardwareumgebung ist in Figur 3 dargestellt, welche eine typische Hardwarekonfiguration eines Computers 300 gemäß der vorliegenden Erfindung zeigt. Der Computer 300 wird von einer Zentraleinheit 302 gesteuert, bei der es sich um einen herkömmlichen Mikroprozessor handeln kann; eine Anzahl anderer Einheiten, die alle über einen Systembus 308 miteinander verbunden sind, ist ebenfalls vorhanden, um bestimmte Aufgaben auszuführen. Wenngleich ein bestimmter Computer vielleicht nur einige der in Figur 3 dargestellten Einheiten aufweisen oder zusätzliche Komponenten besitzen kann, welche nicht dargestellt sind, werden die meisten Computer zumindest die dargestellten Einheiten aufweisen.
- Insbesondere umfaßt der in Figur 3 dargestellte Computer 300 einen Direktzugriffsspeicher (RAM) 306 für die zeitweilige Speicherung von Informationen, einen Nur-Lesen- Speicher (ROM) 304 für die dauerhafte Speicherung der Konfiguration des Computers und der grundlegenden Betriebsbefehle, und einen Eingabe-/Ausgabe- (E/A) Adapter 310 für den Anschluß von Peripheriegeräten, wie zum Beispiel einer Platteneinheit 313 und eines Drucker 314 am Bus 308 über die Kabel 315 bzw. 312. Es steht auch ein Benutzerschnittstellenadapter 316 für den Anschluß von Eingabegeräten, wie zum Beispiel einer Tastatur 320, und anderer bekannter Schnittstellengeräte, einschließlich Mäusen, Lautsprechern und Mikrophonen, am Bus 308 zur Verfügung. Die visuelle Ausgabe erfolgt über einen Anzeigenadapter 318, der den Bus 308 mit einem Anzeigegerät 322, wie zum Beispiel einem Videomonitor, verbindet. Auf der Workstation befindet sich eine Betriebssystemsoftware, wie zum Beispiel das Apple System/7-Betriebssystem, welches die Workstation steuert und koordiniert.
- In einer bevorzugten Ausführungsform wird die Erfindung in der C++-Programmiersprache mit Hilfe objektorientierter Programmiertechniken implementiert. C++ ist eine kompilierte Sprache, das heißt, Programme werden in einem für den Menschen leicht lesbaren Skript geschrieben, und dieses Skript wird dann von einem anderen Programm, einem sogenannten Kompilierer, bearbeitet, der einen maschinenlesbaren numerischen Code daraus erzeugt, welcher in den Computer geladen und von diesem direkt ausgeführt werden kann. Wie unten beschrieben, besitzt die C++-Sprache bestimmte Merkmale, die es einem Softwareentwickler erlauben, Programme, die von anderen geschrieben wurden, auf einfache Weise zu verwenden und gleichzeitig eine umfangreiche Kontrolle über die Wiederverwendung der Programme zu wahren, um deren Zerstörung oder unsachgemäße Verwendung zu verhindern. Die C++-Sprache ist gut bekannt, und viele Artikel und Texte sind verfügbar, in denen diese Sprache im Detail beschrieben wird. Darüber hinaus sind C++ -Kompilierer von mehreren Herstellern einschließlich Borland International und der Firma Microsoft kommerziell erhältlich. Aus Gründen der Verständlichkeit werden daher die Details der C++-Sprache und der Betrieb des C++-Kompilierers in diesem Dokument nicht näher behandelt.
- Wie den Fachleuten dieses Bereiches bekannt ist, umfassen die Objektorientierten Programmier- (OOP) Techniken die Definition, Erstellung, Verwendung und Zerstörung von "Objekten". Diese Objekte sind Software-Einheiten, die Datenelemente und Routinen bzw. Funktionen umfassen, welche die Datenelemente manipulieren. Die Daten und damit in Verbindung stehenden Funktionen werden von der Software als eine Einheit behandelt und können erzeugt, verwendet und gelöscht werden, als ob es sich dabei um einen einzigen Gegenstand handeln würde. Gemeinsam machen es die Daten und Funktionen den Objekten möglich, nahezu jede Echtwelt- Einheit hinsichtlich ihrer Merkmale, welche von den Datenelementen repräsentiert werden, und ihrem Verhalten, welches von ihren Datenmanipulationsfunktionen repräsentiert wird, zu modellieren. Auf diese Weise können Objekte konkrete Dinge wie Personen und Computer modellieren, und sie können auch abstrakte Begriffe wie Zahlen oder geometrische Begriffe modellieren.
- Objekte werden durch Erzeugung von "Klassen" definiert, die selbst keine Objekte sind, aber die als Vorlagen dienen, welche dem Kompilierer mitteilen, wie das eigentliche Objekt zu konstruieren ist. Eine Klasse kann zum Beispiel die Anzahl und Art der Datenvariablen und die Schritte festlegen, die mit den Funktionen, welche die Daten manipulieren, im Zusammenhang stehen. Ein Objekt wird eigentlich im Programm mittels einer speziellen Funktion erstellt, die als Konstruktor bezeichnet wird, und welche die entsprechende Klassendefinition und zusätzliche Informationen, wie zum Beispiel Argumente, verwendet, die während der Objekterstellung zur Verfügung gestellt werden, um das Objekt zu konstruieren. Auf ähnliche Weise werden Objekte von einer speziellen Funktion, die als Destruktor bezeichnet wird, zerstört. Objekte können durch Verwendung ihrer Daten und Aufruf ihrer Funktionen verwendet werden.
- Die Hauptvorteile der objektorientierten Programmiertechniken ergeben sich aus drei grundlegenden Prinzipien: Einkapselung, Polymorphismus und Vererbung. Insbesondere können Objekte entsprechend konstruiert werden, um die gesamte interne Datenstruktur und die internen Funktionen oder einen Teil davon zu verstecken oder einzukapseln. Insbesondere kann ein Programmentwickler während der Programmerstellung Objekte definieren, in denen alle oder einige der Datenvariablen und alle oder einige der damit im Zusammenhang stehenden Funktionen als "privat" oder zur ausschließlichen Verwendung durch das Objekt selbst betrachtet werden. Andere Daten oder Funktionen können als "offentlich" erklärt oder für die Verwendung durch andere Programme freigegeben werden. Der Zugriff auf die privaten Variablen durch andere Programme kann durch das Festlegen öffentlicher Funktionen für ein Objekt gesteuert werden, welche auf die privaten Daten des Objektes zugreifen. Die öffentlichen Funktionen bilden eine kontrollierte und konsistente Schnittstelle zwischen den privaten Daten und der "Außenwelt". Jeder Versuch, einen Programmcode zu schreiben, der direkt auf die privaten Variablen zugreift, führt dazu, daß der Kompilierer einen Fehler während der Programmkompilierung erzeugt, der den Kompilierungsvorgang stoppt und verhindert, daß das Programm ausgeführt werden kann.
- Polymorphismus ist ein Konzept, das es Objekten und Funktionen, welche dasselbe Gesamtformat aufweisen, aber mit unterschiedlichen Daten arbeiten, erlaubt, auf unterschiedliche Weise zu arbeiten, um konsistente Ergebnisse zu produzieren. Zum Beispiel kann eine Additionsfunktion als Variable A plus Variable B (A+B) definiert werden, und dieses selbe Format kann unabhängig davon verwendet werden, ob es sich bei A und B um Zahlen, Zeichen oder Dollar und Cent handelt. Der eigentliche Programmcode jedoch, der die Addition ausführt, kann sich je nach Art der Variablen, die A und B enthalten, stark unterscheiden. Polymorphismus ermöglicht das Schreiben dreier separater Funktionsdefinitionen, nämlich eine für jede Variablenart (Zahlen, Zeichen und Dollar). Nachdem die Funktionen definiert wurden, kann ein Programm später durch sein gemeinsames Format (A+B) auf die Additionsfunktion Bezug nehmen, und während der Kompilierung wird der C++-Kompilierer durch Überprüfung der Variablentypen bestimmen, welche der drei Funktionen nun tatsächlich verwendet wird. Daraufhin wird der Kompilierer den entsprechenden Funktionscode ersetzen. Polymorphismus ermöglicht es, daß ähnliche Funktionen, die zu analogen Ergebnissen führen, im Quellcode des Programms "zusammengefaßt" werden, um einen logischeren und klareren Programmablauf zu erzeugen.
- Das dritte Prinzip, das der objektorientierten Programmierung zugrunde liegt, ist die Vererbung, die es Programmentwicklern erlaubt, bereits bestehende Programme auf einfache Art wiederzuverwenden und dadurch eine Softwareerzeugung von Beginn an überflüssig machen. Das Prinzip der Vererbung ermöglicht es einem Softwareentwickler, Klassen (und die Objekte, die später von ihnen erzeugt werden) als miteinander in einer Beziehung stehend zu deklarieren. Insbesondere können Klassen als Unterklassen anderer Basisklassen festgelegt werden. Eine Unterklasse "erbt" alle öffentlichen Funktionen ihrer Basisklassen und kann auf diese so zugreifen, als ob diese Funktionen in der Unterklasse selbst enthalten wären. Alternativ dazu kann eine Unterklasse einige oder alle ihrer geerbten Funktionen überschreiben oder einige oder alle ihrer geerbten Funktionen modifizieren, indem sie einfach eine neue Funktion mit derselben Form definiert (das Überschreiben oder Modifizieren ändert die Funktion in der Basisklasse nicht, sondem modifiziert bloß die Verwendung der Funktion in der Unterklasse). Die Erzeugung einer neuen Unterklasse, die einen Teil der Funktionalität (bei selektiver Modifizierung) einer anderen Klasse besitzt, ermöglicht es Softwareentwicklern, auf einfache Weise bestehenden Code maßzuschneidern, um bestimmte Bedürfnisse zu erfüllen.
- Obwohl das objektorientierte Programmieren wesentliche Verbesserungen gegenüber anderen Programmierkonzepten bietet, erfordert die Programmentwicklung dennoch einen großen Zeit- und Arbeitsaufwand, besonders dann, wenn keine fertigen Softwareprogramme vorhanden sind, die modifiziert werden können. Daher war es bis jetzt Stand der Technik, einem Programmentwickler eine Reihe vordefinierter, miteinander verknüpfter Klassen zur Verfügung zu stellen, die eine Gruppe von Objekten erzeugen, sowie verschiedene zusätzliche Routinen, die alle auf die Ausführung allgemein auftretender Aufgaben in einer bestimmten Umgebung ausgerichtet sind. Solche vordefinierten Klassen und Bibliotheken werden typischerweise als "Anwendungsrahmenwerke" bezeichnet und bieten eine vorfabrizierte Struktur für eine Arbeitsanwendung.
- So könnte zum Beispiel ein Anwendungsrahmenwerk für eine Benutzerschnittstelle eine Gruppe von vordefinierten Grafikschnittstellenobjekten bieten, die Fenster, Rollbalken, Menüs usw. erzeugen und die Unterstützung und das "Standard"-Verhalten für diese Grafikschnittstellenobjekte bieten. Da Anwendungsrahmenwerke auf objektorientierten Techniken basieren, können die vordefinierten Klassen als Basisklassen verwendet werden, und das eingebaute Standardverhalten kann von Unterklassen, die vom Entwickler definiert werden, geerbt und entweder modifiziert oder überschrieben werden, damit Entwickler das Rahmenwerk erweitern und maßgeschneiderte Lösungen in einem bestimmten Fachbereich erstellen können. Dieser objektorientierte Ansatz bietet gegenüber dem herkömmlichen Programmieren große Vorteile, da der Programmierer das Originalprogramm nicht ändert, sondern vielmehr die Fähigkeiten des Originalprogramms erweitert. Darüber hinaus arbeiten sich Entwickler nicht blind durch Schichten von Codes hindurch, weil das Rahmenwerk eine architekturbezogene Führung und Modellierung bietet und gleichzeitig die Entwickler befreit, damit diese spezifische Maßnahmen im Hinblick auf den Problembereich ergreifen können.
- Es gibt viele verschiedene Arten von Anwendungsrahmenwerken, die zur Verfügung stehen, welche von der Ebene des damit zusammenhängenden Systems und der Art des zu lösenden Problems abhängen. Die Arten der Rahmenwerke reichen von Anwendungsrahmenwerken hoher Ebene, die bei der Entwicklung einer Anwenderschnittstelle helfen, bis hin zu Rahmenwerken niedrigerer Ebene, welche grundlegende Systemsoftwareservices, wie zum Beispiel Kommunikation, Drucken, Dateiablagesystemunterstützung, Grafik usw. bieten. Kommerzielle Beispiele für Anwendungsrahmenwerke sind MacApp (Apple), Bedrock (Symantec), OWL (Borland), NeXTStep App Kit (NeXT), und Smalltalk-80 MVC (ParcPlace).
- Während der Ansatz der Anwendungsrahmenwerke alle Prinzipien der Einkapselung, der Polymorphie und der Vererbung auf die Objektschicht anwendet und eine wesentliche Verbesserung gegenüber anderen Programmiertechniken darstellt, entstehen bei diesem Ansatz doch auch Schwierigkeiten. Diese Schwierigkeiten beruhen auf der Tatsache, daß es für Entwickler einfach ist, ihre eigenen Objekte wiederzuverwenden, jedoch schwierig, Objekte zu verwenden, die von anderen Programmen erzeugt wurden. Des weiteren bestehen Anwendungsrahmenwerke im allgemeinen aus einer oder mehreren "Schichten" an der Spitze eines monolithischen Betriebssystems, und selbst angesichts der Flexibilität der Objektschicht ist es oft noch notwendig, mittels mühevoller Prozeduraufrufe direkt mit dem darunterliegenden Betriebssystem zu interagieren.
- In derselben Weise, wie ein Anwendungsrahmenwerk dem Entwickler eine vorfabrizierte Funktionalität für ein Anwendungsprogramm bietet, kann ein Systemrahmenwerk, wie zum Beispiel jenes, welches in einer bevorzugten Ausführungsform enthalten ist, eine vorfabrizierte Funktionalität für Systemebenenservices bieten, welche von den Entwicklern modifiziert oder überschrieben werden können, um maßgeschneiderte Lösungen zu erstellen, wodurch die mühevollen Prozeduraufrufe vermieden werden, die bei Anwendungsrahmenwerkprogrammen des Standes der Technik notwendig sind. Man denke zum Beispiel an ein Druck-Rahmenwerk, welches die Grundlage für automatischen Seitenumbruch, Vordruckverarbeitung und Seitenzusammenstellung für druckbare Informationen bietet, die von einem Anwendungsprogramm erzeugt werden. Ein Anwendungssoftwareentwickler, der diese Fähigkeiten benötigt, würde normalerweise spezifische Routinen schreiben müssen, um diese Fähigkeiten bereitzustellen. Um dies mit einem Rahmenwerk zu tun, muß der Entwickler nur die Merkmale und Verhalten der fertigen Ausgabe zur Verfügung stellen, während das Rahmenwerk die eigentlichen Routinen liefert, welche die Aufgaben ausführen.
- Eine bevorzugte Ausführungsforrn geht vom Konzept der Rahmenwerke aus und wendet dieses im gesamten System einschließlich des Anwendungs- und Betriebssystems an. Für den kommerziellen oder firmeninternen Entwickler, den Systemintegrator oder OEM bedeutet dies, daß all die Vorteile, die für ein Rahmenwerk wie zum Beispiel MacApp dargestellt wurden, nicht nur auf die Anwendungsebene für solche Dinge wie Text und Anwenderschnittstellen übertragen werden können, sondern auch auf die Systemebene, für Dienstleistungen wie zum Beispiel Drucken, Grafiken, Multimedia, Dateisysteme, E/A, Testdurchführung, usw.
- Figur 4 zeigt eine schematische Übersicht eines Computersystems, das die objektorientierte Druckerschnittstelle der vorliegenden Erfindung verwendet. Das Computersystem ist im allgemeinen als strichlierte Box 400 dargestellt, und ein Anwendungsprogramm 402 und ein Betriebssystem 406 sind vorhanden, um die Operationen des Computers zu steuern und zu koordinieren. Das Anwendungsprogramm 402 kommuniziert mit dem Betriebssystem 406, wie dies durch den Pfeil 404 angezeigt wird. Gemäß einer Ausführungsforrn der Erfindung kann das Anwendungsprogramm 402 nun jedoch, anstatt direkt mit einer Standardschnittstelle, wie zum Beispiel dem grafport 410, zu kommunizieren, mit dem Betriebssystem 406 auf einer höheren Ebene kommunizieren, wenn es Informationen drucken möchte. Diese letztgenannte Interaktion wird erzielt, indem eine objektorientierte Druckerschnittstelle geschaffen wird, wie sie schematisch als Box 424 dargestellt ist. Wie im folgenden noch genauer beschrieben wird, reagiert die Druckerschnittstelle 424 auf eine Reihe einfacher Befehle, die vom Anwendungsprogramm 402 erzeugt werden, um verschiedene Formatierungs- und Paginierungsfunktionen auszuführen. Die formatierten, druckbaren Informationen werden danach zu einem grafport 410 übertragen, wie dies schematisch durch den Pfeil 426 dargestellt ist. Das Anwendungsprogramm 402 kann wie in der Anordnung des Standes der Technik direkt mit dem grafport 410 kommunizieren, aber es wird nicht davon ausgegangen, daß die meisten Anwendungen dies tun werden, soferne keine speziellen Abläufe benötigt werden.
- Auf jeden Fall fließen die Informationen aber durch den grafport 410 und werden, wie durch den Pfeil 412 dargestellt, einem Drucker-Behandlungsprogramm 414 zur Verfügung gestellt. Das Drucker-Behandlungsprogramm 414 ist ähnlich wie die zuvor beschriebenen Druckertreiber. Es ist jedoch "intelligent" und bietet einige zusätzliche Fähigkeiten, die im folgenden beschrieben werden. Im wesentlichen verarbeitet das Drucker-Behandlungsprogramm 414 den durch den Pfeil 412 dargestellten einlangenden Datenstrom und fügt die erforderlichen Druckerbefehle hinzu, um den zugeordneten Drucker, der schematisch als Drucker 422 dargestellt ist, zu steuern. Die neuformatierten Daten werden, wie durch den Pfeil 416 dargestellt, zu einem Druckeranschluß 418 geschickt, der die Daten in elektrische Signale umwandelt, welche über das Kabel 420 zum Drucker 422 geschickt werden.
- Der eigentliche Mechanismus, durch den ein von der Druckerschnittstelle 424 erzeugtes Dokument zu einem Drukker 422 übertragen wird, ist detaillierter in Figur 5 dargestellt. Insbesondere erzeugt die Druckerschnittstelle 424 (wie dies im folgenden noch näher beschrieben wird) ein Gebilde, das schematisch als Dokumentennumerierung 500 in Figur 5 dargestellt ist. Die Dokumentennumerierung kann aus Text, Grafiken oder einer Kombination dieser beiden bestehen, die alle auf eine vom Anwendungsprogramm vorgegebene Weise formatiert und angeordnet sind. Die Dokumentennumerierungsinformationen werden, wie durch den Pfeil 512 dargestellt, an einen Druckkanal 502 gesandt. Der Druckkanal 502 ist ein Objekt, das erzeugt wird, um die Informationen zu einem entsprechenden Drucker zu transportieren. Der Druckkanal verwendet eine Druckauftragsbeschreibung und eine Druckerkennung, welche vom Anwendungsprogramm zur Verfügung gestellt werden, um die druckbaren Informationen zum entsprechenden Drucker zu übertragen.
- Nachdem der Druckkanal 502 einen Druckauftrag empfangen hat, überträgt er die druckbaren Informationen an ein Spool-Programm 518, wie dies durch den Pfeil 514 dargestellt ist. Das Spool-Programm 518 empfängt den einlangenden Informationsstrom und speichert ihn in der einlangenden Reihenfolge in einem Zwischenspeicher 522, wie dies durch den Pfeil 520 dargestellt ist. Der Druckkanal 502 sendet daraufhin über die Verbindung 504 eine Meldung zu einem Druckserverprogramm 506, die das Druckserverprogramm 506 darüber informiert, daß ein neuer Druckauftrag vorhanden ist. Bei dem Druckserverprogramm 506 handelt es sich um ein Standardprogramm, das alle Druckaufträge überwacht, die erstellt wurden, und das auch die verfügbaren Drucker überprüft, um ihren Status zu bestimmen.
- Nachdem ein Druckauftrag vollständig gespooled oder in einem Zwischenspeicher 522 gespeichert ist, benachrichtigt der Druckserver 506 ein Drucker-Behandlungsprogramm 510 mittels einer Verbindung. Das Drucker-Behandlungsprogramm ist eine Art Druckertreiber, der einen bestimmten Drucker steuert und antreibt: sein Zweck besteht darin, Text- und Grafikinformationen für jeden beliebigen Druckertyp in eine für den Drucker lesbare Form umzuwandeln. Typischerweise kann ein Drucker-Behandlungsprogramm nur einen Druckauftrag abarbeiten, und andere Aufträge, die erzeugt oder an den zugeordneten Drucker gerichtet werden, werden für die spätere Verarbeitung in eine Warteschlange gestellt. Das Drucker-Behandlungsprogramm enthält ein Despooler-Programm (dargestellt als Box 516), welches die gespoolten Daten aus dem Zwischenspeicher 522 holt (wie dies durch den Pfeil 524 dargestellt ist) und die Informationen, wie durch den Pfeil 526 dargestellt, an eine Abbildungsmaschine, schematisch dargestellt als Box 532, leitet. Die Abbildungsmaschine 532 wandelt den einlangenden Datenstrom in die Befehlssignale um, die notwendig sind, um die Druckelemente anzutreiben, um das gedruckte Enddokument zu erzeugen. Die Befehle, die schematisch durch den Pfeil 430 dargestellt sind, werden für den Ausdruck zum eigentlichen Druckgerät, dargestellt durch die Box 528, gesandt.
- Nachdem ein Druckauftrag vollständig ausgedruckt wurde, prüft das Drucker-Behandlungsprogramm 510, ob ein weiterer Druckauftrag in seiner Warteschlange vorhanden ist und beginnt mit dessen Verarbeitung, wenn dies der Fall ist. Wenn hingegen keine neuen Druckaufträge zu verarbeiten sind, wird das Drucker-Behandlungsprogramm inaktiv. Nachdem ein bestimmter Druckauftrag abgeschlossen ist, werden die Informationen, die im Zwischenspeicher 522 gespeichert sind, gelöscht, und der Speicher wird zurückgefordert.
- Nun wird die Vorbereitung des Dokumenten-Portfolios, in welchem die formatierten, druckbaren Informationen vor dem Drucken gehalten werden, näher beschrieben. Wie schematisch in Figur 6 dargestellt, interagiert ein Anwendungsprogramm 600 mit der erfinderischen Druckerschnittstelle 602 über vier Hauptdruckobjekte, 604-610. Diese vordefinierten Objekte werden vom Anwendungsprogramm nach Bedarf erzeugt und führen bestimmte Operationen an den druckbaren Informationen aus, um die Informationen auf viele unterschiedliche Arten zu paginieren, Text und Grafiken zu verbinden und auch eine Druckvorverarbeitung einschließlich Änderungen an Format und Größe durchzuführen und Verzierungen, wie Seitenzahlen und Ränder, hinzuzufügen.
- Wenngleich die Operation der vier Hauptdruckobjekte im folgenden genauer beschrieben wird, empfängt im allgemeinen jedes Objekt vom Anwendungsprogramm eine Beschreibung einer "Ansicht", welche die druckbaren Informationen identifiziert. Der hierin verwendete Begriff "Ansicht" wird als ein rechteckiger Bereich definiert, der druckbare Informationen enthält; diese Informationen können Text, Grafiken, eine Kombination von Text und Grafiken, Bitmap-Bereiche oder andere Informationen enthalten, die auf Druckvorrichtungen ausgedruckt werden können. In dieser Hinsicht handelt es sich bei der Ansicht eher um die Informationen, wie sie im Speicher des Computers gespeichert sind, als um die Informationen, wie sie an der Anzeigevorrichtung des Computers dargestellt werden. Zum Beispiel kann eine Ansicht alle Textinformationen eines Textverarbeitungsdokumentes enthalten, wohingegen die Textinformationen während der Operation des Textverarbeitungsprogramms zur Betrachtung in mehrere Teile unterteilt wird. Alternativ dazu kann eine Ansicht aus einem großen Grafikbereich bestehen, wie er zum Beispiel von einem Zeichenprogramm, wie zum Beispiel dem APPLE Macdraw-Programm, erzeugt wird.
- Eine Ansicht wird durch das Festlegen einer rechteckigen Region mit Hilfe der X- und Y-Koordinaten "spezifiziert", die der oberen linken Ecke des Rechtecks entsprechen, und der X- und Y-Koordinaten, die der unteren rechten Ecke des Rechtecks entsprechen. Die vier in Figur 6 gezeigten Druckobjekte decken vier unterschiedliche Arten ab, auf denen eine Ansicht paginiert und auf denen eine Seitennumerierung konstruiert werden kann. Zum Beispiel entspricht das Einzelseiten-Numerierungsobjekt 604 einer Paginierung, wie sie auf ähnliche Weise im MacDraw-Programm durchgeführt wird, oder einem Tabellenkalkulationsprogramm, in welchem die Ansicht in kontinuierliche Seiten ohne eingreifende Zwischenräume unterteilt wird. Bei Verwendung dieses Objektes kann das Anwendungsprogramm entweder eine Ganzzahl an vollen Seiten festlegen, um den gesamten Ansichtsbereich abzudecken, wobei der Rand als Rest bleibt, oder das Anwendungsprogramm kann Teilseiten an den Ansichtskanten festlegen, und der Rand kann unabhängig davon eingestellt werden.
- Das als Buchseiten-Numerierung 606 in Figur 6 gekennzeichnete Objekt ist dem Einzelseiten-Numierungsobjekt 604 ähnlich, außer daß es sich bei den festgelegten Seiten um ganze Seiten mit Zwischenräumen zwischen den einzelnen Seiten handelt. Die von diesem Modell durchgeführte Paginierung ähnelt jeder, die von einer typischen Textverarbeitungsanwendung, wie zum Beispiel der MacWrite-Anwendung, durchgeführt wird, in der druckbare Informationen in "Seiten" mit jeweils eigenen Rändern oder Grenzen umgebrochen werden. Daher wird dieses Modell als "MacWrite"-Modell bezeichnet.
- Das in Figur 6 dargestellte Mischblatt-Numerierungsobjekt 608 kann vom Anwendungsprogramm dazu verwendet werden, Sammlungen von anderen Seitennumerierungstypen zu erzeugen. In dieser Hinsicht funktioniert es wie eine Seiten-Warteschlange, und andere Seitennumerierungen können hinzugefügt oder aus diesem gelöscht werden. Darüber hinaus kann es andere Mischblattnumerierungen akzeptieren. Es kann zum Beispiel dazu dienen, Seitennumerierungen unterschiedlicher Art miteinander zu kombinieren; so kann zum Beispiel ein Einzelseiten-Numerierungsobjekt mit einem Buchseiten- Numerierungsobjekt kombiniert und die gesamte Sammlung als eine Einheit gedruckt werden.
- Das letzte Druckobjekt, das als Seitenzusammensetzungsobjekt 610 bezeichnet wird, arbeitet wie ein Vordruck- Prozessor für reguläre druckbare Dokumente: der Begriff Zusammensetzung entspricht in diesem Zusammenhang dem Nehmen einer bestehenden Seitennumerierung, dem Zerlegen derselben, dem Neuanordnen der Teile, und dem Zusammenfügen derselben mit einem neuen Format, neuer Größe, neuer Bindung und, falls gewünscht, einigen Verzierungen, wie zum Beispiel Seitennummern und Rändern. Die Zusammensetzung ist ein wahlfreier Prozeß, der an jedem anderen Seitennumenerungstyp angewendet werden kann, und das Seitenzusammensetzungsobjekt kann an jedem beliebigen Seitennumerierungsziel und an anderen Seitenzusammensetzungsobjekten angewandt werden, so daß die Seitenzusammensetzer in beliebiger Tiefe mit jedem Zusammensetzer verschachtelt werden können, wobei bestimmte Verzierungen oder Modifizierungen zu den dadurch hindurchlaufenden Informationen hinzugefügt werden können. Daraus ergibt sich, daß ein Seitenzusammensetzungsobjekt gedruckt werden kann, aber es kann nicht ohne ein Ziel gedruckt werden, das heißt, es muß etwas anderes zum Drucken haben. In dieser Hinsicht arbeitet es sehr ähnlich wie ein Iterator. Die Druckerschnittstelle der Erfindung umfaßt viele unterschiedliche Typen von Seitenzusammensetzern. Zum Beispiel gibt es Zusammensetzer, die Ausschieß- Anordnungen und n-aufwärts-Drucken erzeugen.
- Wie zuvor erwähnt, umfaßt jedes der in Figur 6 gezeigten Objekte Daten und Funktionen, die mit diesen Daten operieren. Um die Operation der einzelnen Objekte zu verstehen, ist es hilfreich, sich die Konstruktion der Objekte sowie einige der wichtigsten Funktionsroutinen näher anzusehen, aus denen sich das Verhalten des Objektes zusammensetzt. Bei der Untersuchung der Objekte ist es auch hilfreich, die Klassen zu untersuchen, die verwendet werden, um die Objekte zu konstruieren (wie zuvor erwähnt, dienen die Klassen als Vorlagen für die Konstruktion des Objektes). Somit kann die Beziehung der Klassen und Funktionen, welche in jeder Klasse inherent sind, verwendet werden, um vorherzusagen, welches Verhalten ein Objekt aufweisen wird, nachdem es konstruiert wurde.
- Figur 7 zeigt ein vereinfachtes Klassenhierarchie-Diagramm für das Einzelseiten-Numerierungsobjekt 604. Figur 7 zeigt einige der Klassen, die verwendet werden, um das Einzelseiten-Numerierungsobjekt zu konstruieren. Insbesondere handelt es sich bei der Klasse (dargestellt durch Box 712), die zur Konstruktion des Einzelseiten-Numerierungsobjektes verwendet wird, um eine Unterklasse zweier Basisklassen einschließlich einer Seitennumerierungsklasse 700 und einer Paginator-Klasse 702. Wenn daher ein Einzelseiten-Numerierungsobjekt vom Anwendungsprogramm (durch Aufruf seines Konstruktors) erzeugt wird, werden auch die Konstruktoren der darunterliegenden Basisobjekte aufgerufen, um die Basisobjekte zu konstruieren und gegebenenfalls zu initialisieren. Die Basisobjekte werden somit ohne direkte Beteiligung des Anwendungsprogramms konstruiert.
- Die Seitennumerierungsklasse 700 ist eine abstrakte Darstellung von Dokumenten im Drucksystem, die man sich wie eine Sammlung geordneter Seiten vorstellen kann, die, wenn sie ausgedruckt werden, dem Leser logisch geordnet zu sein scheinen. Wie im folgenden erklärt, wird die Reihenfolge, in der die Seiten gedruckt werden, eigentlich von einem Objekt festgelegt, das als Seiten-Iterator bezeichnet wird; das Seitennumerierungsobjekt, das von der Klasse 700 konstruiert wird, dient einfach dazu, die Seiten aufzuhäufen oder zu sammeln. Ein Seitennumerierungsobjekt besitzt eingebaute Funktionen, die ein Seiten-Iterator-Objekt erzeugen kann, wobei dieser Iterator über die Seiten der Seitennummern iteriert. Das Seitennumerierungsobjekt umfaßt auch Funktionen, die die Seiten drucken können, welche Teil des Numerierungsobjektes sind. Wenn jedoch ein Seitennumerierungsobjekt die Seiten druckt, die Teil der Seitennumerierung sind, wird die gesamte Seitengruppe gedruckt. Wird weniger als die gesamte Seite gewünscht, müssen ein separates Seiten-Iterator-Objekt sowie die Druckfunktionen im Iterator-Objekt, die zum Drucken der Seiten verwendet werden, erzeugt werden.
- Das Einzelseiten-Numerierungsobjekt 712 empfängt auch verschiedene Parameter vom Anwendungsprogramm, das dieses erzeugt. Unter diesen Parametern ist ein Seitenbeschreibungsobjekt 710, das Parameter wie die physikalische Seitengröße und das druckbare Rechteck auf der Seite sammelt und verwaltet (manche Drucker können nicht die gesamte Seite bedrucken). Andere Parameter, die zur Verfügung gestellt werden, sind ein Seitenaktivbereichsobjekt (nicht dargestellt), wenn der "aktive" Bereich kleiner ist als der druckbare Bereich.
- Die Paginator-Basisklasse 702, von der die Einzelseiten-Numerierungsklasse abstammt, empfängt das Seitenbeschreibungsobjekt 710 von der Subklasse und verwendet die Seitenbeschreibungsobjektparameter, um eine Ansicht, die vom Anwendungsprogramm erzeugt wurde, in eine Ansammlung von Seiten oder eine "paginierte" Ansicht zu unterteilen. Eine paginierte Ansicht kann eine einzelne Seite mit allgemeinen Rändern, Zwischenräumen und Einzügen darstellen, oder sie kann viele Seiten der selben Größe und Ausrichtung darstellen, die in einer gitterähnlichen Struktur gruppiert sind. Die Seiten kann man sich so vorstellen, daß sie Begrenzungen über dem Ausdehnungsrechteck (Ansichtsbereich) zuschneiden oder Unteransichten einer größeren Gesamtansicht bilden. Es ist auch möglich, daß zwischen den Paginator-Seiten Zwischenräume vorhanden und vom Ausdehnungsrechteck verschoben sein können.
- Wie im folgenden beschrieben, ist der Paginator- Objekt-Konstruktor polymorph und, je nach Art der Parameter, die während der Objekterzeugung zum Konstruktor gesandt werden, kann ein Paginator-Objekt konstruiert sein, welches das Ausdehnungsrechteck mit einem Einzelseiten- Modell, einem Buchseiten-Modell oder einem n-aufwärtse Modell paginieren kann.
- Dem Paginator ist ein Paginator-Iterator-Objekt, dargestellt als Box 704, zugeordnet, das auf der Basis eines "Gitter-Modells", einer Abtastordnung und eines Gitterbereiches, die im folgenden noch näher beschrieben werden, durch die Seiten iteriert. Insbesondere kann die Ordnung der Seitenreihenfolge vom Anwendungsprogramm bestimmt werden, indem eine Abtastordnungsbeschreibung an das Einzelseiten-Numerierungsobjekt 712 weitergeleitet wird. Die Abtastordnungsbeschreibung wird in der Folge dazu verwendet, ein Abtastordnungsobjekt 706 zu erzeugen, das die Ordnung steuert, in der die Seiten referenziert werden. Darüber hinaus kann eine Seitenbereichsbeschreibung vom Seitenbereichsobjekt 716 an den Seiten-Iterator 714 weitergeleitet werden. Da das Seiten-Iterator-Objekt 714 eine Subklasse des Paginator-Iterators 704 ist, wird das Paginator-Iterator-Objekt konstruiert, wenn das Seiten-Iterator- Objekt konstruiert wird.
- Das Seitenbereichsobjekt 716 wird vom Seiten-Iterator- Objekt 714 verwendet, um zu bestimmen, ob eine bestimmte Seite gedruckt werden soll oder nicht, das heißt, ob die Seiten in die Iteration einzuschließen oder wegzulassen ist. Das Seitenbereichsobjekt 716 gibt grundlegende Informationen über einen ausgewählten Seiten"bereich", zurück, der von der Gruppe von Seiten festgelegt wird, die im Bereich enthalten sind. Eine bestimmte Seite innerhalb eines Bereiches wird durch ihre Seitennummer bezeichnet, und die Seiten innerhalb des Bereiches bilden im allgemeinen eine Untergruppe der Seiten im gesamten Dokument. Das Seitenbereichsobjekt enthält eine Anzahl von Funktionen, die verwendet werden können, um den Bereich abzufragen, um die Seiten im Bereich zu bestimmen. Diese Funktionen umfassen folgendes (die Argumente wurden der Einfachheit halber weggelassen):
- Die IsEmpty-Funktion gibt einen Boolschen Wert zurück, der anzeigt, ob der Bereich leer ist oder nicht, das heißt, ob sich irgendwelche Seiten des Dokumentes innerhalb des Bereiches befinden. Auf ähnliche Weise gibt die IsFull- Funktion einen Wert zurück, der anzeigt, ob sich alle Seiten im Dokument innerhalb des Bereiches befinden. Diese beiden Funktionen ermöglichen rasche Überprüfungen, die verhindern, daß es notwendig ist, den gesamten Bereich analysieren zu müssen, um zu bestimmen, ob einige oder alle Seiten darin enthalten sind. Die IsPageInRange-Funktion gibt zurück, ob sich eine bestimmte Seite innerhalb des Bereiches befindet oder nicht. Die IsPageInRangeAnAdjust- Offset-Funktion tut das selbe, aber sie gibt die Anzahl der Seiten innerhalb des Bereiches bis zur jeweiligen Seite zurück. Die GetPageCountInRange-Funktion gibt die Gesamtanzahl der Seiten zurück, die innerhalb des Bereiches ausgewählt wurden (wobei diese Anzahl größer oder kleiner sein kann als die Anzahl an Seiten in einem Dokument). GetFirstPageInRange gibt die Zahl der ersten Seite im Bereich zurück, und GetLastPageInRange gibt die Zahl der letzten Seite im Bereich zurück.
- Ebenfalls enthalten ist eine Reihe von Funktionen, die verwendet werden können, um die ausgewählten Seiten innerhalb eines Bereiches zu ändern, und die eine beliebige Auswahl einer beliebigen Gruppe von Seiten innerhalb des Bereiches ermöglichen. Diese Funktionen umfassen folgendes (die Argumente wurden der besseren Verständlichkeit wegen weggelassen):
- Mit der SetRange-Funktion kann der Bereich auch so eingestellt werden, daß darin Seiten enthalten sind, die in einem anderen Seitenbereich angegeben wurden. Zum Beispiel könnte der Bereich so eingestellt werden, daß darin alle geraden oder alle ungeraden Seiten enthalten sind, indem der Bereich auf einen anderen Bereich eingestellt wird, der gerade oder ungerade Seiten auswählt. Die Union-Funktion kombiniert die in zwei separaten Seitenbereichen ausgewählten Seiten. Auf ähnliche Weise wählt die Intersection- Funktion nur jene Seiten aus, die sich in beiden Bereichen befinden. Die Difference-Funktion entfernt oder deselektiert angegebene Seiten. Die Xor-Funktion wählt Seiten aus, welche die Exklusiv-Oder-Seiten beider Bereiche sind. Die Not-Funktion wählt alle momentan nicht ausgewählten Seiten aus, und die SetRangeEmpty-Funktion und die SetRangeFull- Funktion legen einfach jenen Bereich fest, der leer (keine Seiten ausgewählt) oder vollständig voll (alle Seiten ausgewählt) sein soll.
- Die zuvor erwähnten Funktionen stehen dem Anwendungsprogramm zur Verfügung, wenn das Seiten-Iterator-Objekt 714 erzeugt wird, wie dies im folgenden mittels einer "Create- Iterator"-Funktion im Einzelseiten-Numerierungsobjekt 712 beschrieben wird.
- Die Operation des Paginator-Objektes 702 und seines begleitenden Paginator-Iterators 704 kann unter Bezugnahme auf Figur 8 verstanden werden, welche die Paginierung einer Ansicht in vier Seiten darstellt. Insbesondere wird von einem Anwendungsprogramm ein Dokument 800 erzeugt, das eine Ansicht 802 enthält. Wenngleich die Ansicht 802 als ein Abschnitt des Dokumentes dargestellt ist, kann sie in Wirklichkeit aus dem gesamten Dokument bestehen und Text, Grafiken oder eine Kombination aus Text und Grafiken umfassen. Der Paginierungsprozeß teilt die Ansicht 802 in seitengroße Teile auf. Insbesondere verwendet der Paginator ein Ausdehnungsrechteck 808, das aus der gesamten Ansicht oder einem Teil der Ansicht bestehen kann. Das Ausdehnungsrechteck wird durch seine Ausdehnung in der X-Richtung und durch seine Ausdehnung in der Y-Richtung festgelegt. Die Seitengröße, wie sie vom Rechteck 814 angezeigt wird, wird ebenfalls durch seine Ausdehnung in die X- und Y-Richtung angegeben. Bei der für die Paginierung verwendeten Seitengröße kann es sich um die physikalische Größe einer Seite, das druckbare Rechteck oder um ein anderes festgelegtes Rechteck handeln. In dem dargestellten Beispiel werden die Seiten durch senkrechte Zwischenräume 812 und waagerechte Zwischenräume 818 voneinander getrennt, deren Breite unterschiedlich sein kann. Es sind auch senkrechte und waagerechte Ränder 810 und 816 beliebiger Breite vorhanden.
- Der Einfachheit halber können einzelne Seiten durch ihre Position im Paginierungsausdehnungsrechteck referenziert bzw. adressiert werden, das heißt durch die X- und Y- Koordinaten der linken oberen Ecke. Zum Beispiel würde die Seite 822 durch die X- und Y-Koordinaten ihrer linken oberen Ecke 806 adressiert werden. Ebenso von Wichtigkeit sind die X- und Y-Koordinaten der linken oberen Verschiebung 804, die im Paginierungsprozeß verwendet wird, und die Koordinaten der rechten unteren Verschiebung 820.
- Eine grundlegende Komponente eines Paginator-Iterator- Objektes ist ein zweidimensionales Gitter, wie zum Beispiel das Gitter 900, das schematisch in Figur 9 dargestellt ist. Um eine Ansicht zu paginieren, wird ein solches Gitter über die Ansicht gelegt, und jede der Gitterzellen bzw. Gitterkomponenten entspricht einer Seite. Zum Zwecke der Identifizierung besitzt jede Zelle eine Koordinatenadresse, die ihre Position innerhalb des Gitters angibt. Beim veranschaulichenden Paginator-Iterator-Objekt besitzt das zugeordnete Gitter sowohl X- als auch Y-Koordinatenadressen, wobei die Koordinatenadresse (0.0) der Gitterzelle in der linken oberen Ecke entspricht. Wie in Figur 9 dargestellt, beginnt die X-Koordinate bei Null in der linken oberen Ecke und steigt nach rechts hin an, und die Y-Koordinate beginnt bei 0 in der linken oberen Ecke und steigt nach unten hin an. Somit besitzt eine beliebige Gitterzelle, wie zum Beispiel die Zelle 902, eine Gitterkoordinatenadresse von (6.3). Darüber hinaus besitzt das Gitter eine Gesamtgröße, die von der Gesamtanzahl an Zellen in der X-Richtung und der Gesamtanzahl an Zellen in der Y-Richtung bestimmt wird; somit hätte das in Figur 9 dargestellte Gitter eine Gittergröße von (11.8), die anzeigt, daß es 11 Zellen in der X- Richtung und 8 Zellen in der Y-Richtung gibt.
- Gitterzellen können auch der Reihe nach geordnet werden und werden unter Beibehaltung der Koordinatennotation von 0 bis n-1 numeriert, wobei n die Gesamtanzahl an Zellen ist und durch die X-Gittergröße mal der Y-Gittergröße erhalten wird. Die jeder Zelle im Gitter zugeordnete Komponentennummer hängt jedoch von der Ordnung ab, in der die Nummern zugewiesen werden, und der Position, an der die Numerierung beginnt. Es gibt viele Arten, die Zellen der Reihe nach zu ordnen. Zum Beispiel ist es möglich, in der oberen linken Ecke des Gitters zu beginnen und die Zellen der Reihe nach entlang der X-Richtung bis zur unteren rechten Ecke zu numerieren. Danach wird eine Zeile nach unten gegangen und an der linken Seite des Gitters begonnen und die Numerierung entlang der X-Richtung fortgesetzt, bis wiederum die rechte Seite erreicht wird, wobei man sich Reihe um Reihe von oben nach unten bewegt. Diese Ordnungsauswahl wird als "Raster"-Ordnung bezeichnet, weil sie jener Ordnung ähnelt, in der ein Bild auf einem Fernsehschirm oder Monitor dargestellt wird. Dieses Ordnungsschema ist schematisch in Figur 10, Box 1000, dargestellt und kann als Rasterordnung "rechts unten" bezeichnet werden, da der Ordnungsvorgang zuerst nach rechts und dann nach unten führt. Es ist natürlich ebenso möglich, an anderen Stellen zu beginnen und in unterschiedliche Richtungen fortzufahren, um eine Anzahl anderer Rasterordnungen zu erzielen. Wenn man alle möglichen Kombinationen berücksichtigt, ergeben sich daraus insgesamt 8 unterschiedliche Ordnungen, wie dies in Figur 10 dargestellt ist. Diese Ordnungen werden in Tabelle 1 gemäß der bei Box 1000 verwendeten Konvention benannt. TABELLE 1
- Es ist auch möglich, die Gitterzellen durch andere Ordnungen zu ordnen, wie zum Beispiel durch eine Zufallsordnung, durch Zickzack-Ordnung, durch Drehordnung, durch spiralförmige Ordnung oder durch Schachbrett-Ordnung, um nur einige wenige Möglichkeiten zu nennen. Um jedoch die Diskussion zu vereinfachen, werden die oben angeführten acht Ordnungen für den Rest der Diskussion verwendet.
- Das Gitterbereichsobjekt 708 enthält eine zweidimensionale Gruppe von Einheiten, die verwendet werden können, um jede beliebige Ansammlung von Einheiten darzustellen, die numeriert und in einem Gittermuster angeordnet werden können. Dies ist ein vertrautes Konzept, das auch bei Bitmap-Bildern und Bereichen verwendet wird, die in bestimmten Zeichenprogrammen definiert werden können, wie zum Beispiel im Quickdraw-Zeichenprogramm (Apple). So wie beim vor kurzem beschriebenen Seitenbereichsobjekt 716 umfaßt das Gitterbereichsobjekt 708 verschiedene Funktionen, die den Gitterbereich abfragen und Informationen über die darin enthaltenen Einheiten zurückgeben. Zum Beispiel können diese Funktionen umfassen (Argumente werden der besseren Klarheit wegen weggelassen):
- Die Contains-Funktion gibt einen wahren Wert zurück, wenn sich die Gitterkoordinate einer angegebenen Einheit innerhalb des Gitterbereiches befindet. Die IsEmpty-Funktion gibt einen wahren Wert zurück, wenn der Bereich leer ist oder keine Einheiten angegeben wurden. Auf ähnliche Weise gibt die IsFull-Funktion einen wahren Wert zurück, wenn mindestens eine Einheit im Bereich enthalten ist. Die Funktionen GetItemCountInRange und Getbounds berechnen die Gesamtanzahl an Einheiten innerhalb des Bereiches und geben diesen Wert zurück.
- Es sind auch Funktionen enthalten, welche die Bereichsstruktur ändern, wie zum Beispiel die folgenden:
- Die SetRange-Funktion kann verwendet werden, um auf beliebige Weise den Gitterbereich auf einen rechteckigen Bereich einzustellen, umfassend einen "von" Punkt inklusive bis zu einem "zu" Punkt exklusive. In anderen Worten ist die ausgewählte Region halb geöffnet (von.zu). Der "von" Punkt ist in der Region enthalten, während der "zu" Punkt darin nicht enthalten ist. Obwohl die "von" und "zu" Punkte zwei beliebige Ecken des rechteckigen Bereiches beschreiben können, ist der umschlossene Bereich immer von der oberen linken Ecke bis zur unteren rechten Ecke halb geöffnet. In der Folge sind alle folgenden Bereichsangaben gleichwertig:
- und alle oben angegebenen Bereiche umschließen das Element (0.0). Der Zweck des Festlegens der Bereiche auf diese Weise besteht darin, daß leere Bereich rasch durch Verwendung von Aussagen wie zum Beispiel "von==zu" erkannt werden können. Diese Art der Festlegung von Bereichen wird bei den zuvor erwähnten Funktionen verwendet und vom Paginator- Iterator-Objekt dazu benutzt, Seiten für die Paginierung auszuwählen.
- Mit den Konzepten eines Gitters, der Zellordnung und der Gitterbereiche kann die Funktionsweise des Paginatorobjektes im Detail erklärt werden. Wie zuvor erwähnt, wird das Paginatorobjekt als eine Basisklasse des Einzelseiten- Numerierungsobjektes konstruiert, und der Paginatorobjekttyp, der erzeugt wird, wird von den Variablen bestimmt, die vom Einzel seiten-Numerierungsobj ekt zum Paginatorobjektkonstruktor geleitet werden. Nach der Konstruktion umfaßt das Paginatorobjekt eine Anzahl an internen oder privaten Variablen, einschließlich der Gittergröße, der Größe des Ausdehnungsrechtecks, der Seitengröße, der Koordinaten für die linke obere Verschiebung, der Koordinaten für die rechte obere Verschiebung, den Größen der senkrechten und waagerechten Zwischenräume und zweier Boolscher Variablen, von denen eine dazu verwendet werden kann, anzuzeigen, ob die Paginierung zur Gänze aus ganzen Seiten besteht, oder ob Teilseiten an den rechten und unteren Grenzen vorhanden sein können. Die zweite Boolsche Variable zeigt an, ob das Ausdehnungsrechteck als fixiert betrachtet werden muß.
- Die Formel, die zur Berechnung der Anzahl an Seiten im Ausdehnungsrechteck und der Einstellungen für die Zwischenräume und die Verschiebungen verwendet wird, muß folgende grundlegende Beziehung erfüllen:
- Ausdehnung = linke obere Verschiebung + rechte untere Verschiebung + n * (Seitengröße + Zwischenraum) - Zwischenraum
- wobei n ein Nummempaar repräsentiert, welches die Anzahl der im Ausdehnungsbereich in der X- und Y-Richtung enthaltenen Seitenzahl darstellt und größer oder gleich (1.1) ist. Es wird darauf hingewiesen, daß die obige Formel eigentlich eine zweidimensionale Vektorformel ist, und daß jede der Variablen eigentlich aus einem Doppel oder zwei Nummern besteht. Zum Beispiel besteht die Ausdehnung eigentlich aus zwei Nummern, welche die X-Ausdehnung und die Y-Ausdehnung anzeigen. Auf ähnliche Weise besteht die linke obere Verschiebung aus einer Variable mit zwei Nummern, welche den X- und den Y-Koordinatenwert der oberen linken Ecke des Ausdehnungsrechtecks angeben.
- Es gibt drei Typen von Paginierungsmodellen, die im veranschaulichenden Paginatorobjekt verwendet werden: das erste Modell (das vom Einzelseiten-Numerierungsobjekt benutzt wird) verwendet ein fixiertes Ausdehnungsrechteck, das trotz Änderungen oder Variationen der Seitengröße unveränderlich bleibt. Diese Modell wird als "MacDraw"-Modell bezeichnet und erfordert, daß der Paginator vom Einzelseiten-Numerierungsobjekt die Seitengröße, die Ausdehnung, die linke obere Verschiebung, die rechte untere Verschiebung und die Zwischenraum-Parameter erhält. Danach berechnet der Paginator die Seitenfrequenz oder die Anzahl an Seiten in der X- und Y-Richtung (entspricht der Gittergröße). Die beispielhafte Routine, die vom Paginator verwendet wird, um die Seitenfrequenz oder, dementsprechend, die Gittergröße zu berechnen, ist in Figur 11 dargestellt. Diese Routine beginnt bei Schritt 1100 und geht zu Schritt 1102 weiter, wo die Variable anzeigt, daß die fixierte Ausdehnung auf WAHR gesetzt ist. Als nächstes wird bei Schritt 1104 eine "Pager"-Zwischenvariable gemäß der folgenden Formel berechnet:
- Pager = (Ausdehnung - linke obere Verschiebung - rechte untere Verschiebung + Zwischenraum)/(Seitengröße + Zwischenraum)
- Nachdem die Pager-Variable berechnet wurde, werden die X- und Y-Komponenten der Gittergröße auf die X- und Y- Komponenten der Pager-Variable eingestellt, wie dies bei Schritt 1106 dargestellt ist. Schließlich wird die untere rechte Verschiebung zurückgesetzt. In diesem Modell wird die untere rechte Verschiebung mehr wie eine Richtlinie als ein absoluter Parameter behandelt und absorbiert das "Spiel", wenn das Ausdehnungsrechteck modifiziert wird. Die untere rechte Verschiebung wird gemäß der folgenden Formel neu berechnet:
- Untere rechte Verschiebung = Ausdehnung - obere linke Verschiebung - (Gittergröße * (Seitengröße + Zwischenraum)) + Zwischenraum
- Wie bei Schritt 1108 gezeigt, geht die Routine dann zu dem bei Schritt 1110 dargestellten Abschluß weiter.
- Die vom Paginatorobjekt verwendeten anderen zwei Modelle bilden die Grundlage für die Paginierung in den anderen Seitennumerierungsobjekten. Zum Beispiel handelt es sich bei einem anderen Paginierungsobjekt um ein flexibles Modell mit einer Ausdehnungsrechteck-Gesamtgröße, die auf Seitengrößenänderungen eingestellt werden können: zusätzliche Seiten oder Reihen von Seiten können zu diesem Modell hinzugefügt werden, um das gesamte Ausdehnungsrechteck zu vergrößern. Dieses letzere Modell wird als "MacWrite"- Modell bezeichnet und ähnelt der Ausgabe, die von einer herkömmlichen Textverarbeitung erzeugt wird. Ein drittes Modell ist ein variables n-aufwärts-Seitenmodell, wobei eine Unterseitengröße auf der Basis der Seitenfrequenz und der Gesamtgröße des Ausdehnungsrechtecks berechnet wird. Mehrere Unterseiten werden danach auf jeder vollen Seiten angeordnet. Wenngleich diese letzteren zwei Modelle nicht in dem nun zur Diskussion stehenden Einzelseiten-Numerierungsobjekt verwendet werden, müssen sie doch zur Vollständigkeit des Paginator-Modelis hierin eingeschlossen werden.
- Die Berechnung der letzten Paginierungsmodelle ist in Figur 12 und 13 dargestellt. In Figur 12 sind Berechnungen dargestellt, die im Modell des fixierten Feldes bzw. im "MacWrite"-Modell zur Anwendung gelangen. Bei diesem Modell empfängt der Paginator die Anzahl an Seiten, die durch die Seitenfrequenz, die Seitengröße, die linke obere Verschiebung, die rechte untere Verschiebung und den Zwischenraum vom entsprechenden Seitennumerierungsobjekt bestimmt wurde, und das Ausdehnungsrechteck wird berechnet. Die bei der Berechnung verwendete Routine beginnt bei Schritt 1200 und geht zum Berechnungsschritt 1202 weiter, wobei folgende Formel verwendet wird:
- Ausdehnung = obere linke Verschiebung - Zwischenraum + (Gittergröße * (Seitengröße + Zwischenraum))
- Die Routine endet bei Schritt 1204.
- Die restliche Paginatorroutine, welche das n-aufwärts- Seiten-Modell verwendet, erfordert, daß der Paginator die Größe des Ausdehnungsrechtecks, die Seitenfrequenz, die linke obere Verschiebung, die rechte untere Verschiebung und den Zwischenraum vom zugeordneten Seitennumerierungsobjekt empfängt, und die Seitengröße wird berechnet. Diese Routine ist in Figur 13 dargestellt und beginnt bei Schritt 1300. Die Berechnung wird bei Schritt 1302 durchgeführt und verwendet die folgende Formel:
- Seitengröße = (Ausdehnung - linke obere Verschiebung - rechte untere Verschiebung + Zwischenraum)/(Gittergröße) - Zwischenraum
- wobei die Gittergröße die zweistellige Nummer umfaßt, welche die Anzahl an Gitterzellen in der X-Richtung und die Anzahl der Zellen in der Y-Richtung angibt. Die Routine geht dann zu Schritt 1304 weiter, wo sie abgeschlossen wird.
- Die unterschiedlichen Ausgaben der verschiedenen Paginierungsroutinen sind in Figur 14A-14C dargestellt. Figur 14A zeigt die Paginierung, die vom "MacDraw"-Modell durchgeführt wird, welche das Ausdehnungsrechteck 1402 unveränderlicher Größe in gleichförrnige, seitengroße Einzelteile 1400 unterteilt. Teilweise Seiten sind am rechten Rand, 1404, und am unteren Rand, 1406, möglich, und für gewöhnlich sind keine Zwischenräume zwischen den Seiten vorhanden.
- Alternativ dazu ist die Ausgabe des MacWrite-Paginator-Modells in Figur 14B dargestellt. Diese ähnelt jener des MacDraw-Paginators, außer daß die paginierten Seiten, 1408 und 1410, für gewöhnlich ganze Seiten sind, wobei waagerechte und senkrechte Zwischenräume zwischen jeder Seite vorhanden sind. Neue Zeilen oder Spalten von Seiten können leicht hinzugefügt werden, um das Feld entweder in die X- oder die Y-Richtung zu erweitern.
- Die Ausgabe des n-aufwärts-Pagnierungsmodells ist in Figur 14C dargestellt. Bei dem dargestellten Modell handelt es sich um ein 4-aufwärts-Modell, obwohl die Paginierung auf ein beliebiges Vielfaches erweitert werden kann. In diesem Fall besteht jede Seite des Modells aus vier Unterseiten, die der Reihe nach auf der Seite angeordnet sind, wobei natürlich jede beliebige Anzahl an Unterseiten auf jeder vom Paginator erzeugten Seite enthalten sein kann.
- Der Paginator-Iterator 704 ordnet die Seiten in einer Ordnung an, die intern erzeugt wird oder vom Anwendungsprogramm über den Seiten-Iterator 714 vorgegeben wird. Seiten in einer paginierten Ansicht werden mit Hilfe der oben diskutierten Gittereigenschaften gemäß ihrer Position in der Ansicht numeriert. Falls nicht anders vom Anwendungsprogramm oder im Paginator selbst angegeben, werden die Seitennummern standardmäßig in der Reihenfolge der Rasterordnung "rechts unten" numeriert (Box 1000, Figur 10). Die Seitennummern, die intern zugewiesen werden, sind Ganzzahlen, die bei Null beginnen und nicht notwendigerweise eine der Seitennummern repräsentieren, die vom Anwendungsprogramm oder der von einer bestimmten Iteration erzeugten Druckordnung zugewiesen werden; es handelt sich dabei bloß um interne Bezeichnungen, die zur Bezugnahme auf die Seiten verwendet werden.
- Zusätzlich zur internen Seitennumerierung können einzelne Seiten durch ihre Position im Paginator-Ausdehnungsrechteck adressiert werden, das heißt, durch die Koordinatenposition der oberen linken Ecke einer jeden Seite. Das Anwendungsprogramm hat die Möglichkeit, sich auf jede einzelne Seite durch deren Gitterkoordinaten, deren Position im Paginator-Gitter, deren Seitenkoordinaten, deren Ansichtskoordinaten oder durch deren interne Seitennummer zu beziehen. Seitenkoordinaten hängen von den Rand- und Zwischenraumeinstellungen ab, die vom Anwendungsprogramm festgelegt werden, wohingegen dies bei Seitennummern und Gitterkoordinaten nicht der Fall ist.
- Die Funktion des Paginator-Iterators 704 besteht darin, alle Seiten des Paginators entweder auf der Basis einer standardmäßigen Abtastordnung oder einer vom Anwendungsprogramm vorgegebenen Abtastordnung und einem wahlweisen Auswahlbereich für diesen Paginator zu analysieren. Der Iterationsprozeß beginnt eigentlich, wenn der Seiten-Iterator 714 vom Anwendungsprogramm erzeugt wird, was durch Aufruf einer Funktion im Einzelseiten-Numerierungsobjekt erfolgt, die als "CreateIterator" bezeichnet wird. Da der Seiten-Iterator 714 eine Unterklasse des Paginator-Iterators 704 ist, wird der Paginator-Iterator ebenfalls zur selben Zeit erzeugt wie der Seiten-Iterator.
- Die Abtastordnung wird durch Definierung separater Klassen für jede der in Figur 10 dargestellten acht Abtastordnungen und Erzeugen eines Abtastordnungsobjektes von einer dieser Klassen während der Iteration verwaltet, was, je nach Auswahl, vom Anwendungsprogramm abhängt. Diesen acht Abtastordnungsklassen werden Namen entsprechend den in Tabelle 1 für jede Abtastordnung angeführten Namen zugewiesen. Jeder Abtastordnung wird auch eine beliebige Nummer im Bereich von 0-7 zugewiesen und sie enthält, wenn ein Paginator-Iterator 704 konstruiert wird, eine Variable, welche die ausgewählte Abtastordnung anzeigt. Diese Variable wird zu Beginn auf 0 gesetzt, was zur Erzeugung eines Abtastordnungsobjektes führt, welches die Abtastung in der "rechts unten" Ordnung ordnet.
- Das Anwendungsprogramm kann die Abtastordnung durch Verwendung einer Adoptscanorder-Funktion ändern, die in den Seiten-Iterator 714 eingebaut ist. Als Reaktion auf die Adoptscanorder-Funktion leitet der Seiten-Iterator 714 eine Anforderung zur Änderung der Abtastordnung an den Paginator-Iterator 704 weiter, indem er eine "AdoptScanOrder"- Funktion im Paginator-Iterator aufruft. Diese letztere Funktion führt dazu, daß eine Abtastordnungsvariable im Paginator-Iterator auf eine neue Abtastordnung eingestellt wird. Als Reaktion darauf wird ein neues Abtastordnungsobjekt erzeugt.
- Jedes Abtastordnungsobjekt enthält mehrere Funktionen, die die Gitterzellen abtasten. Eine der wichtigsten Funktionen in einem Abtastordnungsobjekt ist die SeekNext-Funktion, die die Gitterkoordinaten der aktuellen Seite empfängt und die Gitterkoordinaten der nächsten Seite in der ausgewählten Abtastordnung zurückgibt. Die SeekNext- Routine ist natürlich für jedes Abtastordnungsobjekt anders, damit sich jedes Objekt unterschiedlich verhält. Eine andere wichtige Funktion bestimmt die Gittergrenzen in der X- und Y-Richtung mit Hilfe der Gittergröße, die vom Paginatorobjekt mit Hilfe der Parameter berechnet wurde, die vom Anwendungsprogramm zur Verfügung gestellt wurden.
- Eine veranschaulichende SeekNext-Funktion für ein "rechts unten"-Abtastordnungsobjekt (die Standard-Ordnung) ist in Figur 15 dargestellt. Die Funktion empfängt eine anfängliche Eingangskoordinate, welche die aktuellen Seitengitterkoordinaten anzeigt. Sie setzt die Koordinatenwerte auf die Gitterkoordinaten der nächsten Seite zurück und gibt einen Wert von WAHR oder FALSCH zurück, der anzeigt, ob sich die nächste Seite in der Abtastordnung innerhalb des ausgewählten Seitenbereiches befindet oder nicht. Wie im folgenden erklärt wird, werden die Rückgabewerte verwendet, um zu bestimmen, ob das Ende des Druckbereiches während des Druckvorganges erreicht wurde.
- Insbesondere beginnt die SeekNext-Routine bei Schritt 1500 und geht zu einem Entscheidungsschritt 1502 weiter, wo die Eingangsgitterkoordinaten überprüft werden, um zu bestimmen, ob sich die ausgewählte Zelle innerhalb der Gittergrenzen befindet. Wie oben erwähnt werden die Gittergrenzen von der vom Paginatorobjekt berechneten Seitenfrequenz oder der Gittergröße bestimmt. Wenn die ausgewählte Zelle nicht innerhalb der Gittergrenzen liegt, wird ein Fehlerzustand angezeigt, und ein FALSCH-Wert wird bei Schritt 1518 zurückgegeben, und die Routine wird bei Schritt 1516 beendet. Alternativ dazu geht, wenn die Eingangskoordinate innerhalb der Gittergrenzen liegt, die Routine zu Schritt 1504 weiter, wo die X-Gitterkoordinate hochgezählt wird, wodurch sich die ausgewählte Gitterzelle um einen Schritt nach rechts bewegt.
- Beim Entscheidungsschritt 1506 wird die neue X-Koordinate überprüft, um sicherzustellen, daß sie nicht an oder über der X-Gittergrenze liegt. Wenn dies nicht der Fall ist, wurden die Koordinaten der nächsten Seite in der Abtastordnung gefunden, und die Routine gibt einen WAHR- Wert bei Schritt 1514 zurück und wird bei Schritt 1516 beendet.
- Wenn jedoch die neue X-Koordinate an der X-Gittergrenze liegt, muß die Abtastordnung zum Anfang der nächstniedrigeren Reihe zurückkehren. Demgemäß wird die Y- Koordinate im Schritt 1508 hochgezählt, wodurch die ausgewählte Zelle zur nächsten Reihe nach unten geschoben wird. Die neue Y-Koordinate wird bei Schritt 1510 überprüft, um sicherzustellen, daß sie unter der Y-Gittergrenze liegt. Wenn dies der Fall ist, wird die X-Koordinate bei Schritt 1512 auf 0 gesetzt, wodurch angezeigt wird, daß die Abtastordnung an einer neuen Reihe begonnen wurde. Ein Rückgabewert WAHR wird bei Schritt 1514 zurückgegeben, und die Routine endet bei Schritt 1516.
- Wenn jedoch die neue Y-Koordinate außerhalb der Y- Gittergrenze liegt, wurde das Ende des Gitterbereiches erreicht, und ein FALSCH-Wert wird bei Schritt 1518 zurückgegeben, und die Routine endet bei Schritt 1516.
- Wie zuvor erwähnt, gilt die dargestellte SeekNext-Routine nur für das "rechts unten" Abtastordnungsobjekt, und die Routine ist bei jedem einzelnen Abtastordnungsobjekt anders. Eine andere beispielhafte Routine für das "unten links" Abtastordnungsobjekt (entsprechend der Box 1002 in Figur 10) ist in Figur 16 dargestellt. Die Abtastordnungsroutine in Figur 16 ist jener von Figur 15 für die "rechts unten"-Konfiguration sehr ähnlich, außer daß die Ordnung für das Hochzählen der X- und Y-Koordinaten anders ist. Insbesondere beginnt die "unten links"-Routine bei Schritt 1600 und geht zu einem Entscheidungsschritt 1602 weiter, wo die Eingangskoordinate überprüft wird, um zu bestimmen, ob sie innerhalb der Gittergrenzen liegt. Wenn dies nicht der Fall ist, wird ein FALSCH-Wert bei Schritt 1618 zurückgegeben, und die Routine endet bei Schritt 1616.
- Wenn die Eingangskoordinate jedoch innerhalb der Grenzen liegt, wird die Y-Koordinate bei 1604 hochgezählt, wodurch sie eine Reihe weiter unten fortsetzt. Bei Schritt 1606 wird die Y-Koordinate mit der Y-Gittergrenze verglichen, um zu bestimmen, ob die Y-Koordinate die Gittergrenze überschritten hat. Wenn dies nicht der Fall ist, wurde die nächste Seite in der Abtastordnung bestimmt, und die Routine geht zu Schritt 1614 weiter, wo sie einen WAHR-Wert zurückgibt und bei Schritt 1616 beendet wird.
- Wenn jedoch die Y-Koordinate die Y-Gittergrenze erreicht oder überschritten hat, wird die X-Koordinate bei Schritt 1608 vermindert, wodurch die ausgewählte Seite um eine Position nach links in der Abtastordnung verschoben wird. Beim Schritt 1610 wird die neue X-Koordinate überprüft, um sicherzustellen, daß sie nicht Null ist. Wenn die neue X-Koordinate Null erreicht hat, wurde das Ende der Abtastordnung erreicht, und ein FALSCH-Wert wird bei Schritt 1618 zurückgegeben, und die Routine endet bei Schritt 1616.
- Wenn jedoch die X-Koordinate nicht Null ist, wird die Y-Koordinate bei Schritt 1612 auf Null gestellt, und ein WAHR-Wert wird bei Schritt 1614 zurückgegeben, wobei die Routine bei Schritt 1616 endet.
- Auf ähnliche Weise wie die zwei zuvor beschriebenen Abtastordnungsobjekte umfaßt jedes der anderen Abtastordnungsobjekte eine SeekNext-Routine. Diese sind ähnlich aufgebaut wie die in Figur 15 und 16 dargestellten SeekNext-Routinen, und zur besseren Verständlichkeit wurden die Einzelheiten dieser Routinen weggelassen.
- Die in den Abtastordnungsobjekten enthaltenen Seek- Next-Routinen werden von zwei Routinen verwendet, die im Seiten-Iterator enthalten sind und welche den Seiten- Iterator befähigen, die erste Seite im ausgewählten Seitenbereich und die Abtastordnung auszuwählen und danach während eines Druckvorgangs die ausgewählten Seiten zu durchlaufen. Diese letzteren beiden Routinen werden als SeekFirstPageInRange-Routine und als SeekNextPageInRange- Routine bezeichnet. Die SeekFirstPageInRange-Routine ist im Detail in Figur 17 dargestellt.
- Die Routine beginnt bei Schritt 1700 und geht zu Schritt 1702 weiter, wo der Gitterbereich auf seine Gültigkeit hin überprüft wird; wenn der Gitterbereich nicht gültig ist, wird die erste Gitterzelle im Bereich bei Schritt 1704 erhalten, und die Routine endet bei Schritt 1718. Wenn jedoch der Gitterbereich gültig ist, wird bei Schritt 1706 mit Hilfe einer Standard-Rechteckerzeugungsroutine ein "Schätzungs"-Rechteck erzeugt. Die Erzeugung des "Schätzungs"-Rechtecks wird verwendet, um die Leistung des Programms zu steigern, und dient hier nur veranschaulichenden Zwecken - andere Routinen, welche die selben Gesamtaufgaben ausführen, werden für Fachleute dieses Bereiches leicht erkennbar sein. Die Routine geht dann zu Schritt 1708 weiter, bei dem die Größe des Schätzungsrechtecks auf die Gittergrenzen eingestellt wird. Dadurch wird ein Anfangsrechteck erhalten, welches das gesamte Gitter umspannt.
- Bei Schritt 1710 wird die Gitterzelle mit der kleinsten Seitennummer, welche eine Ecke des Schätzungsrechtecks umschließt, bestimmt. Dieser Schritt wird durchgeführt, da sich je nach ausgewählter Abtastordnung die Startposition verändert. Nachdem die Gitterzelle mit der kleinsten Seitennummer gefunden wurde, wird die Seitennummer der Gitterzelle bei Schritt 1712 in eine aktuelle Koordinate umgewandelt.
- Bei Schritt 1714 wird die neue aktuelle Koordinate überprüft, um zu erkennen, ob sie sich innerhalb des ausgewählten Gitterbereiches befindet; wenn dies nicht der Fall ist, wird die Routine bei Schritt 1718 beendet. Wenn sich die neue aktuelle Koordinate jedoch innerhalb des ausgewählten Gitterbereichs befindet, wird die nächste Einheit in der Gitterordnung bei Schritt 1716 erhalten, indem eine SeekNext-Routine verwendet wird, welche der ausgewählten Abtastordnung entspricht, wie jene, die in Figur 15 und 16 dargestellt sind.
- Nachdem die nächste Einheit erhalten wurde, wird sie mit dem aktuellen Gitterbereich verglichen, um zu erkennen, ob sie innerhalb des Gitterbereiches liegt; die Routine endet, wenn die nächste Einheit außerhalb des aktuellen Gitterbereiches liegt, was darauf hinweist, daß das Ende des Gitterbereiches erreicht wurde.
- Die SeekNextPageInRange-Routine ist in Figur 18 dargestellt; die Routine beginnt bei Schritt 1800 und geht zu Schritt 1802 weiter, wo die Gültigkeit des Gitterbereiches überprüft wird. Wenn der Gitterbereich nicht gültig ist, wird die nächste Gitterzelle in der Abtastordnung bei Schritt 1804 ausgewählt, und die Routine endet bei Schritt 1818.
- Wenn der Gitterbereich jedoch gültig ist, wird bei Schritt 1806 ein "Schätzungs"-Rechteck erzeugt und bei Schritt 1808 auf die Gittergrenzen eingestellt. Bei Schritt 1810 werden die aktuellen Koordinaten des Schätzungsrechtecks auf die nächste Gitterzellkoordinate gesetzt, und die Routine geht danach zu Schritt 1812 weiter, wo die neue Gitterzelle überprüft wird, um zu sehen, ob sie das Ende des Bereiches überschreitet. Wenn die neue Gitterzelle außerhalb des ausgewählten Bereiches liegt, endet die Routine bei Schritt 1818; wenn nicht, wird die aktuelle Koordinate bei Schritt 1814 überprüft, um zu sehen, ob sie innerhalb des aktuellen Gitterbereiches liegt.
- Wenn die aktuelle Koordinate außerhalb des aktuellen Gitterbereiches liegt, wurde der gesamte Bereich durchquert, und die Routine endet bei Schritt 1818. Wenn sich die aktuelle Koordinate aber innerhalb des aktuellen Gitterbereiches befindet, wird die nächste Einheit in der Gitterordnung bei Schritt 1816 erhalten, indem eine SeekNext- Routine, wie zum Beispiel eine von jenen, die in Figur 15 und 16 dargestellt sind, je nach der vom Anwendungsprogramm ausgewählten Abtastordnung verwendet wird.
- Die SeekNextPageInRange-Routine wird zwischen den Schritten 1814 und 1816 solange ausgeführt, bis die aktuelle Koordinate der Einheit außerhalb des aktuellen Gitterbereiches liegt; in diesem Fall wird die Routine bei Schritt 1818 beendet.
- Sowohl die SeekFirstPageInRange-Funktion als auch die SeekNextPageInRange-Funktion werden während der Seiten- Iterator-Druckroutine verwendet, welche den eigentlichen Ausdruck der Seiten durchführt. Diese letztere Routine ist im Detail in Figur 19 dargestellt und beginnt bei Schritt 1900. Bei Schritt 1902 wird eine Überprüfung durchgeführt, um sicherzustellen, daß die Seitenzahl nicht gleich Null ist. Wenn die Seitenzahl gleich Null ist, wird die Verarbeitung gestoppt, und die Routine geht zu Schritt 1924 weiter.
- Wenn die Seitenzahl jedoch nicht gleich Null ist, geht die Routine zu Schritt 1904 weiter, wo eine Vielzahl von Variablen einschließlich Bereich, Verschiebung, Position, Ansicht und Seitenbeschreibung erzeugt und aus Informationen geladen werden, die vom Anwendungsprogramm zur Verfügung gestellt werden.
- Die Routine geht danach zu Schritt 1906 weiter, wo eine SeekFirstPageInRange-Funktion vom Seiten-Iterator aufgerufen wird, dessen Funktion vor kurzem im Detail im Zusammenhang mit Figur 17 beschrieben wurde. Bei Schritt 1908 wird eine Überprüfung durchgeführt, um sicherzustellen, daß die unmittelbar vorhergehende Suche gültig war. Insbesondere gibt, wie zuvor erwähnt, die SeekFirstPageIn- Range-Routine einen WAHR-Wert zurück, wenn die Suche tatsächlich Seitenkoordinaten innerhalb eines gültigen Seitenbereiches zurückgibt. Die SeekFirstPageInRange-Routine gibt einen FALSCH-Wert zurück, um anzuzeigen, daß die zurückgegebenen Seitenkoordinaten außerhalb des gültigen Seitenbereiches liegen und daß die Ergebnisse der vorhergehenden Suche daher in diesem letzteren Fall unbestimmt sind; die Routine geht zu Schritt 1924 weiter, wo sie beendet wird.
- Wenn die Ergebnisse der vorhergehenden Suche jedoch anzeigen, daß gültige Seitenkoordinaten erhalten wurden, werden bei Schritt 1910 Koordinaten der Ansicht erhalten. Diese Koordinaten werden vom Anwendungsprogramm zur Verfügung gestellt und in dieser Stufe referenziert, um sicherzustellen, daß die richtige Ansicht für jede Seite erhalten wurde. In Übereinstimmung mit den Prinzipien der Erfindung können unterschiedliche Ansichten für jede Seite verwendet werden, so daß die richtige Ansicht erhalten werden muß, bevor die einzelnen Seiten ausgedruckt werden.
- Die Routine geht danach zu Schritt 1912 weiter, um zu prüfen, ob die bei Schritt 1910 erhaltene Ansicht gültig ist. Wenn nicht, endet die Routine bei Schritt 1924 (die zur Prüfung auf eine gültige Ansicht notwendigen Schritte sind in einem Objekt eingekapselt, das sich mit Ansichten beschäftigt. Dieses Objekt ist kein Bestandteil der vorliegenden Erfindung und wird daher im folgenden auch nicht näher diskutiert). Wenn die Ansicht gültig ist, geht die Routine zu Schritt 1914 weiter, wo die Seitenkoordinate von der SeekFirstPageInRange-Routine erhalten wird. Die Routine geht dann zu Schritt 1916 weiter, wo die Seitenbeschreibung und der aktive Bereich aus Werten erhalten werden, die vom Anwendungsprogramm zur Verfügung gestellt werden (50 wie bei der Seitenansicht können sich diese Variablen von Seite zu Seite ändern und müssen erlangt werden, bevor die einzelnen Seiten ausgedruckt werden).
- Unter Verwendung der bei Schritt 1916 erhaltenen Seitenkoordinaten, der Seitenbeschreibung und der Werte für den aktiven Bereich wird die ausgewählte Seite in eine neue Seitenkoordinate übersetzt, welche ihrer neuen Position in der ausgegebenen Seite entspricht. Diese Übersetzung wird mittels sehr einfacher Übersetzungsroutinen durchgeführt. Bei Schritt 1920 wird die Seite gedruckt (in die Warteschlange zum Druckkanal gestellt, der sie spoolt), und bei Schritt 1922 wird die nächste Seite im Seitenbereich mit einer SeeNextPageInRange-Routine erhalten, die im Detail in Figur 18 dargestellt ist.
- Die Druckroutine geht danach zu Schritt 1908 weiter, um zu prüfen, ob die vorhergehende Suchoperation gültig war. Wenn sie gültig war, werden Seiten solange in der Abtastordnung erhalten und ausgedruckt, bis das Ergebnis der Suche-OK-Entscheidung bei Schritt 1908 anzeigt, daß das Ende des Bereiches erreicht wurde. An diesem Punkt wird eine FALSCH-Rückgabe vom Suche-OK-Schritt 1908 entdeckt, wodurch die Routine beim Schritt 1924 beendet wird.
- Zusätzlich zu den Seitenkoordinaten geben alle Seek- Funktionen (Suchfunktionen) der Seiten-Iterator-Objekte ein druckbares Seitenobjekt zurück, das verwendet werden kann, um die Seite zu zeichnen, deren Koordinaten soeben von der vorherigen Seek-Funktion zurückgegeben wurden. Das druckbare Seitenobjekt ist nur eine einfache und komfortable Möglichkeit, eine Seite darzustellen, die gedruckt werden soll (oder sie am Monitor anzuzeigen) . Das druckbare Seitenobjekt enthält eine Anzahl von Funktionen, die Informationen über die Seite holen und sie zeichnen können. Zu diesen Funktionen gehören:
- Die GetPageNumber-Funktion gibt die Seitennummer der momentan ausgewählten Seite zurück; die GetPageDescription-Funktion gibt die erwartete Seitenbeschreibung für die Seite zurück; und die GetPageActiveArea-Funktion gibt einen aktiven, druckbaren Bereich innerhalb der Seite gemäß der Auswahl des Anwendungsprogramms zurück. Die Draw-Funktion ermöglicht, daß die Seite auf jedem beliebigen grafport, einem Drucker oder einem Monitor gezeichnet werden kann. Eine Implementierung der Draw-Funktion kann daraus bestehen, eine "Seitenmatrix" z.B. in einem grafport zu erzeugen; die Seite in den richtigen Bereich innerhalb der Seitenmatrix zu übersetzen; wobei die übersetzte Seite mit einem Anschluß verknüpft wird; die Seite zuzuschneiden und die zugeschnittene Seite am Anschluß zu zeichnen, wie dies durch die folgenden C++-Aussagen dargestellt wird (wobei es sich beim fPageIterator um jenen Seiten-Iterator handelt, der das druckbare Seitenobjekt erzeugt):
- Die Arbeitsweise der Buchseiten-Numerierung ist im wesentlichen gleich wie jene des Einzelseiten-Numerierungsobjekts, mit einem einzigen wesentlichen Unterschied, der auftritt, wenn das Buchseiten-Numerierungsobjekt erzeugt wird. Wie zuvor erwähnt, ist der Paginator polymorph und kann abhangig von den Variablen, die dem Konstruktor zur Verfügung gestellt werden, wenn das Paginatorobjekt konstruiert wird, mehrere unterschiedliche Paginierungsfunktionen durchführen. Insbesondere werden während der Konstruktion des Buchseiten-Numerierungsobjektes der linke obere Verschiebungszwischenraum, die Gittergröße (Anzahl an Seiten) und die Seitengröße dem Paginator-Konstruktor vom Buchseiten-Numerierungsobjekt zur Verfügung gestellt. Diese Parameterauswahl führt dazu, daß der Paginator-Konstruktor ein Paginatorobjekt konstruiert, welches gemäß dem in Figur 12 dargestellten Flußdiagramm arbeitet, um die erforderliche Ausdehnung zu berechnen, damit der Paginator unter dem "Macerate"-Modell arbeiten kann.
- Mit Ausnahme der zuvor erwähnten Änderung ist die Arbeitsweise des Buchseiten-Numerierungsobjektes im wesentlichen gleich wie jene des Einzelseiten-Numerierungsobjektes.
- Das Mischblatt-Numerierungsobjekt ist ein Objekt, das Sammlungen anderer Seitennumerierungstypen reprasentiert. Seine grundlegende Struktur entspricht einer Reihe mit zwei Enden (deque), und andere Seitennumerierungen können auf sehr einfache Weise der Reihe hinzugefügt und aus der Reihe entfernt werden.
- Das Vererbungsdiagramm für das Mischblatt-Numerierungsobjekt ist in Figur 20 dargestellt, welche anzeigt, daß das Mischblatt-Numerierungsobjekt 2006 sowohl von einem Seitennumerierungsobjekt 2000 als auch einem Seiten-Deque- Objekt 2002 abstammt. Das Deque-Objekt 2002 besitzt seinen eigenen Deque-Iterator 2004, der erzeugt wird, wenn das Deque-Objekt vom Deque-Objekt-Konstruktor erzeugt wird.
- Bei dem Seiten-Deque mit zwei Enden handelt es sich um ein Standard-Speicherobjekt, das in diesem Fachbereich gut bekannt ist. Im allgemeinen wird das Deque von einer Vielzahl an Funktionen manipuliert, die es ermöglichen, daß Einheiten entweder am Beginn der Reihe, am Ende der Reihe oder an einem anderen festgelegten Punkt innerhalb der Reihe hinzugefügt werden. Es werden zusätzliche Routinen zur Verfügung gestellt, um einige oder alle Einheiten in dem Deque zu löschen. Da die Routinen zur Manipulierung von Objekten in einem Deque gut bekannt sind, werden sie zum Zwecke der Klarheit im folgenden nicht näher beschrieben.
- Ähnlich wie das Seiten-Deque besitzt auch das Mischblatt-Numerierungsobjekt 2006 seinen eigenen Seiten-Iterator 2008 und einen zugeordneten Seitenbereich 2010. Das Mischblatt-Numerierungsobjekt ermöglicht es, daß Gruppen von Seiten auf verschiedene Weise kombiniert werden können, um andere komplexe Strukturen zu erzeugen, und es akzeptiert jedes beliebige Seitennumerierungsobjekt einschließlich anderer Mischblatt-Numerierungsobjekte. Daher können Mischblatt-Numerierungsobjekte auf jede beliebige Tiefe verschachtelt werden.
- Intern handelt es sich bei den Einheiten, die tatsächlich in der Deque-Struktur gespeichert werden, um die Seiten-Iteratoren für die einzelnen zugeordneten Seitennumerierungsobjekte. Wenn ein Seitennumerierungsobjekt dem Seiten-Deque hinzugefugt wird, wird der entsprechende Seitennumerierungsiterator erzeugt, und der Iterator wird stattdessen hinzugefügt. In der Folge können die Seiten in der Mischblatt-Numerierung ausgedruckt werden, indem einfach die im Deque gespeicherten Iteratoren eines jeden Seitennumerierungsobj ektes nacheinander aufgerufen werden. Insbesondere ruft der Seiten-Iterator 2008 während des Druckvorganges den Deque-Iterator 2004 auf, der daraufhin den ersten im Seiten-Deque gespeicherten Iterator aufruft.
- Dieser ausgewählte Seiten-Iterator wird danach durch alle seine Seiten iteriert, um die Seiten in dem ihm zugeordneten Seitennumerierungsobjekt zu drucken. Der Deque-Iterator ruft danach den nächsten Seiten-Iterator vom Deque auf, und die Operation wird auf diese Weise fortgesetzt, bis alle Seiten in der Mischblatt-Numerierung gedruckt wurden. Der Druckvorgang ist im Detail in Figur 21 dargestellt.
- Während eines Druckzyklus arbeitet der Mischblattiterator weitgehend wie der Seiten-Iterator, welcher der zuvor diskutierten Einzelseitennumerierung und der Buchseitennumerierung zugeordnet ist. Die eigentliche Druckroutine ist im wesentlichen dieselbe wie die in Figur 19 dargestellte, aber mit der Ausnahme, daß die in der Seiten- Iterator-Druckroutine verwendeten Funktionen SeekFirstPage-InRange und SeekNextPageInRange modifiziert wurden, um die indirekte Verwendung mehrerer Seiten-Iteratoren aufzunehmen.
- Insbesondere beginnt die SeekFirstPageInRange-Routine, die im Mischblatt-Iterator verwendet wird, bei Schritt 2100, und bei Schritt 2102 führt die Routine eine Prüfung durch, um zu erkennen, ob der Mischblattiterator gültig ist. Wenn er nicht gültig ist, werden die Koordinaten der aktuellen Seite bei Schritt 2114 zurückgegeben, und die Routine endet bei Schritt 2116.
- Wenn sich bei Schritt 2102 jedoch zeigt, daß der Mischblattiterator gültig ist, wird der Deque-Iterator bei Schritt 2104 auf seine Gültigkeit überprüft. Wenn sich herausstellt, daß dieser letztere Iterator ungültig ist, geht die Routine zu Schritt 2114 weiter, um bei Schritt 2116 beendet zu werden. Wenn jedoch bei Schritt 2104 festgestellt wird, daß der Deque-Iterator gültig ist, wird der Deque-Iterator bei Schritt 2106 dazu verwendet, den ersten Seitennumerierungsiterator von jenem Deque, das mit dem Mischblattobjekt in Verbindung steht, zu holen. Dieser Iterator wird dann bei Schritt 2108 auf seine Gültigkeit überprüft, wobei die Routine bei den Schritten 2114 und 2116 endet, wenn sich herausstellt, daß der erste Iterator ungültig ist. Wenn der erste Seiten-Iterator jedoch gültig ist, wird der validierte Iterator bei Schritt 2110 verwendet, die erste Seite im vorgewählten Seitenbereich mittels einer SeekFirstPageInRange-Routine zu holen, wie zum Beispiel jener, die in Figur 17 dargestellt ist und vor kurzem im Zusammenhang damit beschrieben wurde.
- Bei Schritt 2112 wird eine SeekOK-Routine überprüft, um sicherzustellen, daß beim letzten Holvorgang gültige Seitenkoordinaten zurückgegeben wurden, und wenn dies der Fall war, werden die Koordinaten der aktuellen Seite zurückgegeben, und die Routine endet bei Schritt 2114 bzw. 2116. Wenn die SeekFirstPageInRange-Routine bei Schritt 2110 keine gültigen Seitenkoordinaten produzierte, wird der Deque-Iterator bei Schritt 2118 dazu verwendet, den nächsten Seiten-Iterator im Deque zu holen. Die Routine geht danach zu Schritt 2108 weiter, um zu prüfen, ob der Seiten- Iterator gültig ist, und wenn er gültig ist, wird der Iterator verwendet, um die erste Seite in der ihm zugeordneten Seitennumerierung zu holen. Der Vorgang wird auf diese Weise fortgesetzt, bis entweder die erste Seite erfolgreich von einer Seitennumerierung erhalten wurde, wobei die Seekok-Routine 2102 zu diesem Zeitpunkt gültige Koordinaten der ausgewählten Seite zurückgibt, oder bis keine gültigen Seiten-Iteratoren im Seiten-Deque übrigbleiben, wobei die Koordinaten der aktuellen Seite zu diesem Zeitpunkt zurückgegeben werden.
- Die ebenfalls beim Drucken der Mischblatt-Numerierung verwendete SeekNextPageInRange-Routine ist im Detail in Figur 22 dargestellt. Diese letztere Routine arbeitet insoferne auf ähnliche Weise wie die SeekFirstPageInRange-Routine der zuvor diskutierten Mischblatt-Numerierung, als daß Seiten-Iteratoren der Reihe nach vom Seiten-Deque geholt werden und danach jeder Seiten-Iterator dazu verwendet wird, die nächste Seite in den ihm zugeordneten Bereich zu holen. Die SeekNextPageInRange-Routine für das Mischblatt-Numerierungsobjekt ist im Detail in Figur 22 dargestellt. Nach dem Beginn bei Schritt 2200 werden sowohl der Mischblatt-Iterator als auch das Deque in den Schritten 2202 bzw. 2204 auf ihre Gültigkeit überprüft. Wenn sich in einem der Fälle herausstellt, daß der Iterator ungültig ist, gibt die Routine die Koordinaten der aktuellen Seite bei Schritt 2216 zurück und endet bei Schritt 2220.
- Wenn in den Schritten 2202 und 2204 festgestellt wird, daß sowohl der Deque- als auch der Mischblatt-Iterator gültig ist, wird der aktuelle Seiten-Iterator bei Schritt 2206 auf seine Gültigkeit hin überprüft, und ein ungültiger Seiten-Iterator führt dazu, daß die Routine bei Schritt 2220 beendet wird, nachdem die Koordinaten der aktuellen Seite bei Schritt 2216 zurückgegeben wurden. Wenn der aktuelle Seiten-Iterator bei Schritt 2208 für gültig befunden wird, wird der Seiten-Iterator dazu verwendet, die nächste Seite in der zugehörigen Seitennumerierung zu holen, indem eine SeekNextPageInRange-Routine, wie zum Beispiel eine von jenen, die zuvor diskutiert wurden, verwendet wird, und bei Schritt 2210 wird eine Überprüfung durchgeführt, um zu bestimmen, ob die Koordinaten der nächsten Seite gültig sind. Wenn von der Suche eine gültige Seite zurückgegeben wird, werden die Koordinaten jener Seite bei Schritt 2216 zurückgegeben, und die Routine endet bei Schritt 2220.
- Wenn jedoch bei Schritt 2210 bestimmt wird, daß die Suche zu keinen gültigen Seitenkoordinaten geführt hat (was möglicherweise anzeigt, daß der aktuelle Seiten-Iterator das Ende seines Bereiches erreicht hat), wird der Deque- Iterator dazu verwendet, den nächsten Seiten-Iterator zu holen, wie dies bei Schritt 2212 angeführt ist. In der Folge wird der neu erhaltene Iterator bei Schritt 2214 dazu verwendet, die erste Seite in der zugeordneten Seitennumerierung zu holen, wobei eine wie zuvor beschriebene Suchroutine verwendet wird.
- Bei Schritt 2218 wird die Suche, die zum Holen der ersten Seite in der Seitennumerierung verwendet wird, überprüft, um zu bestimmen, ob die zurückgegebenen Koordinaten gültig sind; wenn dies der Fall ist, werden sie bei Schritt 2216 zurückgegeben, und die Routine endet bei Schritt 2220. Wenn jedoch die Suche, die zum Holen der ersten Seite in der neuen Seitennumerierung verwendet wird, keine gültigen Koordinaten zurückgibt, kehrt die Routine zu Schritt 2206 zurück, wo der Seiten-Iterator auf seine Gültigkeit überprüft wird, und wenn der Seiten-Iterator noch immer gültig ist, wird er dazu verwendet, die nächste Seite im Bereich wie zuvor beschrieben zu holen. Auf diese Weise wird die Routine so lange wiederholt, bis alle Seiten-Iteratoren, die im Seiten-Deque gespeichert sind, durchlaufen wurden, oder bis eine gültige nächste Seite erhalten wird.
- Das letzte wichtige Druckobjekt ist ein Seitenzusammensetzungsobjekt, welches die Vordruck-Verarbeitung für normale, druckbare Dokumente durchführt und dazu verwendet werden kann, Zusätze zu den Seiten hinzuzufügen, wie zum Beispiel Registrierungsmarken, Verzierungen, Markierungen zum Schneiden und Falten, Notationen und Prozeßfarbsignaturen. Andere Funktionen, die durchgeführt werden können, umfassen die Erstellung von Aufklebern, das n-aufwärts- Drucken oder einfach das Ändern der bestehenden Seitenränder. Ein Seitenzusammensetzer kann für bestimmte Seitennumerierungsziele maßgeschneidert werden, aber ein Zusammensetzer besitzt in sich keine Ordnung oder Zielinformationen. Zusammensetzer, die in Übereinstimmung mit der vorliegenden Erfindung erzeugt werden, können an jedem beliebigen Seitennumerierungsziel angewandt und in beliebiger Tiefe verschachtelt werden. Ein Seitenzusammensetzungsobjekt kann auch gedruckt werden, aber es kann nicht ohne ein zu druckendes Seitennumerierungsziel drucken.
- Im allgemeinen führt jeder Seitenzusammensetzer eine bestimmte Funktion durch. Zum Beispiel kann ein bestimmter Seitenzusammensetzer Registrierungsmarken zu einem Ziel- Seitennumerierungsdokument hinzufügen. Ein anderer Seitenzusammensetzer kann spezielle Ränder hinzufügen, usw. Zum Zwecke der Veranschaulichung werden im folgenden zwei spezifische Seitenzusammensetzungsobjekte näher beschrieben, die eine Seitenausschießung und ein n-aufwärts-Drucken ausführen.
- Figur 23 zeigt ein vereinfachtes Klassenhierarchie- Diagramm für das Seitenzusammensetzungsobjekt. Wie dargestellt, ist die Seitenzusammensetzerklasse 2302 eine Unterklasse der Seiten-Iteratorklasse 2300, die im Detail zuvor unter Bezugnahme auf die frühere Seitennumerierungsobjekte beschrieben wurde (die Seitenzusammensetzerklasse muß jedoch nicht eine Unterklasse der Seiten-Iteratorklasse sein). Wie auf veranschaulichende Weise in Figur 23 dargestellt, besitzt die Seitenzusammensetzerklasse 2302 zwei Unterklassen: eine n-aufwärts-Zusammensetzerklasse 2304, und eine Seitenausschießungsklasse 2306. In Übereinstimmung mit der vorhergehenden Diskussion können auch andere Unterklassen geschaffen werden, um andere Seitenzusammensetzungsfunktionen zu ermöglichen, wie z.B. die Hinzufügung von Rändern, usw. Darüber hinaus ist dem Seitenausschießer 2306 ein Ausschießungssequenzer 2308 zugeordnet.
- Da es sich bei der Seitenzusammensetzerklasse 2302 um eine Unterklasse der Seiten-Iteratorklasse 2300 handelt, erbt sie viele der Funktionen, die in der Seiten-Iteratorklasse vorhanden sind, einschließlich den zuvor diskutierten primären Druckroutinen. Das von den in Figur 23 dargestellten Klassen konstruierte Seiten-Iteratorobjekt und dessen Operation und Funktionen werden im Detail im Zusammenhang mit der untenstehenden Diskussion des n-aufwärts- Zusammensetzerobjekts und des Seitenausschießungsobjekts beschrieben.
- Der Prozeß des n-aufwärts-Druckens wurde bereits teilweise in Verbindung mit dem Paginatorobjekt beschrieben. Das n-aufwärts-Drucken ist der Prozeß des Anordnens mehrerer Seitenansichten (oder teilweiser Seitenansichten) auf einem einzelnen Bogen Papier, wobei alle Ansichten in die selbe Richtung ausgerichtet sind. Im Gegensatz dazu ist das Ausschießen ein Vorgang der Anordnung mehrerer Seiten auf einem einzelnen Bogen Papier, so daß, wenn der Bogen Papier in einer gegebenen Reihenfolge gefaltet und entlang bestimmter Faltlinien geschnitten wird, ein lesbares Dokument mit einer richtigen Seitenordnung erzeugt wird. Der erwünschte Ausschieß-Typ wird von einer Vielzahl unterschiedlicher Faktoren bestimmt, einschließlich der Anzahl der Seiten pro Papierbogen, ob der Papierbogen auf beiden Seiten bedruckt wird oder nur auf einer Seite, und dem Verfahren zum Falten des Bogens.
- Die Unterschiede zwischen dem n-aufwärts-Drucken und dem Ausschießen sind in Figur 24 dargestellt. Insbesondere zeigt Figur 24A die Ausgabe, die in Übereinstimmung mit dem 4-aufwärts-Drucken vorbereitet wurde, wobei 4 Seiten auf einen einzelnen Bogen Papier gedruckt werden. Insbesondere sind die Seiten 2402, 2404, 2406 und 2410 auf einem einzelnen Bogen Papier 2408 angeordnet, wobei die schwarzen Punkte (von denen Punkt 2400 beispielhaft ist) die Position der linken oberen Ecke einer jeden Seite anzeigen. Wie ersichtlich ist, sind alle Seiten auf die gleiche Weise ausgerichtet.
- Im Gegensatz dazu zeigt Figur 24B einen Ausschießungsdruck zur Herstellung einer achtseitigen Broschüre aus einem einzigen Bogen Papier, der auf beiden Seiten bedruckt wird. Die Seite 2412 zeigt die Anordnung der Vorderseite des Bogens, und die Seite 2420 zeigt die Anordnung der Rückseite. Strichlierte Linien, wie zum Beispiel die strichlierte Linie 2418, weisen auf eine Faltlinie hin, und durchgehende Linien, wie zum Beispiel die Linie 2416, weisen auf eine Schnittlinie hin. Die Seiten für die Broschüre müssen am Bogen so angeordnet werden, daß die Vorderseite und die Rückseite eines jeden Blattes die richtige Reihenfolge aufweist, und so daß die "ausgeschossene" Position und Ausrichtung einer jeden Seite am Bogen dazu führt, daß die Seiten am Endprodukt in der richtigen Reihenfolge und mit der richtigen Ausrichtung erscheinen. Das Ausschießungszusammensetzerobjekt führt diese Aufgabe aus: so wie in Figur 24A zeigt auch hier der schwarze Punkt in der Ecke einer jeden Seite die linke obere Ecke an, und die Seiten sind wie in der Mitte einer jeden Seite gezeigt numeriert. Zum Beispiel entspricht die Seite 2414 der Seite 4 in der fertigen Broschüre.
- Da der n-aufwärts-Zusammensetzer eine Unterklasse des Seitenzusammensetzers ist, der wiederum eine Unterklasse der Seiten-Iteratorklasse ist, ähnelt die Druckfunktion, die vom n-aufwärts-Zusammensetzer verwendet wird, jener, die vom Seiten-Iterator (dargestellt in Figur 19) verwendet wird, jedoch mit der Ausnahme, daß die SeekFirstPageIn- Range-Routine und die SeekNextPageInRange-Routine anders sind. Diese letzteren Funktionen werden von der Tatsache verkompliziert, daß beim n-aufwärts-Zusammensetzer eine Gruppe von Bildern auf einer einzelnen Seite angeordnet wird. Die SeekFirstInRange-Funktion, welche beim n-aufwärts-Zusammensetzer-Unterobjekt verwendet wird, ist im Detail in Figur 25A und 25B dargestellt. Bei senkrechter Anordnung bilden diese Figuren ein einziges Flußdiagramm, welches die SeekFirstPageInRange-Routine darstellt.
- Die internen Druckroutinen im n-aufwärts-Zusammensetzerobjekt verwenden mehrere interne Variablen, um die Seiten zu verfolgen, während jede einzelne Seite gebildet wird. Jede Seite (die aus Unterseiten gebildet wird) wird mit einer Hauptseitennummer bezeichnet, und die Gesamtnummer der Seiten einer jeden Hauptseite wird von einem Schrittzähler überwacht. Das Anwendungsprogramm liefert den Schrittzähler und einen Seitenbereich für die Hauptseiten. Diese Variable ermöglicht es der Druckroutine, einige oder alle Seiten in der darunterliegenden Seitennumerierung zu drucken. Die SeekFirstPageInRange-Routine beginnt bei Schritt 2500 und geht zu Schritt 2502 weiter, wo die Zielseitennumerierung auf ihre Gültigkeit hin überprüft wird. Wenn die Zielnumerierung ungültig ist, geht die Routine über die verknüpfenden Kreise 2523 und 2530 zu Schritt 2548 weiter, wo die momentanen Seitenkoordinatenwerte zurückgegeben werden; die Routine wird bei Schritt 2550 beendet.
- Wenn sich bei Schritt 2502 jedoch herausstellt, daß die Zielseitennumerierung gültig ist, geht die Routine zu Schritt 2506 weiter, wo der n-aufwärts-Objekt-Seiten-Bereich und der Zielnumerierungs-Seiten-Bereich überprüft werden, und wenn beide diese Bereiche voll sind, werden alle Seiten im Dokument in den Bereich eingeschlossen, und die erste Seite kann durch einfaches Laden der ersten Seite in das Dokument erhalten werden. In diesem Fall geht die Routine zu Schritt 2508 weiter, wo die Koordinaten der ersten Seite in der Abtastordnung erhalten werden. Über die Verknüpfungskreise 2518 und 2528 geht die Routine zu Schritt 2540 weiter, wo die Suchfunktion, die zum Erhalten der Koordinaten der ersten Seite bei Schritt 2508 verwendet wurde, überprüft wird, um sicherzustellen, daß die erste Seite gültig ist. Darüber hinaus wird eine weitere Überprüfung durchgeführt, um sicherzustellen, daß die Hauptseitennummer für die gerade verarbeitete Seite innerhalb des vom Anwendungsprogramm vorgegebenen Bereiches liegt.
- Wenn die Hauptseitennummer der aktuellen Seite außerhalb des vom Anwendungsprogramm vorgegebenen Bereiches liegt, fährt die Routine damit fort, die Koordinaten der aktuellen Seite zurückzugeben (bei Schritt 2548) und endet bei Schritt 2550.
- Wenn jedoch die erste Seite, die von der Suchroutine erhalten wurde, gültig ist und die Hauptseitennummer innerhalb des angegebenen Bereiches liegt, wird die aktuelle Seitennummer bei Schritt 2542 erhalten, die aktuellen Seitenkoordinaten werden bei Schritt 2546 auf (0.0) gesetzt und bei Schritt 2548 zurückgegeben, und die Routine wird bei Schritt 2550 beendet.
- Wenn, zurückkehrend zu Schritt 2506, Seiten im n-aufwärts-Seitenbereich und im Zielseitenbereich vorhanden sind, wird eine Such-Einstellung bei Schritt 2510 vorgenommen, bei der die internen Seitennummernvariablen und der Stoppzähler auf Werte zurückgesetzt werden, die vom Anwendungsprogramm vorgegeben werden. Die Routine geht danach zu Schritt 2512 weiter, wo die erste Seite im Zielnumerierungsseitenbereich mit Hilfe einer SeekFirstPageInRange- Funktion erhalten wird, die zuvor für die Zielseitennumerierung verwendet und oben diskutiert wurde.
- Bei Schritt 2514 wird die Hauptseitennummer auf 0 gesetzt, was anzeigt, daß die erste Seite gerade überprüft wird. Beim Entscheidungsschritt 2516 wird die neue Hauptseitennummer mit dem vom Anwendungsprogramm vorgegebenen Hauptseitennummernbereich verglichen. Wenn die Hauptseitennummer innerhalb des Seitenbereiches liegt und die vorhergegangene Suchoperation anzeigt, daß die geladene Seite gültig ist, geht die Routine, wie zuvor beschrieben, über die Verknüpfungskreise 2518 und 2528 zu Schritt 2540 weiter, und die aktuelle Seitennummer wird erhalten. Die Seitenkoordinaten werden bei Schritt 2546 auf (0.0) gesetzt und bei Schritt 2548 zurückgegeben, und die Routine endet bei Schritt 2550.
- Wenn sich bei Schritt 2516 jedoch herausstellt, daß die Hauptseitennummer außerhalb des vom Anwendungsprogramm vorgegebenen Bereiches liegt, wird die Hauptseitennummer hochgezählt, bis sie innerhalb des Bereiches liegt. Jedesmal, wenn die Hauptseitennummer hochgezählt wird, muß auch die Nummer der Unterseiten, die sich auf jeder Hauptseite befinden, in der Zielseitennumerierung übergeben werden. Insbesondere geht die Routine in diesem letzteren Fall durch die Verknüpfungskreise 2520 und 2524 zu Schritt 2526 weiter, wo die Hauptseitennummer hochgezählt wird. Die Zielseitennumerierungseiten, welche der Hauptseite entsprechen, die soeben übersprungen wurde, werden von der Schleife, welche den Entscheidungsschritt 2534 und die Verarbeitungsschritte 2538 und 2544 umfaßt, übersprungen. Insbesondere wird ein Schleifenzähler bei Schritt 2532 auf Null gesetzt und mit dem Schrittzähler bei Schritt 2534 verglichen. Wenn die Zählervariable kleiner ist als der Schrittzähler, wird die nächste Seite von der Zielseitennumerierung bei Schritt 2538 geholt, wobei eine SeekNext- PageInRange-Funktion, wie sie zuvor beschrieben wurde, verwendet wird.
- Um die Schleife fortzusetzen, wird die Zählervariable bei Schritt 2544 hochgezählt, und die Schleife wird wiederholt, bis eine Anzahl an Unterseiten, welche der Hauptseite entsprechen, übersprungen wurde. An diesem Punkt kehrt die Routine über die Verknüpfungskreise 2536 und 2522 zu Schritt 2516 zurück, wo die neue Hauptseitenzahl mit dem Zielbereich verglichen wird. Wiederum wird, wenn die Hauptseitenzahl noch immer außerhalb des Zielbereiches liegt, der Vorgang wiederholt, bis schließlich die Hauptseitenzahl innerhalb des Zielbereiches liegt. In diesem letzteren Fall geht die Routine durch die Verknüpfungskreise 2518 und 2528 weiter, um die aktuelle Seitennummer zu holen und die aktuellen Seitenkoordinaten zurückzugeben.
- Die n-aufwärts-Seitenzusammensetzer-Druckroutine umfaßt auch eine SeekNextPageInRange-Funktion, die im Detail in Figur 26A und 26B dargestellt ist. Ebenso wie bei Figur 25A und 25B bilden Figur 26A und 26B, wenn sie senkrecht übereinander angeordnet werden, ein vollständiges Flußdiagramm, welches die genaue Operation des n-aufwärts-Zusammensetzers bei der Ausführung der SeekNextInRange-Funktion darstellt.
- Diese Routine beginnt bei Schritt 2600 und geht zu Schritt 2602 weiter, wo die Zielseitennumerierung auf ihre Gültigkeit hin überprüft wird. Wenn die Zielseitennumerierung ungültig ist, geht die Routine über die verknüpfenden Kreise 2624 und 2634 zu Schritt 2650 weiter, wo die Seitenkoordinatenwerte der aktuellen Seite zurückgegeben werden, und die Routine wird bei Schritt 2652 beendet.
- Wenn sich jedoch bei Schritt 2602 herausstellt, daß die Zielseitennumerierung gültig ist, werden der n-aufwärts-Bereich und der Zielseitennumerierungsbereich überprüft, um zu erkennen, ob alle Dokumentseiten in diesen Bereichen enthalten sind. Wenn dies der Fall ist, wird die nächste Seite in der Gitterreihenfolge erhalten, und die Routine geht durch die Verknüpfungskreise 2616 und 2632 zu Schritt 2642 weiter, wo die Hauptseitennummer überprüft wird, um zu erkennen, ob sie innerhalb des vorherbestimmten Bereiches liegt. Wenn dies nicht der Fall ist, werden die aktuellen Seitenwerte bei Schritt 2650 zurückgegeben, und die Routine endet bei Schritt 2652.
- Wenn bei Schritt 2642 die Hauptseitennummer jedoch innerhalb des angegebenen Bereiches liegt, werden die aktuellen Seitennummern bei Schritt 2646 erhalten, die Seitenkoordinaten werden bei Schritt 2648 auf (0.0) gesetzt, und die Seitenkoordinaten werden bei Schritt 2650 zurückgegeben, wobei die Routine bei Schritt 2652 endet.
- Wenn, zurückkommend auf Schritt 2606, Seiten im n-aufwärts-Seitenbereich und im Zielseitennumerierungsbereich vorhanden sind, geht die Routine zu Schritt 2610 weiter, wo die aktuelle Seite im Zielseitennumerierungsbereich erhalten wird. Diese letztere Operation wird mit Hilfe einer SeekToPageNumber-Funktion durchgeführt, die im Detail in Figur 27 dargestellt ist.
- Wenn wir für den Moment annehmen, daß die Seitenkoordinaten der aktuellen Seite bei Schritt 2610 erhalten wurden, geht die Routine zu Schritt 2614 weiter, wo die Hauptseitennummer hochgezählt wird. Bei Schritt 2616 wird die hochgezählte Hauptseitennummer mit dem von der Anwendung angegebenen Hauptseitenbereich verglichen, um festzustellen, ob die nächste Hauptseite innerhalb des von der Anwendung angegebenen Bereiches liegen wird. Wenn nicht, geht die Routine über die Verknüpfungskreise 2618 und 2632 weiter, um bei Schritt 2646 die aktuelle Seitennummer zu holen, um die Seitenkoordinaten bei Schritt 2648 auf (0.0) zu stellen, um die Seitenkoordinaten bei Schritt 2650 zurückzugeben, und um bei Schritt 2652 zu enden.
- Wenn die Hauptseitennummer bei Schritt 2616 außerhalb des angegebenen Bereiches liegt, geht die Routine über die Verknüpfungskreise 2620 und 2628 weiter, um die Hauptseitennummer hochzuzählen und die entsprechende Anzahl der Unterseiten in der Zielseitennumerierung weiterzuzählen, bis die Hauptseitennummer innerhalb des vorherbestimmten Bereiches liegt. Diese Operation wird von einer Programmschleife ausgeführt, die von einem Schleifenzähler gesteuert wird. Der Schleifenzähler wird bei Schritt 2630 auf Null gesetzt, und bei Schritt 2638 wird die aktuelle Schleifenzahl mit der Schrittzahl verglichen, wodurch die Gesamtanzahl an Unterseiten auf jeder Hauptseite angegeben wird. Wenn der Schleifenzähler bei Schritt 2638 kleiner ist als der Schrittzähler, was anzeigt, daß zusätzliche Seiten auf die gerade überprüfte Hauptseite angeordnet werden können, wird die nächste Seite in der Zielseitennumerierung bei Schritt 2640 erhalten, und der Schleifenzähler wird bei Schritt 2644 hochgezählt Die Routine geht danach zu Schritt 2638 weiter, wo der hochgezählte Schleifenzähler wiederum mit dem Schrittzähler verglichen wird. Die Operation wird auf diese Weise solange fortgesetzt, bis alle Seiten auf jeder Hauptseite, die übergangen wurde, ebenfalls in der Zielseitennumerierung übersprungen werden.
- Wenn sich bei Schritt 2638 herausstellt, daß die Anzahl an Seiten, welche gleich der Schrittzählung ist, übersprungen wurde, beendet die Routine die Schleife und geht über die Verknüpfungskreise 2626 und 2622 weiter und zurück zum Schritt 2614, wo die Hauptseitennummer hochgezählt und danach bei Schritt 2616 mit dem von der Anwendung vorgegebenen Bereich verglichen wird. Schließlich wird die Hauptseitennummer innerhalb des von der Anwendung vorgegebenen Bereiches liegen, und die Routine geht über die Verknüpfungskreise 2618 und 2632 zu Schritt 2642 weiter, um, wie zuvor beschrieben, beendet zu werden.
- Wie oben beschrieben wird eine separate Routine dazu verwendet, den Wert der aktuellen Seitennummer von der Hauptseitennummer und der Schrittzählung zu erhalten. Insbesondere ist diese letztere Routine im Detail in Figur 27 dargestellt und beginnt bei Schritt 2700. Die Routine geht danach zu Schritt 2702 weiter, wo eine Uberprüfung durchgeführt wird, um zu bestimmen, ob die Zielseitennumerierung gültig ist. Wenn dies nicht der Fall ist, werden die aktuellen Seitenkoordinaten bei Schritt 2714 zurückgegeben, und die Routine endet bei Schritt 2716.
- Wenn sich bei Schritt 2702 jedoch herausstellt, daß die Zielseitennumerierung gültig ist, geht die Routine zu Schritt 2704 weiter, wo die Seitennummer und die Schrittzählung von den anwendungsspezifischen Werten zurückgesetzt werden. Als nächstes wird die Hauptseitennummer bei Schritt 2706 mit dem Gesamt-Hauptseiten-Zähler verglichen, und wenn die Hauptseite den Gesamtzähler überschreitet, fährt die Routine damit fort, die aktuellen Seitenkoordinaten bei Schritt 2714 zurückzugeben, und endet bei Schritt 2716.
- Wenn sich bei Schritt 2706 jedoch herausstellt, daß die Hauptseitennummer kleiner ist als die Gesamtseitenzahl, geht die Routine zu Schritt 2708 weiter, wo die Hauptseitennummer auf die aktuelle Seitennummer gestellt und eine neue Zielseitennummer entsprechend der aktuellen Seite in der Zielseitennumerierung durch Multiplizieren der Hauptseitennummer mit dem Schrittzähler festgelegt wird. Wenn die Zielseitennummer bei Schritt 2708 erhalten wurde, wird die entsprechende Seite bei Schritt 2710 geholt, die aktuellen Seitenkoordinaten werden bei Schritt 2712 auf (0.0) gesetzt, und die Routine geht zu den Schritten 2714 und 2716 weiter, wo die Seitenkoordinaten zurückgeben werden und die Routine beendet wird.
- Das Seitenzusammensetzungsobjekt arbeitet insoferne ähnlich wie das n-aufwärts-Zusammensetzerobjekt, als daß Unterseiten auf einer Hauptseite angeordnet werden; allerdings gibt es Unterschiede zwischen den zwei Funktionen, die im folgenden näher diskutiert werden. Im Ausschießungsprozeß werden mehrere Begriffe verwendet, welche das Verständnis des Prozesses erleichtern. Insbesondere bezieht sich der Begriff "Abschnitte" (auch als "Druckbögen" oder "Hülsen" bezeichnet) auf Ansammlungen von Seiten, die wie Abschnitte einer Zeitung geordnet werden: die Begriffe "Abschnitt, Druckbogen oder Hülse" sind oft gegenseitig ersetzbar. In einem formaleren Sinn wird mit "Abschnitt" jedoch jede Sammlung gefalteter Bögen bezeichnet, die zusammengebunden sind; als "Druckbogen" werden alle Seiten einer Publikation bezeichnet, die auf eine gefaltete Seite gedruckt wurden, und "Hülse" ist ein inoffizieller Begriff, mit dem jeder beliebige Stapel an Papierbögen bezeichnet wird. Der Begriff "Ausschießen" bezieht sich auf das Anordnen von Unterseiten auf Papierbögen zum späteren Binden, so daß alle Seiten in richtiger Ordnung und Ausrichtung angeordnet sind.
- Das Seitenausschießerobjekt verwendet ein zusätzliches Objekt, das als Seitenausschußsequenzer bezeichnet wird, bei dem es sich um eine zustandslose Klasse handelt, die Informationen über ein bestimmtes Ausschußverfahren zurückgibt. Außer im Hinblick auf die Anzahl an Seiten in einer Hülse oder einem Abschnitt kann ein bestimmtes Ausschußsequenzerobjekt nicht geändert werden, um ein neues Verhalten zu definieren. Wenn ein neues Verhalten gewünscht wird, muß ein neuer Sequenzer von der höheren Klasse abgeleitet und erzeugt werden. Zu den zusätzlichen Informationen, welche ein Ausschußobjekt definieren, gehört, ob ein Papierbogen auf beiden Seiten bedruckt ist, sowie die Anzahl an Bögen in einer Hülse oder einem Abschnitt.
- Im Seitenausschießerobjekt sind Funktionen enthalten, die eine Nummer in der Ausschießsequenz empfangen, Berechnungen durchführen und die korrekte Seitennummer des Quelldokuments zurückgeben, die für jene Position in der Sequenz zu verwenden ist. Zusätzliche Funktionen weisen auch an, welcher Rotationswinkel für jene Seite in dieser Position zu verwenden ist. Insbesondere legt das Anwendungsprogramm eine Reihenfolge von Seitennummern fest, die in der normalen Rastersequenz immer zur Verfügung gestellt werden. Das Ausschießer-Seitenobjekt gibt die korrekte Quellseitennummer für diese Position in der Sequenz zurück.
- Eine veranschaulichende Routine, welche die für eine bestimmte Ausschieß-Position zu verwendende Seitennummer des Quelldokumentes zurückgibt, ist in Figur 26 dargestellt. Diese Routine empfängt eine Seitensequenz, wie zum Beispiel eine achtseitige Sequenz, wie z.B. [5, 4, 8, 1, 3, 6, 2, 7]. Diese Sequenz zeigt die Seitennummernsequenz für jede der Seiten an, die auf der Hauptseite angeordnet werden.
- Die Routine empfängt auch eine Indexnummer, die anzeigt, welche der acht Seiten momentan angeordnet wird.
- Die Ausschieß-Routine beginnt bei Schritt 2800 und geht zu Schritt 2802 weiter, wo eine Papierbogenvariable auf die Abschnittsgröße eingestellt wird, die vom Anwendungsprogramm vorgegeben wird. Als nächstes wird bei Schritt 2804 eine interne Variable, n, auf die Indexnummer dividiert durch 8 mal dem Modulo der Bogennummer gesetzt.
- Bei Schritt 2806 wird eine interne "Block"-Variable auf die Indexnummer dividiert durch 8 mal der Bogennummer gesetzt. Schließlich wird bei Schritt 2810 eine interne "Ergebnis"-Variable auf die "Block"-Nummer gesetzt.
- Die Routine geht dann zu Schritt 2812 weiter, bei dem es sich um eine "Umschalt"-Aussage handelt, die zur Auswahl eines der mehreren möglichen ausgewählten Pfade führt. Die Umschaltpfadauswahl wird von der Seitensequenznummer bestimmt, die an der Position des Indexmodulo 8 erscheint. In dieser Position befindet sich eine Seitennummer im Bereich zwischen 1 und 8, und diese Seitennummer wird dazu verwendet, einen der Pfade, 2814, auszuwählen, der eine Berechnung ausführt. In jedem der Pfade wird die Ergebnisvariable um eine Nummer hochgezählt, die von der Bogenvariable und der Nummer n xx, wie dies in Figur 28 dargestellt ist.
- Die modifizierte Ergebnisvariable wird danach bei Schritt 2816 zurückgegeben, und die Routine endet bei Schritt 2818.
- Eine ähnliche Routine, welche die Drehung der einzelnen Seiten bestimmt, ist in Figur 29 dargestellt. Bei der gewöhnlichen Ausschieß-Anordnung erfolgt die Drehung der einzelnen Seite entweder um 0 Grad oder um 180 Grad; die Seiten werden entweder in normaler Ausrichtung gedruckt, oder sie werden um die waagerechte Achse gedreht. Die Routine beginnt bei Schritt 2900 und geht zu einem "Umschalt"-Schritt 2902 weiter, wobei der von der Seitensequenznummer berechnete Umschaltindex durch das Indexwertmodub 8 indiziert wird. Wiederum führt die Ausgabe der Umschaltberechnung zu einer Nummer im Bereich zwischen 1 und 8, wobei die Nummer dazu verwendet wird, einen der Pfade 2904 auszuwählen. Der ausgewählte Pfad führt zu einer Drehung um 0 Grad oder um 180 Grad; das Ergebnis wird bei Schritt 2906 zurückgegeben, und die Rückgabe endet bei Schritt 2908.
- Die vom Seitenausschießer-Objekt verwendeten Druckroutinen ähneln jenen, die vom Seiten-Iteratorobjekt verwendet werden, weil das Seitenausschießer-Objekt von einer Unterklasse jener Klasse erzeugt wird, welche das Seitenzusammensetzer-Objekt erzeugt, das wiederum von einer Unterklasse des Seiten-Iteratorobjektes erzeugt wird. Demgemäß wird die in Figur 19 verwendete Routine dazu verwendet, die Seiten zu drucken, und die SeekFirstPageInRange-Funktion, die vom Ausschießerobjekt in der in Figur 19 gezeigten Routine verwendet wird, ist im Detail in Figur 30 dargestellt. Die Routine beginnt bei Schritt 3000 und geht zu Schritt 3002 weiter, wo die Zielseitennumerierung auf ihre Gültigkeit hin überprüft wird. Wenn die Zielseitennumerierung ungültig ist, geht die Routine zu Schritt 3010 weiter, wo die aktuellen Seitenkoordinaten zurückgegeben werden, und die Routine wird bei Schritt 3012 beendet.
- Wenn jedoch bei Schritt 3002 festgestellt wird, daß die Zielseitennumerierung gültig ist, geht die Routine zu Schritt 3004 weiter, wo der Ausschießer-Seitenbereich und der Zielseitenbereich überprüft werden, um zu erkennen, ob sie alle Dokumentenseiten enthalten. Wenn dies der Fall ist, wird die erste Seite im Dokument bei Schritt 3008 erhalten, ihre Koordinaten werden bei Schritt 3010 zurückgegeben, und die Routine endet bei Schritt 3012.
- Wenn sich bei Schritt 3004 jedoch Seiten innerhalb des Ausschießseitenbereiches und des Zielseitenbereiches befinden, werden die Seitenkoordinaten einer Verschiebeseite innerhalb des Bereiches bei Schritt 3006 geholt. Die Routine, welche den Holvorgang bei Schritt 3006 durchführt, ist im Detail in Figur 32 dargestellt und wird später diskutiert. Nach dem Erhalten der Verschiebeseite werden die Seitenkoordinaten bei Schritt 3010 zurückgegeben, und die Routine endet bei Schritt 3012.
- Die im Ausschießobjekt verwendete SeekNextPageInRange- Routine ist im Detail in Figur 31 dargestellt. Diese Routine beginnt bei Schritt 3100 und geht zu Schritt 3102 weiter, wo die Zielseitennumerierung auf ihre Gültigkeit hin überprüft wird. Eine ungültige Seitenzahl führt zur Rückgabe der aktuellen Seitenkoordinaten (bei Schritt 3112), und die Routine endet bei Schritt 3114.
- Wenn die Zielseitennumerierung jedoch gültig ist, wird der Hauptseitenzähler bei Schritt 3104 hochgezählt, die Bereichsverschiebung wird bei Schritt 3106 eingestellt, und die Bereichsverschiebung wird bei Schritt 3108 überprüft, um zu bestimmen, ob die Bereichsverschiebung dazu führt, daß der Bereich den vom Anwendungsprogramm vorgegebenen Seitenbereich überschreitet. Wenn die Bereichsverschiebungseinstellung ungültig ist, fährt die Routine bei Schritt 3112 damit fort, die aktuellen Seitenkoordinaten zurückzugeben, und endet bei Schritt 3114.
- Wenn jedoch bei Schritt 3108 festgestellt wird, daß die Bereichseinstellung gültig ist, wird der Sequenzzähler bei Schritt 3110 auf den gleichen Wert wie der Hauptseitenzähler mal der Anzahl an Seiten pro Hauptseite gesetzt, wie dies vom Anwendungsprogramm vorgegeben wird. Die Routine fährt bei Schritt 3112 damit fort, die Seitenkoordinaten, die vom Bereichsverschiebungseinstellprogramm empfangen wurden, zurückzugeben, und endet bei Schritt 3114.
- Figur 32 zeigt im Detail die Routine, die dazu verwendet wird, die Verschiebeseite in den Bereich zu bringen, welche in der in Figur 30 dargestellten SeekFirstPageIn- Range-Funktion verwendet wird. Insbesondere beginnt die Routine bei Schritt 3200 und geht zu Schritt 3202 weiter, wo der Ausschießseitenbereich und der Zielseitenbereich überprüft werden, um zu bestimmen, ob sie alle Dokumentenseiten enthalten. Wenn dies der Fall ist, wird die Seitennummer der nächsten Seite mit Hilfe der vorherbestimmten Seitenverschiebung geholt, die vom Anwendungsprogramm vorgegeben wird. Die Koordinaten dieser letzteren Seite werden dann bei Schritt 3216 zurückgegeben, und die Routine endet bei Schritt 3220.
- Wenn jedoch nicht alle Dokumentseiten im Ausschießseitenbereich und im Zielseitenbereich enthalten sind, geht die Routine zu Schritt 3204 weiter, wo die Seitenzähler und der Schrittzähler mit Hilfe der vom Anwendungsprogramm vorgegebenen Werte zurückgesetzt werden. Bei Schritt 3206 wird der Seitenzähler im ausgewählten Bereich überprüft, um zu erkennen, ob er größer als Null ist. Wenn er das nicht ist, wird der Sequenzzähler bei Schritt 3214 auf den Hauptseitenzähler mal den Seiten pro Hauptseite zurückgesetzt. Die Seitenkoordinaten der aktuellen Seite werden bei Schritt 3218 zurückgegeben, und die Routine endet bei Schritt 3220.
- Wenn der Seitenzähler bei Schritt 3208 jedoch größer als Null ist, wird der Hauptseitenzähler bei Schritt 3210 auf eine Verschiebenummer gesetzt, und der Seitenbereich wird bei Schritt 3212 auf seine Gültigkeit überprüft. Wenn der Seitenbereich nicht gültig ist, wird der Sequenzzähler wie zuvor unter Bezugnahme auf Schritt 3214 beschrieben zurückgesetzt, die Seitenkoordinaten werden bei Schritt 3218 zurückgegeben, und die Routine wird bei Schritt 3220 beendet.
- Wenn jedoch bei Schritt 3212 bestimmt wird, daß der Bereich gültig ist, wird die Verschiebung bei Schritt 3216 im Bereich eingestellt. Der Sequenzzähler wird bei Schritt 3214 zurückgesetzt, die Seitenkoordinaten werden bei Schritt 3218 zurückgegeben, und die Routine endet bei Schritt 3220.
- Ein vollständiges Druckbeispiel wird nun diskutiert, wobei die oben beschriebenen und im C++ Code geschriebenen Druckschnittstellenobjekte der Erfindung verwendet werden. Es wird darauf hingewiesen, daß dieses Beispiel nur aus einem Codefragment besteht und kein vollständiges Programm darstellt. Es wird für Fachleute dieses Bereiches hinsichtlich der Verwendung der Druckschnittstellenklassen veranschaulichend sein, jedoch muß zusätzlicher Code programmiert werden, um die Anwendung ausführbar zu machen, was jedoch für die Fachleute dieses Bereiches klar erkennbar sein wird. Zum Beispiel würden einige Werte, die im unten beschriebenen Code angegeben sind, eigentlich von einer Benutzerschnittstelle im Anwendungsprogramm erhalten werden.
- Zum Zwecke der Veranschaulichung erzeugt das unten beschriebene Druckbeispiel eine Broschüre mit vier Kopien einer Animation (Cartoon), gefolgt von zwei Seiten Text. Die vier Animationskopien sollen auf einer Seite erscheinen. Ebenfalls zum Zwecke der Veranschaulichung wird angenommen, daß es sich bei der Animationsansicht um eine Animationsgrafik mit einer Größe von 4 mal 5 Zoll handelt, und es wird weiter angenommen, daß der Text in einer großen Ansicht mit 4 seitengroßen Unteransichten enthalten ist.
- Der erste Schritt im Druckprozeß besteht darin, zwei Ansichtsobjekte zu erklären, die als demoview und textview bezeichnet werden, welche den Text und die Animationsgrafik repräsentieren. Dies geschieht folgendermaßen:
- wobei * darauf hinweist, daß es sich bei den erklärten Objekten um Zeiger handelt, und wobei Tview eine Ansichtsklasse ist.
- Der nächste Schritt im Prozeß besteht darin, eine druckbare Dokumentennumerierung aus den Animationsansichten herzustellen, wobei die im Detail zuvor offenbarten Druckschnittstellenobjekte verwendet werden. Diese Dokumentennumerierung umfaßt eine einzelne Seite, welche die Grafik enthält, und sie wird dazu verwendet, eine größere, mehrseitige Numerierung zu erzeugen, welche sowohl den Text als auch die Animationsgrafiken enthält. Dieser nächste Schritt wird durchgeführt, indem ein Druckerobjekt erhalten wird, welches einen bestimmten Drucker festlegt; dies geschieht folgendermaßen:
- Der nächste Schritt besteht darin, eine Seitenbeschreibung für die Ansicht zu erzeugen. Es ist möglich, eine Seitenbeschreibung vom Drucker zu bekommen, welche den druckbaren Bereich des Druckers angibt; es ist jedoch auch möglich, ein Seitenbeschreibungsmittel eines rechteckigen Bereiches zu konstruieren; dies geschieht folgendermaßen:
- wobei TPageBounds ein Objekt ist, das die Seitengröße und den druckbaren Bereich bestimmt. Es akzeptiert zwei Rechtecksflächenbeschreibungen. TGRect ist ein Objekt, das rechteckige Bereiche erzeugt und verwaltet, und TGPoint ist ein anderes Objekt, das Zahlenpaare verwaltet. Der von TGRect erzeugte rechteckige Bereich wird von zwei Punkten definiert, die der linken oberen Ecken und der rechten unteren Ecke entsprechen. Somit entsprechen die zwei rechteckigen Bereiche, die von den zwei TGRect-Objekten erzeugt wurden, der Seitengröße (Rechteck [0.0; 298.370]) und dem druckbaren Bereich (Rechteck [0.0; 288.360]). Daher entspricht die Seitenbeschreibung einer Seitenbeschreibung, deren physikalische Größe geringfügig größer ist als die Ansicht, und deren druckbares Rechteck exakt der Ansicht entspricht. Nun kann die Seitenbeschreibung mit Hilfe der Seitenbeschreibung und der Ansicht druckbar gemacht werden.
- Dies kann mit Hilfe eines Einzelseiten-Numerierungsobjektes erfolgen, um die Seite zu repräsentieren. Das Einzelseiten- Numerierungsobjekt (das als demoTiledPageFolio bezeichnet wird) wird durch Aufruf seines Konstruktors wie folgt erzeugt:
- Diese Anweisung führt dazu, daß das Einzelseiten-Numerierungsobjekt, wie oben beschrieben, ein Paginatorobjekt mit Hilfe des druckbaren Rechtecks der Seite instantuert. Der selbe Prozeß kann für die Textansicht ausgeführt werden, außer daß der Text aus mehreren internen Ansichten innerhalb eines 8,5 x 11 Zoll großen Standardformats besteht. Zum Zwecke der Veranschaulichung wollen wir annehmen, daß seitengroße Ansichten innerhalb des Textes vorhanden sind, die jeweils voneinander durch xx mal 0,5 Zoll große Zwischenräume getrennt sind. In diesem Fall ist es notwendig, eine neue Seitenbeschreibung zu erzeugen, welche die Anordnung der Textseite angibt, und in diesem bestimmten Fall kann die Textseitenanordnung vom Drucker erhalten werden, indem eine Standard-Seitenbeschreibung geholt wird, wie dies in der nächsten Codezeile dargestellt ist.
- Um eine Textnumerierungsseite zu erhalten, wird ein weiteres Einzelseiten-Numerierungsobjekt wie folgt erzeugt:
- wobei die Funktion TGPointkOrigin ein TGPoint-Objekt bestehend aus dem Punkt (0.0) erzeugt. Das Einzelseiten- Numerierungsobjekt erzeugt ein Einzelseiten-Numerierungsobjekt und legt fest, daß keine teilweisen Seiten verwendet werden sollen, daß es keine linke obere Verschiebung gibt, keine rechte untere Verschiebung, und daß der Zwischenraum (0; 0,5) ist. Der für die Paginierung verwendete aktive Seitenbereich ist standardmäßig die physikalische Fläche.
- An dieser Stelle gibt es zwei Einzelseiten-Numerierungsobjekte, die getrennt voneinander sind und miteinander kombiniert werden müssen, um ein Objekt zu bilden. Dies kann mit Hilfe eines Mischblatt-Numerierungsobjektes erfolgen, das durch Aufruf seines Konstruktors wie folgt erzeugt werden kann:
- Das Mischblatt-Numerierungsobjekt ist anfänglich leer, so daß es notwendig ist, die Seiten nach Bedarf hinzuzufügen. Das erste, was dabei gemacht werden muß, ist, die vier Seiten der Animation wie folgt hinzuzufügen:
- Als nächstes ist es notwendig, ein Seitenzusammensetzungsobjekt zu verwenden, um alle diese vier Seiten auf eine Seite zu bekommen. Dies kann mit Hilfe eines 4-aufwärts-Seitenzusammensetzungsobjektes geschehen, welches wie folgt erzeugt wird:
- wobei es sich bei dem Objekt TULongPair um ein Objekt handelt, welches Paare langer Ganzzahlen verwaltet. Die zwei angegebenen Nummern sind die Anzahl der Reihen und die Anzahl der Spalten. Somit erzeugt das Seitenzusammensetzungsobjekt eine N-aufwärts-Druckanordnung mit zwei Reihen und zwei Spalten. Als nächstes können die Seiten mit dem Text kombiniert werden, um eine einzige Dokumentennumerierung zu erzeugen; diese kann durch Erzeugung einer weiteren Mischblatt-Numerierung und Hinzufügung der Animationsseiten und der Textseiten wie folgt verwendet werden.
- An diesem Punkt wird die Dokumentennumerierung abgeschlossen und kann gedruckt werden. Zum Zwecke der Veranschaulichung wollen wir annehmen, daß die zweite Seite des Textes nicht gedruckt werden soll. Wie zuvor erwähnt, kann eine Dokumentennumerierung direkt gedruckt werden; wenn dies jedoch gemacht wird, werden alle Seiten gedruckt. Da es jedoch nicht erwünscht ist, die Seite 2 des Textes zu drucken, ist es notwendig, einen Seiten-Iterator zu erzeugen. Dies geschieht durch Verwendung der CreatePageIterator-Routine in der Dokumentennumerierung auffolgende Weise:
- Danach kann der Dokumentseitenbereich entsprechend eingestellt werden, um die zweite Seite des Textes auszuschließen. Da der Dokumentseitenbereich standardmäßig stets auf die gesamte Numerierung eingestellt wird, muß nur die Seite 3 (die erste Seite ist die Animationsseite) entfernt werden, was mit Hilfe einer Differenz-Funktion im darunterliegenden Seitenbereichsobjekt wie folgt geschehen kann:
- Schließlich kann das Dokument gedruckt werden, indem ein Druckkanal erzeugt wird und das Dokument zum Druckkanal geleitet wird. Das Ergebnis ist eine 4-seitige Broschüre, bei der die erste Seite eine 4-aufwärts-Zusammensetzung ist, und der Rest der Seiten Textseiten sind, wobei die zweite Seite des Textes ausgelassen wurde.
Claims (22)
1. Ein Computersystem (300, 400) zur Steuerung einer
Druckvorrichtung (314, 422) zum Erzeugen einer gedruckten
Ausgabe in einem Format (TILED PAGE FOLIO) umfassend:
(a) ein Anwendungsprogramm (402, 600) zum Erzeugen
druckbarer Informationen (80);
(b) Speichereinrichtung (306);
(c) einen Prozessor (302) zur Speicherung der druckbaren
Informationen in der Speichereinrichtung und zum
Wiederauffinden der druckbaren Informationen in der
Speichereinrichtung;
(d) ein Betriebssystem (406), das in der
Speichereinrichtung gespeichert ist und mit dem
Prozessor zusammenarbeitet zur Steuerung der
Speichereinrichtung; und
(e) ein erstes Drucken-Schnittstellen-Objekt (424, 604),
das durch das Anwendungsprogramm aus im
Betriebssystem (700-716) gespeicherten Befehlen und
Funktionen erzeugt wird, das Drucken-Schnittstellen-
Objekt steuert den Prozessor zum Verändern der
druckbaren Informationen, die von dem
Anwendungsprogram erhalten werden, um das Format der gedruckten
Ausgabe zu ändern.
2. Ein Computersystem nach Anspruch 1, worin das erste
Drucken-Schnittstellen-Objekt (424, 604) den Prozessor
(302) steuert zum Verändern der druckbaren Informationen,
die von dem Anwendungsprogramm (500) empfangen werden zum
Erzeugen von druckbaren Informationen in einem ersten
Format (TILED PAGE FOLIO), und worin das Computersystem
eine zweite Drucken-Schnittstelle (714, 2300-2308) enthält
zum Steuern des Prozessors zum Verändern der druckbaren
Informationen, die vom Anwendungsprogramm empfangen
werden, zum Erzeugen von druckbaren Informationen in einem
zweiten Format (N-UP).
3. Ein Computersystem nach Anspruch 2, worin das erste
Drucken-Schnittstellen-Objekt (424, 604) den Prozessor
steuert zum Paginieren der druckbaren Informationen, die
von dein Anwendungsprogramm empfangen werden zum Erzeugen
von paginierten druckbaren Informationen.
4. Ein Computersystem nach Anspruch 3, worin das zweite
Drucken-Schnittstellen-Objekt (714) den Prozessor steuert
zum Erzeugen einer n-aufwärts Druckanordnung (2304) aus
den paginierten druckbaren Informationen, die vom ersten
Drucken-Schnittstellen-Objekt (424, 604) empfangen werden.
5. Ein Computersystem nach Anspruch 3, worin das zweite
Drucken-Schnittstellen-Objekt (714) den Prozessor steuert
zum Erzeugen einer Ausschließ-Druckanordnung (2306) aus
den paginierten druckbaren Informationen, die vom ersten
Drucken-Schnittstellen-Objekt (424, 604) empfangen werden.
6. Ein Computersystem nach Anspruch 3, worin die paginierten
druckbaren Informationen eine Ordnung aufweisen und das
erste Drucken-Schnittstellen-Objekt (424, 604) Mittel
(2300) umfaßt zum Erzeugen eines Seiten-Iterator-Objekts,
das die Ordnung der paginierten druckbaren Informationen
ändern kann.
7. Ein Computersystem nach Anspruch 2, weiter enthaltend ein
drittes Drucken-Schnittstellen-Objekt (610), das auf die
druckbaren Informationen mit einem ersten Format (TILED
PAGE FOLIO) und auf die druckbaren Informationen mit einem
zweiten Format (N-UP) antwortet zum Kombinieren der
druckbaren Informationen mit einem ersten Format (TILED
PAGE FOLIO) und der druckbaren Informationen mit einem
zweiten Format (N-UP) in ein einzelnes Dokument (500).
8. Ein Computersystem nach Anspruch 2, worin das erste
Drucken-Schnittstellen-Objekt (424, 604) von einer
polymorphen Paginator-Klasse (702) abgeleitet wird, die
auf einen vorgegebenen Satz von Parametern antwortet,
welche von einem Anwendungsprogramm (scan order, grid
range) empfangen werden zum Paginieren der druckbaren
Informationen in einem Format, das aus einer vorbestimmten
Vielzahl von Formaten (TILED PAGE FOLIO, N-UP) ausgewählt
wird.
9. Ein Computersystem nach Anspruch 8, worin das Paginieren
in einer vorbestimmten Ordnung (scan order) durchgeführt
wird, und worin die polymorphe Paginator-Klasse (702)
Mittel (704) umfaßt zum Erzeugen eines Paginator-
Iterators, der auf die druckbaren Informationen antwortet
durch Änderung der vorbestimmten Paginierordnung (scan
order).
10. Ein Computersystem nach Anspruch 9, worin der Paginator-
Iterator Mittel (706) umfaßt zum Erzeugen eines
Abtastordnung-Objekts, das eine Raster-Abtastordnung
bestimmt zur Änderung der vorbestimmten Paginierordnung
(scan order).
11. Ein Computersystem nach Anspruch 9, worin die paginierten
druckbaren Informationen eine Ordnung aufweisen (scan
order) und worin das erste Drucken-Schnittstellen-Objekt
(424, 604) Mittel (714) umfaßt zum Erzeugen eines
Seiten-Iterator-Objekts, das die Ordnung der paginierten
druckbaren Informationen ändern kann und worin das
Seiten-Iterator-Objekt von der Paginator-Iterator-Klasse
(704) abgeleitet wird.
12. Ein Verfahren zur Steuerung einer Druckvorrichtung (314,
422) mittels eines Computersystem (300, 400), das ein
Anwendungsprogramm (402, 600) und ein Betriebssystem
aufweist zum Erzeugen einer gedruckten Ausgabe in einem
Format (TILED PAGE FOLIO), das Verfahren umfaßt die
Schritte:
(a) Erzeugen druckbarer Informationen (804) an einer
vorbestimmten Lokation durch ein Anwendungsprogramm
(402, 600);
(b) Erzeugen eines ersten Drucken-Schnittstellen-Objekts
(424, 604) aus im Betriebssystem (700-716)
gespeicherten Befehlen und Funktionen;
(c) Übergeben einer vorbestimmten Lokation der druckbaren
Informationen an das erste Drucken-Schnittstellen-
Objekt;
(d) Benutzen des ersten Drucken-Schnittstellen-Objekts
zum Bearbeiten der druckbaren Informationen zum
Formatieren der druckbaren Informationen in ein
erstes Format (TILED PAGE FOLIO);
(e) Übertragen der formatierten druckbaren Informationen
zu der Druckvorrichtung (314, 422) zum Zwecke des
Drucks.
13. Ein Verfahren nach Anspruch 12, worin Schritt (d) den
Schritt (d1) umfaßt zum Paginieren der druckbaren
Informationen, um paginierte druckbaren Informationen zu
erzeugen.
14. Ein Verfahren nach Anspruch 13, worin Schritt (d) den
Schritt (d2) umfaßt zum Erzeugen einer n-aufwärts
Druckanordnung (2304) aus den paginierten druckbaren
Informationen.
15. Ein Verfahren nach Anspruch 13, worin Schritt (d) den
Schritt (d3) umfaßt zum Erzeugen einer Ausschließ-
Druckanordnung (2306) aus den paginierten druckbaren
Informationen.
16. Ein Verfahren nach Anspruch 12, worin Schritt (b) den
Schritt (b1) umfaßt zum Erzeugen eines Seiten-Iterator-
Objekts, das die Ordnung der paginierten druckbaren
Informationen ändern kann; und Schritt (d) den Schritt
(d4) umfaßt zur Benutzung des im Schritt (b1) erzeugten
Seiten-Iterator-Objekts, um die druckbaren Informationen
in einer vorbestimmten Ordnung zu paginieren.
17. Ein Verfahren nach Anspruch 12, weiter umfassend die
Schritte:
(f) Erzeugen eines zweiten Drucken-Schnittstellen-Objekts
(714) aus in dem Betriebssystem (700-716)
gespeicherten Befehlen und Funktionen;
(g) Übergeben einer vorbestimmten Lokation der druckbaren
Informationen an das zweite Drucken-Schnittstellen-
Objekt; und
(h) Benutzen des zweiten Drucken-Schnittstellen-Objekts
zum Bearbeiten der druckbaren Informationen zum
Formatieren der druckbaren Informationen in ein
zweites Format (N-UP).
18. Ein Verfahren nach Anspruch 17, weiter umfassend die
Schritte:
(i) Erzeugen eines dritten Drucken-Schnittstellen-Objekts
(610);
(j) Zuführen der druckbaren Informationen mit dem ersten
Format (TILED PAGE FOLIO) zum dritten Drucken-
Schnittstellen-Objekt;
(k) Zuführen der druckbaren Informationen mit dem zweiten
Format (N-UP) zum dritten Drucken-Schnittstellen-
Objekt;
(l) Benutzen des dritten Drucken-Schnittstellen-Objekts
zum Kombinieren der druckbaren Informationen mit
dem ersten Format und der druckbaren Informationen
mit dem zweiten Format in ein einzelnes Dokument
(500).
19. Ein Verfahren nach Anspruch 12, worin Schritt (b) den
Schritt (b2) umfaßt zum Ableiten des ersten Drucken-
Schnittstellen-Objekts von einer polymorphen Paginator-
Klasse (702), die auf einen vorgegebenen Satz von
Parametern antwortet, welche von einem Anwendungsprogramm
empfangen werden zum Paginieren der druckbaren
Informationen in einem Format, das aus einer vorbestimmten
Vielzahl von Formaten (TILED PAGE FOLIO, book model, N-UP)
ausgewählt wird.
20. Ein Verfahren nach Anspruch 19, worin Schritt (b2) den
Schritt (b2a) umfaßt zum Erzeugen eines Paginator-
Iterator-Objekts zum Paginieren der druckbaren
Informationen in einer vorbestimmten Ordnung (scan order).
21. Ein Verfahren nach Anspruch 20, worin Schritt (b2) den
Schritt (b2b) umfaßt zum Erzeugen eines Abtastordnung-
Objekts (706), das eine Raster-Abtastordnung bestimmt zur
Änderung der vorbestimmten Paginierordnung (scan order).
22. Ein Verfahren nach Anspruch 21, weiter umfassend den
Schritt (m) zum Ableiten eines Seiten-Iterator-Objekts
(714), das die Ordnung der paginierten druckbaren
Informationen vom Paginator-Iterator-Objekt umändern kann.
Applications Claiming Priority (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| US08/080,245 US5495561A (en) | 1993-06-21 | 1993-06-21 | Operating system with object-oriented printing interface |
| PCT/US1994/000142 WO1995000898A1 (en) | 1993-06-21 | 1994-01-06 | Operating system with object-oriented printing interface |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| DE69409487D1 DE69409487D1 (de) | 1998-05-14 |
| DE69409487T2 true DE69409487T2 (de) | 1998-11-26 |
Family
ID=22156145
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| DE69409487T Expired - Lifetime DE69409487T2 (de) | 1993-06-21 | 1994-01-06 | Betriebssystem mit objektorientierter druckschnittstelle |
Country Status (8)
| Country | Link |
|---|---|
| US (1) | US5495561A (de) |
| EP (1) | EP0664023B1 (de) |
| JP (1) | JP3347329B2 (de) |
| CN (1) | CN1110745C (de) |
| AU (1) | AU6020694A (de) |
| CA (1) | CA2144873A1 (de) |
| DE (1) | DE69409487T2 (de) |
| WO (1) | WO1995000898A1 (de) |
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| DE10045133C2 (de) * | 1999-09-28 | 2003-10-02 | Hewlett Packard Co | Wiederverwendbares computerimplementiertes Auftrags-Editier und Liefer-Verfahren |
Families Citing this family (76)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US10361802B1 (en) | 1999-02-01 | 2019-07-23 | Blanding Hovenweep, Llc | Adaptive pattern recognition based control system and method |
| JP3666888B2 (ja) * | 1992-04-29 | 2005-06-29 | キヤノン株式会社 | カラー処理装置およびその方法 |
| US5805885A (en) | 1992-12-24 | 1998-09-08 | Microsoft Corporation | Method and system for aggregating objects |
| US5379432A (en) * | 1993-07-19 | 1995-01-03 | Taligent, Inc. | Object-oriented interface for a procedural operating system |
| US5566278A (en) * | 1993-08-24 | 1996-10-15 | Taligent, Inc. | Object oriented printing system |
| US5768488A (en) * | 1995-02-24 | 1998-06-16 | International Business Machines Corporation | Enhanced page placement for multiple-up presentation |
| JP3058248B2 (ja) * | 1995-11-08 | 2000-07-04 | キヤノン株式会社 | 画像処理制御装置及び画像処理制御方法 |
| US5710635A (en) * | 1995-12-06 | 1998-01-20 | Xerox Corporation | Generic assembly trees providing job control and mix and match of modules |
| US6119130A (en) * | 1996-03-28 | 2000-09-12 | Oracle Corporation | Method and apparatus for providing schema evolution without recompilation |
| US6593947B1 (en) * | 1996-05-10 | 2003-07-15 | Apple Computer, Inc. | Method and system for image rendering including polymorphic image data in a graphical user interface |
| US6628413B1 (en) * | 1996-05-14 | 2003-09-30 | Ricoh Company, Ltd. | Java printer |
| US6026416A (en) * | 1996-05-30 | 2000-02-15 | Microsoft Corp. | System and method for storing, viewing, editing, and processing ordered sections having different file formats |
| US6268924B1 (en) * | 1996-06-06 | 2001-07-31 | Microsoft Corporation | Document object having a print interface for programmatic automation by a using program |
| US5999972A (en) | 1996-07-01 | 1999-12-07 | Sun Microsystems, Inc. | System, method and article of manufacture for a distributed computer system framework |
| US6424991B1 (en) | 1996-07-01 | 2002-07-23 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture for a client-server communication framework |
| US6266709B1 (en) | 1996-07-01 | 2001-07-24 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture for a client-server failure reporting process |
| US5987245A (en) | 1996-07-01 | 1999-11-16 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture (#12) for a client-server state machine framework |
| US6272555B1 (en) | 1996-07-01 | 2001-08-07 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture for a client-server-centric interprise computing framework system |
| US6434598B1 (en) | 1996-07-01 | 2002-08-13 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture for a client-server graphical user interface (#9) framework in an interprise computing framework system |
| US5848246A (en) | 1996-07-01 | 1998-12-08 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture for a client-server session manager in an interprise computing framework system |
| US6038590A (en) | 1996-07-01 | 2000-03-14 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture for a client-server state machine in an interprise computing framework system |
| US6304893B1 (en) | 1996-07-01 | 2001-10-16 | Sun Microsystems, Inc. | Object-oriented system, method and article of manufacture for a client-server event driven message framework in an interprise computing framework system |
| JP3361951B2 (ja) * | 1997-02-25 | 2003-01-07 | 大日本スクリーン製造株式会社 | 印刷データ処理装置および方法 |
| JPH10319567A (ja) * | 1997-05-19 | 1998-12-04 | Fuji Photo Film Co Ltd | 印刷物のページ割付方法 |
| US6313919B1 (en) * | 1997-07-02 | 2001-11-06 | Canon Kabushiki Kaisha | Printing control apparatus and method |
| JP3900700B2 (ja) * | 1997-09-09 | 2007-04-04 | セイコーエプソン株式会社 | 印刷制御装置およびその方法並びに記録媒体 |
| US6067554A (en) * | 1997-09-11 | 2000-05-23 | International Business Machines Corp. | Method and apparatus for displaying print documents |
| JP3658174B2 (ja) * | 1998-02-27 | 2005-06-08 | キヤノン株式会社 | データ処理装置およびデータ処理装置の印刷データ処理方法およびコンピュータが読み出し可能なプログラムを格納した記憶媒体 |
| US7043532B1 (en) * | 1998-05-07 | 2006-05-09 | Samsung Electronics Co., Ltd. | Method and apparatus for universally accessible command and control information in a network |
| JP3689564B2 (ja) | 1998-07-31 | 2005-08-31 | キヤノン株式会社 | Oa装置、oaシステム、制御方法及び記憶媒体 |
| US6842262B1 (en) * | 1998-09-08 | 2005-01-11 | Sharp Laboratories Of America, Inc. | Iconic printer interface providing document composition features |
| US6738152B1 (en) * | 1998-12-11 | 2004-05-18 | Adobe Systems, Incorporated | Event-based printing |
| US6581097B1 (en) | 1998-12-30 | 2003-06-17 | Pitney Bowes Inc. | Method and system of determining a job ticket for a print stream determining process |
| US6657744B2 (en) | 1998-12-30 | 2003-12-02 | Pitney Bowes Inc. | Message structure for a print stream determining and analysis system |
| US6762851B1 (en) | 1998-12-30 | 2004-07-13 | Pitney Bowes Inc. | Method and system for print stream job determination and analysis |
| US6433881B1 (en) * | 1998-12-30 | 2002-08-13 | Pitney Bowes Inc. | Method of establishing a set of print stream objects in an object oriented environment |
| US7966078B2 (en) | 1999-02-01 | 2011-06-21 | Steven Hoffberg | Network media appliance system and method |
| CN1306384C (zh) * | 1999-03-29 | 2007-03-21 | 精工爱普生株式会社 | 网络系统和网络接口卡 |
| US6330071B1 (en) * | 1999-05-17 | 2001-12-11 | Electronics For Imaging, Inc. | Variable data print job system |
| DE19921120C2 (de) * | 1999-05-07 | 2001-05-10 | Oce Printing Systems Gmbh | Verfahren und System zum Ausschießen von Druckdaten |
| GB2396035B (en) * | 1999-09-28 | 2004-08-11 | Hewlett Packard Co | Reusable job editing and delivery system |
| US6304732B1 (en) * | 1999-11-19 | 2001-10-16 | Xerox Corporation | Stock library mechanism for providing visual representations of stock objects in an image reproducing system |
| US6631007B1 (en) | 1999-12-14 | 2003-10-07 | International Business Machines Corporation | System and method for presenting multiple sheetlets on a medium surface while presenting multiple logical pages within the sheetlets |
| AU768394B2 (en) * | 2000-01-11 | 2003-12-11 | Electronics For Imaging, Inc. | Preprocessing method for a variable data print job system |
| US8042041B1 (en) * | 2000-05-05 | 2011-10-18 | Pitney Bowes Software Inc. | Method and apparatus for pipelined processing of data |
| JP4738565B2 (ja) | 2000-05-16 | 2011-08-03 | キヤノン株式会社 | 画像形成装置、画像形成装置の制御方法及び画像形成システム |
| US8386945B1 (en) | 2000-05-17 | 2013-02-26 | Eastman Kodak Company | System and method for implementing compound documents in a production printing workflow |
| AU2001264751A1 (en) * | 2000-05-19 | 2001-12-03 | Renderx, Inc. | Methods for rendering data and data structures |
| US7454695B1 (en) | 2000-05-19 | 2008-11-18 | Renderx, Inc. | Methods for rendering tables |
| US9436667B2 (en) * | 2000-05-19 | 2016-09-06 | Renderx, Inc. | Techniques for rendering media as layers |
| US7024621B1 (en) | 2000-05-19 | 2006-04-04 | Renderx | Methods and systems for rendering electronic data |
| US6971062B1 (en) | 2000-05-19 | 2005-11-29 | Renderx | Methods for rendering footnotes |
| US7733521B1 (en) | 2000-07-05 | 2010-06-08 | Lexmark International, Inc. | Printer apparatus with selectable photo enhancement project and settings storage dynamically definable user interface and functions and template definition |
| JP3733288B2 (ja) * | 2000-12-06 | 2006-01-11 | キヤノン株式会社 | 情報処理装置および印刷制御方法および記憶媒体 |
| JP3884943B2 (ja) * | 2000-12-26 | 2007-02-21 | キヤノン株式会社 | 情報処理装置、印刷データ生成方法、印刷制御プログラム及びコンピュータ読み取り可能な記録媒体 |
| JP3854876B2 (ja) * | 2001-03-08 | 2006-12-06 | キヤノン株式会社 | 情報処理装置及びその印刷制御方法並びに記憶媒体 |
| US7177045B2 (en) * | 2001-04-13 | 2007-02-13 | Electronics For Imaging, Inc. | Process and system for mixed page imposition |
| US6900905B2 (en) * | 2001-08-08 | 2005-05-31 | Hewlett-Packard Development Company, L.P. | Method for accessing imaging information on a demand basis using web based imaging |
| US7260778B2 (en) * | 2001-10-26 | 2007-08-21 | International Business Machines Corporation | Printing pages in accordance with a remainder computation formula |
| US7102800B2 (en) * | 2002-02-27 | 2006-09-05 | Hewlett-Packard Development Company, L.P. | Methods and apparatus for providing imaging media in imaging apparatus |
| US20040205662A1 (en) * | 2002-05-30 | 2004-10-14 | Brad Anderson | Image preservation and reconstruction |
| US20040061729A1 (en) * | 2002-09-30 | 2004-04-01 | Brett Green | System and method for a dynamically modifiable driver interface |
| US7412646B2 (en) * | 2003-10-23 | 2008-08-12 | Microsoft Corporation | Systems and methods for pagination and co-pagination |
| US20050146549A1 (en) * | 2003-11-11 | 2005-07-07 | Masayoshi Koyama | Head unit, droplet discharging apparatus, droplet discharging system, information processing apparatus, information processing method, status information notifying method, status information updating method, faulty position detecting method, and programs |
| FR2865295B1 (fr) * | 2004-01-15 | 2008-09-19 | Sagem | Procede d'insertion de marques de pliage sur un document lors de son impression et systeme d'impression associe |
| US20050235293A1 (en) * | 2004-04-14 | 2005-10-20 | Microsoft Corporation | Methods and systems for framework layout editing operations |
| US20070006166A1 (en) * | 2005-06-20 | 2007-01-04 | Seagate Technology Llc | Code coverage for an embedded processor system |
| JP4645419B2 (ja) * | 2005-11-15 | 2011-03-09 | 富士ゼロックス株式会社 | プリンタ制御装置、プリンタ制御方法及びプログラム |
| JP5139884B2 (ja) * | 2008-05-16 | 2013-02-06 | キヤノン株式会社 | 印刷装置、印刷方法、及び、印刷プログラム |
| US8248652B2 (en) * | 2008-06-06 | 2012-08-21 | Ricoh Productions Print Solutions LLC | N-up sheetlet based imaging with flexible formatting of logical pages |
| JP5387285B2 (ja) * | 2009-09-28 | 2014-01-15 | ブラザー工業株式会社 | 印刷装置およびプログラム |
| JP2012181776A (ja) * | 2011-03-02 | 2012-09-20 | Ricoh Co Ltd | 印刷管理プログラム、印刷管理装置、印刷管理方法及び印刷システム |
| JP2013055418A (ja) * | 2011-09-01 | 2013-03-21 | Canon Inc | 情報処理装置、情報処理装置の制御方法及びプログラム |
| US8860994B2 (en) * | 2012-08-10 | 2014-10-14 | Ricoh Production Print Solutions | Electronic replacement of pre-printed forms |
| US9087287B2 (en) | 2013-03-13 | 2015-07-21 | Xerox Corporation | Individualizing reduction of original pages in N-up copying or printing |
| US9977636B1 (en) | 2016-11-21 | 2018-05-22 | Xerox Corporation | Method and system for the flexible merging of logical cells and printing |
Family Cites Families (19)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US4589068A (en) * | 1983-10-03 | 1986-05-13 | Digital Equipment Corporation | Segmented debugger |
| US4943932A (en) * | 1986-11-25 | 1990-07-24 | Cimflex Teknowledge Corporation | Architecture for composing computational modules uniformly across diverse developmental frameworks |
| US4809170A (en) * | 1987-04-22 | 1989-02-28 | Apollo Computer, Inc. | Computer device for aiding in the development of software system |
| US4910663A (en) * | 1987-07-10 | 1990-03-20 | Tandem Computers Incorporated | System for measuring program execution by replacing an executable instruction with interrupt causing instruction |
| US4953084A (en) * | 1987-11-16 | 1990-08-28 | Hewlett-Packard Company | Method and apparatus using variable ranges to support symbolic debugging of optimized code |
| US5129086A (en) * | 1988-11-29 | 1992-07-07 | International Business Machines Corporation | System and method for intercommunicating between applications and a database manager |
| US5193190A (en) * | 1989-06-26 | 1993-03-09 | International Business Machines Corporation | Partitioning optimizations in an optimizing compiler |
| US5170465A (en) * | 1989-06-30 | 1992-12-08 | Digital Equipment Corporation | Incremental-scanning compiler for source-code development system |
| US5201050A (en) * | 1989-06-30 | 1993-04-06 | Digital Equipment Corporation | Line-skip compiler for source-code development system |
| US5182806A (en) * | 1989-06-30 | 1993-01-26 | Digital Equipment Corporation | Incremental compiler for source-code development system |
| US5193191A (en) * | 1989-06-30 | 1993-03-09 | Digital Equipment Corporation | Incremental linking in source-code development system |
| US5124989A (en) * | 1990-01-08 | 1992-06-23 | Microsoft Corporation | Method of debugging a computer program |
| US5204960A (en) * | 1990-01-08 | 1993-04-20 | Microsoft Corporation | Incremental compiler |
| US5140671A (en) * | 1990-01-26 | 1992-08-18 | International Business Machines Corporation | Expert system debugger |
| US5175856A (en) * | 1990-06-11 | 1992-12-29 | Supercomputer Systems Limited Partnership | Computer with integrated hierarchical representation (ihr) of program wherein ihr file is available for debugging and optimizing during target execution |
| US5187789A (en) * | 1990-06-11 | 1993-02-16 | Supercomputer Systems Limited Partnership | Graphical display of compiler-generated intermediate database representation |
| US5353388A (en) * | 1991-10-17 | 1994-10-04 | Ricoh Company, Ltd. | System and method for document processing |
| JP2875670B2 (ja) * | 1991-12-02 | 1999-03-31 | キヤノン株式会社 | 出力制御装置およびその出力制御方法 |
| US5337258A (en) * | 1992-07-10 | 1994-08-09 | Microsoft Corporation | Cost metrics |
-
1993
- 1993-06-21 US US08/080,245 patent/US5495561A/en not_active Expired - Lifetime
-
1994
- 1994-01-06 CA CA002144873A patent/CA2144873A1/en not_active Abandoned
- 1994-01-06 EP EP94906521A patent/EP0664023B1/de not_active Expired - Lifetime
- 1994-01-06 WO PCT/US1994/000142 patent/WO1995000898A1/en not_active Ceased
- 1994-01-06 CN CN94190669A patent/CN1110745C/zh not_active Expired - Lifetime
- 1994-01-06 DE DE69409487T patent/DE69409487T2/de not_active Expired - Lifetime
- 1994-01-06 AU AU60206/94A patent/AU6020694A/en not_active Abandoned
- 1994-01-06 JP JP50276495A patent/JP3347329B2/ja not_active Expired - Lifetime
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| DE10045133C2 (de) * | 1999-09-28 | 2003-10-02 | Hewlett Packard Co | Wiederverwendbares computerimplementiertes Auftrags-Editier und Liefer-Verfahren |
Also Published As
| Publication number | Publication date |
|---|---|
| EP0664023A1 (de) | 1995-07-26 |
| US5495561A (en) | 1996-02-27 |
| EP0664023B1 (de) | 1998-04-08 |
| CN1114514A (zh) | 1996-01-03 |
| JP3347329B2 (ja) | 2002-11-20 |
| WO1995000898A1 (en) | 1995-01-05 |
| CA2144873A1 (en) | 1995-01-05 |
| CN1110745C (zh) | 2003-06-04 |
| JPH08511890A (ja) | 1996-12-10 |
| AU6020694A (en) | 1995-01-17 |
| DE69409487D1 (de) | 1998-05-14 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| DE69409487T2 (de) | Betriebssystem mit objektorientierter druckschnittstelle | |
| DE69401435T2 (de) | Veränderliche Datenfelder in einer Seitenbeschreibungssprache | |
| DE69600794T2 (de) | Graphische entwicklungs- und verwaltungsumgebung für anwendungsprogramme | |
| DE69503052T2 (de) | Verbessertes objektorientiertes betriebssystem zum filtrieren von datenobjekten in einem fenster | |
| DE69429658T2 (de) | Computer-bedieneroberfläche für dokumente mit vielfältigem inhalt | |
| DE69534558T2 (de) | Effizientes Verfahren, Gerät und Rechnerprogramm zur Auswertung graphischer Programmiersprache | |
| DE3586273T2 (de) | Implizite erzeugung einer superblockstruktur in einem vieldaten-edierungsgeraet. | |
| DE69429488T2 (de) | Strukturiertes Bildformat zur Beschreibung eines Komplexfarbrasterbilds | |
| DE19852296B4 (de) | Verfahren, Vorrichtung und System zum Vereinigen von Bild- und Formulardaten (Formularüberziehen) im Zusammenhang mit Computern | |
| DE60002274T2 (de) | Datenverarbeitung um Text und Bilddaten auf einem Substrat anzubringen | |
| DE3885085T2 (de) | Verfahren zur automatischen Änderung der Abmessungen von angezeigten Objekten in Bezug auf die Änderungen der Abmessungen des Bildfensters. | |
| DE3586274T2 (de) | Vieldaten-edierungsgeraet mit gebrauch von attributstroemen fuer textobjekte. | |
| DE69527898T2 (de) | Klassenbibliothek für die graphische Programmierung | |
| DE69130788T2 (de) | Dokumentverarbeitungsapparat | |
| DE10051680B4 (de) | Schema zur Darstellung mehrerer Druckauftragsabänderungselemente in einer Drucksoftware-Benutzerschnittstelle | |
| DE69410483T2 (de) | Objektorientiertes aufgabensicheres rahmenwerk | |
| DE19944504A1 (de) | Selbst-Umdimensionierungs-Demonstrationsseite für eine Druckvorrichtung | |
| DE10309241A1 (de) | Drucken mit variablen Daten unter Verwendung einer dynamischen Ausschießvorlage | |
| DE19800423A1 (de) | Rechnerverfahren und -vorrichtung zur Vorabansicht von Dateien außerhalb eines Andwendungsprogramms | |
| EP1389329B1 (de) | Verfahren, system und computerprogramm zum erstellen eines elektronischen dokuments aus gerasterten bilddaten | |
| EP1388042B1 (de) | Verfahren, gerätesystem und computerprogrammsystem zum visuellen überprüfen eines druckdatenstroms | |
| DE69924548T2 (de) | Druckdatenerzeugung und Drucksteuerungsverfahren und -gerät | |
| DE4313958C2 (de) | Einrichtung und Verfahren zum Steuern der Darstellung eines Dokuments | |
| DE69322199T2 (de) | Vorrichtung und Verfahren für die Übersetzung von Druckersprachen | |
| DE10045133A1 (de) | Wiederverwendbares Auftrags-Editier und Liefer-System |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| 8327 | Change in the person/name/address of the patent owner |
Owner name: OBJECT TECHNOLOGY LICENSING CORP., CUPERTINO, CALI |
|
| 8328 | Change in the person/name/address of the agent |
Free format text: KINDERMANN, M., PAT.-ANW., 71032 BOEBLINGEN |
|
| 8364 | No opposition during term of opposition | ||
| R082 | Change of representative |
Ref document number: 664023 Country of ref document: EP |