PRINTER.BGI - BGI Treiber f•r Drucker Version 4.00 vom Oktober 1995 (C) 1990-1995 by Ullrich von Bassewitz Zwehrenb•hlstraáe 33 D-72070 T•bingen E-Mail: [email protected] 0. Vorwort Alle Rechte an der hier beschriebenen Software sowie der Dokumentaton liegen beim Autor. Die Verwendung von PRINTER.BGI in eigenen Programmen ist frei, sowohl f•r private als auch f•r kommerzielle Zwecke. Beachten Sie aber bitte folgendes: Da die Verwendung von PRINTER.BGI kostenlos ist, erfolgt der Einsatz auf auschlieáliche Gefahr des Anwenders. Jede Haftung f•r direkte, indirekte, verursachte oder gefolgte Sch„den, die durch die Verwendung von PRINTER.BGI entstehen k”nnen, ist ausgeschlossen. PRINTER.BGI darf unter folgenden Bedingungen beliebig weitergegeben werden: * Die Weitergabe geschieht im kompletten Paket mit Dokumentation und Beispielprogrammen. * Die Weitergabe geschieht kostenlos. Dies bedeutet insbesondere, daá der Treiber nicht ohne meine vorherige schriftliche Genehmigung auf CDROMS vertrieben werden darf, genauso sind Mailboxen/FTP-Server ausgeschlossen, bei denen der Zugang zum Treiber nicht frei f•r jedermann ist. 1. Einleitung Das Borland Graphics Interface (kurz BGI genannt) ist eine ger„teunabh„ngige Schnittstelle zur Ausgabe von Grafiken auf (fast) beliebigen Ausgabeger„ten. Zu den Borland-Compilern werden aber ausschlieálich Treiber f•r GrafikKarten mitgeliefert. PRINTER.BGI ist ein zus„tzlicher Treiber, mit dem Grafik auf einer Vielzahl von Druckern ausgegeben werden kann. Dabei wird (im Gegensatz zu Hardcopys) die volle Aufl”sung des Druckers ausgenutzt. Unterst•tzt werden beide Borland-Compiler (also Turbo-Pascal und BorlandC++), sowie die folgenden Drucker: * Zum HP-LaserJet II kompatible Drucker. * Zum HP-LaserJet IV kompatible Drucker. Der Treiber unterst•tzt bei diesem Drucker die zus„tzlich verfgbare Aufl”sung von 600 DPI. * Der HP DeskJet 500 und Abk”mmlinge. * Der HP DeskJet 500C und Nachfolger (z.B. HP DJ 550C). Hier werden 8 Farben unterst•tzt. * HP PaintJet XL (nur 8 Farben). * Nadeldrucker der Serien FX und LQ von EPSON sowie dazu kompatible. Dazu geh”ren z.T. auch Laser- und Tintenstrahldrucker, z.B. der BJ-300 und BJ330 von Canon. * NEC P6/P6+/P60. Diese Drucker sind prinzipiell EPSON kompatibel, unterscheiden sich jedoch im Modus 360 * 360 DPI und verf•gen zus„tzlich noch ber die M”glichkeit zum Ausdruck in Farbe. * IBM Proprinter X24 und kompatible. * Benutzerdefinierte Nadeldrucker (•ber separat zu erstellende Definitionsdateien). PRINTER.BGI unterst•tzt alle im "Device Drivers Toolkit" angegebenen Funktionen einschliesslich FloodFill. Da keiner der unterst•tzten Farbdrucker •ber eine einstellbare Palette verf•gt, sind jedoch die Paletten-Funktionen nicht verf•gbar. Der Treiber ist gleichzeitig auch im neuen Format verfgbar, das ben”tigt wird, wenn das Programm im Protected-Mode arbeitet. N„heres dazu weiter unten. 2. Anforderungen 2.1 Drucker Hardware-Voraussetzung ist ein Drucker der zu einer der oben erw„hnten Familien geh”rt oder dazu kompatibel ist. Sollten Sie einen Nadeldrucker besitzen bei dem das nicht der Fall ist, lesen Sie bitte das Kapitel •ber benutzerdefinierte Modi weiter unten. Bitte beachten Sie, daá nicht alle Drucker alle Modi unterst•tzen. Speziell die Modi mit Aufl”sungen von 360 * 360 DPI sind nicht auf allen Nadeldruckern verf•gbar. 2.2 Rechner Prinzipiell reicht ein XT-kompatibler Rechner zur Benutzung von PRINTER.BGI aus. Da jedoch relativ groáe Datenmengen bewegt werden wird die Verwendung erst ab einem AT-kompatiblen Rechner wirklich sinnvoll. Sind weder EMS noch XMS in ausreichendem Umfang vorhanden (siehe Abschnitt 2.4: Speicher), so ist die Verwendung einer schnellen Platte anzuraten. 2.3 Compiler Der Treiber arbeitet problemlos mit allen Compilern ab Version 6.0 (Turbo Pascal) bzw. Version 2.0 (Borland-C++) zusammen. 2.4 Speicher Da das Grafik-Paket eine beliebige Positionierung des Grafik-Cursors zul„át, und zudem Funktionen zum R•cklesen von Daten existieren (GetPixel, GetImage etc.), muá der Treiber das komplette Bild bis zur Ausgabe zwischenspeichern. Dies geschieht - im Real-Mode: Entweder im EMS-Speicher, im XMS-Speicher oder auf Platte. - im Protected-Mode: Im DPMI-Speicher oder auf Platte. N„heres siehe Abschnitt 7. PRINTER.BGI entscheidet sich je nach vorhandener Hard- und Software selbstst„ndig fr eine dieser M”glichkeiten, wobei er (in dieser Reihenfolge) die Verwendungsm”glichkeit von EMS, XMS (bzw. DPMI-Speicher) und Platte pr•ft. Die Daten k”nnen dabei nicht aufgeteilt werden k”nnen (also z.B. Verwendung von 200 KB EMS, 89.5 KB XMS und der Rest auf Platte). Kann keines der oben genannten Speichermedien genug Speicher zur Verf•gung stellen, so liefert PRINTER.BGI einen Fehlercode von -12 (grIOError) zur•ck. Wieviel Speicher fr eine bestimmte Aufl”sung ben”tigt wird, kann nach folgender Formel berechnet werden, wobei je nach Speichermedium evtl. auf volle 16 oder 64 KB aufgerundet werden muá: Breite * X-Aufl”sung (DPI) * H”he * Y-Aufl”sung (DPI) * Farbbits -----------------------------------------------------------------Byte 8 Der Wert von Farbbits betr„gt 1 f•r die Schwarz-Weiá Modi, 3 beim DeskJet 500C/550C mit 8 Farben und 4 bei den Farbmodi der Nadeldrucker. Die Gr”áe des bedruckbaren Bereichs ist je nach Modus unterschiedlich: In den Nadeldrucker-Modi betr„gt die Breite immer 8, die L„nge immer 11 Zoll. In den LaserJet-Modi betr„gt die Breite 7.8 Zoll (neuere Laserdrucker haben des ”fteren Probleme mit der vollen Breite von 8 Zoll), die L„nge 10.5 Zoll. Beim DeskJekt 500C/550C betr„gt die Breite 8 Zoll und die L„nge 10.33 Zoll. 3. Die Einbindung des Treibers Die Einbindung des Treibers erfolgt •ber die Prozedur InstallUserDriver. Der erste Parameter von InstallUserDriver ist der Name des Treibers (ohne die Endung), der zweite Parameter ist ein Zeiger auf eine Detect-Routine, die pr•fen kann, ob der Rechner mit einer f•r den Treiber passenden Hardware ausgestattet ist (was im Falle von Druckern nat•rlich schlecht geht, weswegen ein NILZeiger •bergeben wird). Ist der von InstallUserDriver zur•ckgegebene Integer-Wert < 0, so ist ein Fehler aufgetreten, ist er gr”áer, so stellt er die Nummer des Treibers dar. Der folgende Ausschnitt zeigt, wie eine Einbindung in Turbo-Pascal aussehen kann. VAR GraphMode, GraphDriver : INTEGER; BEGIN { Grafiktreiber installieren } GraphDriver := InstallUserDriver ('PRINTER', NIL); IF (GraphDriver < 0) THEN BEGIN { Fehlerbehandlung } ... END; { Gew•nschten Modus festlegen und Grafik einschalten } GraphMode := 2; { Modus 2, 180*180 DPI } InitGraph (GraphDriver, GraphMode, PathToDriver); ... END; Soll der Treiber als OBJ-Datei in das ausf•hrbare Programm eingebunden werden, so m•ssen folgende Schritte in genau dieser Reihenfolge durchgef•hrt werden: * "Installierung" des Treibers mit InstallUserDriver. Diese Prozedur teilt dem Grafik-Kernel mit, daá es einen Treiber mit dem Namen "PRINTER" gibt. * "Registrierung" des Treibers mit RegisterBGIDriver. Diese Prozedur teilt dem Grafik-Kernel mit, daá der Treiber (falls er verwendet werden sollte) nicht von Platte zu laden ist, sondern daá er sich bereits im Speicher befindet. * Einschalten des Grafikmodus mit InitGraph. Der folgende Code-Ausschnitt zeigt beispielhaft, wie die Einbindung erfolgen kann. Es wird vorausgesetzt, daá der Treiber zuvor mittels BINOBJ PRINTER.BGI PRINTER.OBJ PRINTERDRIVER in eine OBJ-Datei umgewandelt worden ist (C-Programmierer: Das entsprechende Programm heiát BGIOBJ und ist etwas komplizierter zu bedienen. Es m•ssen beim Aufruf alle Parameter angegeben werden! Dazu einfach BGIOBJ ohne Parameter aufrufen und nach Hilfestellung vorgehen.) { Der Treiber als Prozedur deklariert } PROCEDURE PRINTERDriver; FAR; EXTERNAL; { Einbinden des Treibers } {$L PRINTER.OBJ} VAR GraphDriver : INTEGER; { Nummer des Treibers } PROCEDURE Install; { F•hrt die Installation des Treibers durch } BEGIN GraphDriver := InstallUserDriver ('PRINTER', NIL); IF (GraphDriver < 0) THEN Error; IF (RegisterBGIDriver (@PRINTERDriver) < 0) THEN Error; END; BEGIN { Hauptprogramm } .... Install; GraphMode := 1; { Autodetect } InitGraph (GraphDriver, GraphMode, ''); { Fehlerauswertung muss folgen } .... END. Weitere Details finden Sie im Handbuch zur jeweiligen Programmiersprache. 4. Grafik-Modi Folgende Grafik-Modi sind verf•gbar: Wert Bedeutung Anmerkungen ------------------------------------------------------------------------0 EPSON FX (8-Nadel), 240 * 72 DPI 1 EPSON FX (8-Nadel), 240 * 216 DPI 2 EPSON LQ (24-Nadel), 180 * 180 DPI 3 EPSON LQ (24-Nadel), 360 * 180 DPI 4 EPSON LQ (24-Nadel), 360 * 360 DPI 5 NEC P6, P6+, P60 (24-Nadel), 360 * 360 DPI (1) 6 IBM Proprinter X24 (24-Nadel), 180 * 180 DPI 7 IBM Proprinter X24 (24-Nadel), 360 * 180 DPI 8 EPSON LQ / NEC P6, P6+, 180 * 180 DPI, 9 Farben (6) 9 EPSON LQ / NEC P6, P6+, 360 * 180 DPI, 9 Farben (6) 10 EPSON LQ, 360 * 360 DPI, 9 Farben (6) 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 42 42 NEC P6, P6+, 360 * 360 DPI, 9 Farben Reserviert Benutzerdefinierter Modus 1 Benutzerdefinierter Modus 2 Benutzerdefinierter Modus 3 HP LJ, 75 * 75 DPI HP LJ, 100 * 100 DPI HP LJ, 150 * 150 DPI HP LJ, 300 * 300 DPI HP LJ, 75 * 75 DPI, keine Kompression HP LJ, 100 * 100 DPI, keine Kompression HP LJ, 150 * 150 DPI, keine Kompression HP LJ, 300 * 300 DPI, keine Kompression HP DJ 500C, 75 * 75 DPI, 8 Farben, A4 HP DJ 500C, 100 * 100 DPI, 8 Farben, A4 HP DJ 500C, 150 * 150 DPI, 8 Farben, A4 HP DJ 500C, 300 * 300 DPI, 8 Farben, A4 HP DJ 550C, 75 * 75 DPI, 8 Farben, echtes Schwarz HP DJ 550C, 100 * 100 DPI, 8 Farben, echtes Schwarz HP DJ 550C, 150 * 150 DPI, 8 Farben, echtes Schwarz HP DJ 550C, 300 * 300 DPI, 8 Farben, echtes Schwarz HP LJ IV, 600 * 600 DPI EPSON LQ (24-Nadel), 180 * 180 DPI, DIN A3 EPSON LQ (24-Nadel), 360 * 180 DPI, DIN A3 EPSON LQ (24-Nadel), 360 * 360 DPI, DIN A3 NEC P7 (24-Nadel), 360 * 360 DPI, DIN A3 EPSON LQ (24-Nadel), 180 * 180 DPI, DIN A3, 9 Farben EPSON LQ (24-Nadel), 360 * 180 DPI, DIN A3, 9 Farben EPSON LQ (24-Nadel), 360 * 360 DPI, DIN A3, 9 Farben NEC P7 (24-Nadel), 360 * 360 DPI, DIN A3, 9 Farben HP PaintJet 300 XL, 75 * 75 DPI, 8 Farben, A3 HP PaintJet 300 XL, 100 * 100 DPI, 8 Farben, A3 HP PaintJet 300 XL, 150 * 150 DPI, 8 Farben, A3 HP PaintJet 300 XL, 300 * 300 DPI, 8 Farben, A3 (6) (2) (2) (2) (3) (3) (3) (3) (4) (4) (4) (4) (7) (7) (7) (7) (5) (1) (6) (6) (6) (1) (6) (8) (8) (8) (8) Alle anderen Modi erzeugen den Fehler -10 (grInvalidMode). Anmerkungen zur Tabelle: (1) In den niedrigeren Aufl”sungen ist der Drucker EPSON kompatibel, d.h. es k”nnen die Modi 2 und 3 zus„tzlich verwendet werden. (2) Siehe Abschnitt 8 (Benutzerdefinierte Modi). (3) Žltere Modelle des LaserJet II (und Nachbauten) beherrschen z.T. die vom Treiber verwendete Kompressionsmethode nicht. Bei Problemen ist auf die (ansonsten „quivalenten) Modi 20-23 auszuweichen, die keine Kompression verwenden. (4) Die Modi entsprechen den Modi 16-19, es wird jedoch keine Kompression der an den Drucker gesandten Daten durchgef•hrt. Aus diesem Grund ist der Ausdruck normalerweise langsamer. (5) Der Drucker LaserJet IV kann auch mit geringeren Aufl”sungen in den Modi 16-19 betrieben werden. (6) Der Drucker muá dazu mit einer Farboption ausgestattet sein. (7) Der Drucker verf•gt •ber eine separate Schwarz-Patrone und wird vom Treiber so angesteuert, daá fr schwarze Fl„chen diese Patrone verwendet wird. Beachten Sie dazu bitte die Hinweise im Abschnitt 6.4. (8) Diese Modi entsprechen bis auf die Blattgr”áe den Modi 24-27. Der PaintJet 300 XL l„át sich auch in diesen Modi betreiben, wenn nur eine Ausgabe im DIN A4 Format gew•nscht ist. 5. Ausgabe der Grafik Die Ausgabe der Grafik erfolgt beim abschlieáenden CloseGraph. Sollen mehrere Seiten ausgegeben werden, so ist eine Ausgabe auch mittels Aufruf von ClearDevice m”glich. Nach Aufruf dieser Funktion ist die Zeichenfl„che wieder leer. Der Treiber schreibt die Daten auf das MS-DOS Datei-Handle Nr. 4, das normalerweise (von COMMAND.COM) vor Start des Programms mit dem Ger„t PRN (also dem ersten Drucker) verbunden wird. Das Device wird vor der Ausgabe auf "raw data" um- und danach wieder in den Orginalzustand geschaltet. Die Verwendung eines Standard-Handles hat den Vorteil, daá die Ausgabe leicht in eine Datei oder auf einen anderen Ausgabeport umgeleitet werden kann (letzteres z.B. mit Hilfe des MODE-Kommandos). Beispiele zur Umleitung finden Sie in den Beispielprogrammen. 6. Besonderheiten der verschiedenen Drucker 6.1 LaserJet II Bei „lteren Modellen dieses Druckers ist die vom Treiber verwendete Methode zur Kompression der Druckdaten nicht implementiert. Nachbauten verhalten sich hier unterschiedlich. Bei Problemen sind anstelle der Modi 16-19 die Modi 2023 zu verwenden. 6.2 DeskJet 500 Beim DeskJet 500 und Nachfolgern (auch DeskJet 500C im Schwarz-Weiá Modus) k”nnen Ausdruckparameter eingestellt werden. N„heres dazu steht in Abschnitt 9 (Optionen). 6.3 DeskJet 500C Der Drucker DeskJet 500C und seine Nachfolger unterst•tzten 8 Farben, die aus den drei Grundfarben Cyan, Gelb und Magenta zusammengesetzt werden. Da es sich hier um eine subtraktive Palette handelt, unterscheiden sich die Farben von denen des Bildschirmadapters (der eine additive Palette besitzt). Aus diesem Grund k”nnen die vordefinierten Farb-Konstanten nicht verwendet werden. (Rein syntaktisch k”nnen diese Konstanten nat•rlich verwendet werden, d.h. der Compiler meldet keinen Fehler, das Ergebnis sieht dann jedoch etwas anders aus als erwartet.) Die Zuordnung der Farben entnehmen Sie bitte der folgenden Tabelle: Wert Farbe ------------------0 Weiá 1 Cyan 2 Magenta 3 Blau 4 Gelb 5 Gr•n 6 Rot 7 Schwarz Zus„tzlich k”nnen beim DeskJet 500C Ausdruckparameter ver„ndert werden, n„heres dazu steht in Abschnitt 9 (Optionen). 6.4 DeskJet 550C Der DeskJet 550C verf•gt im Gegensatz zu seinem Vorl„ufer •ber separate Schwarzpatrone, die gleichzeitig verwendet werden kann. In den ist es m”glich, diese separate Patrone zum Druck schwarzer Fl„chen benutzen. Beachten Sie dazu bitte den folgenden Hinweis aus dem Handbuch Herstellers (im Orginal Englisch, von mir frei •bersetzt): eine Modi 28-31 zu des Vorsicht ist geboten, wenn schwarze und farbige Tinte gleichzeitig auf einer Seite verwendet wird. Die Tinten aus der Farb-Patrone haben eine andere chemische Zusammensetzung als die Tinte aus der SchwarzPatrone. Wenn beide in direkten Kontakt miteinander kommen, kann es passieren, daá sich die schwarze merklich mit der farbigen Tinte mischt. Das Problem f„llt am meisten auf, wenn viel Tinte aufgetragen wird. Die Verwendung von Shingling beim Ausdruck kann dieses Ph„nomen verringern oder ganz eliminieren. 25% Shingling kann die Qualit„t des Ausdrucks verbessern, 50% Shingling kann das Problem evtl. ganz zum Verschwinden bringen. Alternativ kann mit geringerem Tintenauftrag gearbeitet werden (d•nnere Linien oder F•llmuster), oder es kann durch geeigneten Ausdruck daf•r gesorgt werden, daá sich die Fl„chen mit unterschiedlichen Tinten nicht ber•hren. Weiterhin sind alle Hinweise aus Abschnitt 6.3 g•ltig. 6.5 PaintJet 300 XL Beim PaintJet 300 XL handelt es sich um einen A3 Farbdrucker, der auch mehr als 8 Farben untersttzt. Dieser Drucker l„sst sich in den Modi 24-27 (A4) und 41-44 (A3) betreiben. Modi mit mehr als 8 Farben stehen derzeit nicht zur Verf•gung. F•r die Farbzuordnung, siehe Abschnitt 6.3. 6.6 HP DeskJet 1200 Der Drucker m•sste die Modi 24-27 "verstehen". Aufgund fehlender Hardware ist das bisher aber ungetestet. Fr Rckmeldungen w„re ich dankbar. 6.7 Canon BJ-300 und BJ-330 Dieser Tintenstrahldrucker emuliert entweder die EPSON Drucker LQ850 bzw. LQ1050 oder den IBM Proprinter X24. Je nach Einstellung am Drucker lassen sich deshalb die Modi 2-4 oder 8-9 des Treibers verwenden. Die Einstellung des Emulationsmodus ist im Druckerhandbuch beschrieben. 6.8 Canon BJC-800 Als Emulationsmodus sollte "EPSON LQ-2550" gew„hlt werden. Der Drucker unterst•tzt Farbe, die Farbmodi der EPSON-Drucker k”nnen verwendet werden. 6.9 NEC P6, P6+, P7, P7+, EPSON LQ Serie In den entsprechend gekennzeichneten Modi kann der Drucker als Farbdrucker verwendet werden. Dazu ist jedoch eine Hardware-Aufr•stung des Druckers notwendig. Die Farbzuordnung entnehmen Sie bitte folgender Tabelle: Wert Farbe ------------------0 Weiá 1 Cyan 2 Magenta 3 Blau 4 Gelb 5 Gr•n 6 Rot 7 Braun 8 Schwarz 7. Der Treiber im Protected-Mode Aufgrund der Eigenheiten des Protected-Mode muáte Borland das Format der Treiber beim šbergang auf die Version 7.0 von Turbo-Pascal „ndern. Die neuen Versionen des Grafik-Kernels erkennen jedoch die alten Treiber und behandeln diese korrekt, vorausgesetzt, das Programm l„uft im Real-Mode. Die folgende Auflistung zeigt, welcher Treiber mit welchem Compiler kompatibel ist: * Turbo-Pascal bis Version 6.0 und Borland-C++ bis Version 3.1 laufen nur im Real-Mode und kennen nur das alte Format der Treiber. * Borland-Pascal 7.0 l„uft sowohl im Real- als auch im Protected-Mode und erkennt beide Treiberformate. Der Betrieb im Protected-Mode ist jedoch nur mit dem neuen Format m”glich. * Turbo-Pascal 7.0 ist eine abgespeckte Version von Borland-Pascal 7.0 und l„uft nur im Real-Mode, erkennt aber beide Treiberformate. Im Paket befinden sich der Treiber in beiden Formaten. Der Treiber f•r das neue (DPMI-) Format tr„gt jedoch einen anderen Namen (PRINTER.BP7) und muá vor Gebrauch umbenannt werden. Im Real-Mode unterscheiden sich beide Versionen des Treibers nicht. Im Protected-Mode ergeben sich jedoch folgende Einschr„nkungen: * Der Treiber unterst•tzt kein EMS und kein XMS. Es kann nur in den DPMI-Speicher und auf Platte ausgelagert werden. Bei Verwendung von DPMI-Speicher ist der Treiber daf•r wesentlich schneller, da ein direkter Zugriff erfolgen kann. * Der Runtime-Manager von Borland belegt beim Start s„mtlichen verf•gbaren DPMI-Speicher, der dann dem Treiber nicht mehr zur Verf•gung steht. Aus diesem Grund muá dem Runtime-Manager durch Setzen einer EnvironmentVariable mitgeteilt werden, welchen Anteil des DPMI-Speichers er freizuhalten hat ansonsten wird prinzipiell auf Platte ausgelagert. Dieser Speicher steht dann aber dem Programm nicht mehr zur Verf•gung. (Zumindest nicht •ber die Routinen des Borland-Pakets. šber DPMI-Funktionen kann der Speicher selbstverst„ndlich belegt werden.) Soll DPMI-Speicher benutzt werden, so ist vor Start des Programms auf DOS-Ebene SET RTM=EXTLEAVE nnnn einzugeben, wobei nnnn die Gr”áe (in KB) des vom Runtime-Managers nicht zu belegenden Speichers ist. Um z.B. 1MB Speicher f•r den Treiber freizuhalten, wird SET RTM=EXTLEAVE 1024 verwendet. N„heres dazu lesen Sie bitte in Ihrem Compiler-Handbuch nach. ACHTUNG: Borland hat mehrere Monate lang eine Version 7.00 des BorlandPascal Compilers vertrieben die extrem fehlerhaft war (die sp„tere, fehlerbereinigte Version tr„gt die Versionsnummer 7.01). Falls Sie im Besitz dieser „lteren Version sind, sollten Sie auf jeden Fall ein Upgrade bei Borland erstehen (auch wenn dieses nicht kostenlos ist). Die korrekte Version erkennen Sie an der Uhrzeit der letzten Žnderung der Datei: Die richtige Version des Compilers zeigt hier 07:01, die falsche 07:00. 8. Benutzerdefinierte Modi PRINTER.BGI l„sst sich •ber Drucker-Definitionsdateien an fast alle Nadeldrucker anpassen. Dazu dient ein kleines šbersetzungsprogramm zusammen mit einigen daf•r reservierten Modi im Treiber. Bei der Initialisierung sucht der Treiber nach den Dateien PRINTER1.PDF, PRINTER2.PDF und PRINTER3.PDF (f•r die Modi 13-15). (Das ".PDF" steht f•r "Printer Definition File".) Der Treiber sucht in mehreren Verzeichnissen nach diesen Dateien, und zwar: * Im aktuellen Verzeichnis. * Im Verzeichnis, in dem sich die EXE-Datei befindet. Dieser Mechanismus funktioniert erst ab DOS 3.0. * Im Verzeichnis, das die Environment-Variable BGIPATH angibt. Sie k”nnen diese Variable auf DOS-Ebene mit set BGIPATH=X:\YYY\ZZZ setzen. Findet PRINTER.BGI eine oder mehrere dieser Dateien so wird/werden sie geladen und Modus wird entsprechend der in der Datei enthaltenen Angaben unterst•tzt. Zur Erstellung dieser Dateien gehen Sie wie folgt vor: * Erstellen Sie mit Ihrem Text-Editor eine ASCII-Datei mit den erforderlichen Steuersequenzen. Lesen Sie dazu die Anleitung (PDFCOMP.DOC) und orientieren Sie sich an den beigelegten Beispieldateien. * šbersetzen Sie die ASCII-Datei mit Hilfe des Programms PDFCOMP in eine Bin„rdatei. * Benennen Sie die Datei um in PRINTERx.PDF, je nachdem welchen Modus Sie verwenden wollen. * Kopieren Sie die Datei in eines der oben genannten Verzeichnisse. Der Treiber l„dt diese Datei bei der Initialisierung und unterst•tzt den Modus dann wie einen eingebauten. * Falls Sie mir und anderen Benutzern einen Gefallen tun wollen: Senden Sie mir die Definitionsdatei (ASCII-Datei) zu, damit ich sie anderen Benutzern zur Verf•gung stellen kann. Vermerken Sie dazu in der Datei bitte Ihren Namen (f•r R•ckfragen) und die genaue Bezeichnung des Druckers, f•r den die Datei erstellt wurde. Findet der Treiber eine oder beide Dateien nicht in den oben genannten Verzeichnissen, so gibt der Treiber den Fehlercode grInvalidMode (-10) zur•ck. Je nachdem welche Dateien vorhanden sind k”nnen die Modi 13-15 ganz normal angesprochen werden. 9. Einstellen von Druck-Optionen Der Drucker unterst•tzt bei Ausgabe auf Drucker vom Typ DeskJet (in den Modi 16-31) Optionen zur Beeinflussung der Ausgabequalit„t. Bei Nadel- oder Laserdruckern haben die hier besprochenen Einstellungen keine Auswirkung, die entsprechenden Befehle werden ignoriert. Die Optionen werden •ber den Treiber durch einen "Miábrauch" der Funktion SetAllPalette verf•gbar gemacht. Diese Funktion ist speziell auf EGA-Karten bzw. VGA-Karten im 16-Farb Modus zugeschnitten und hat bereits bei Super-VGA's im Modus mit 256 Farben keine Bedeutung mehr, so daá die Verwendung zur šbergabe eines Kontrollblocks an den Treiber nahe lag. šblicherweise wird eine Variable vom Typ PaletteType •bergeben, deren Deklaration wie folgt lautet: CONST MaxColor = 15; TYPE PaletteType = RECORD Size : BYTE; Colors : ARRAY [0..MaxColor] OF SHORTINT; END; Size entspricht der Anzahl der Farben des Druckers, muá also in den SchwarzweiáModi auf 2, in den Farbmodi des DeskJet dagegen auf 8 gesetzt werden. Im Array Colors sind die ersten Size Bytes g•ltig und werden bei einem Aufruf vom Grafik-Kernel an den Treiber weitergereicht. Die Bedeutung der Werte im Array Colors ergeben sich aus den folgenden Tabellen: M”gliche Ausdruck-Optionen beim DeskJet 500: Index Defaultwert Bedeutung ----------------------------------------------------------------0 Reserviert 1 0 Ausgabequalit„t: 0: Qualit„t wie am Drucker eingestellt 1: Draft 2: High M”gliche Ausdruck-Optionen beim DeskJet 500C/550C: Index Defaultwert Bedeutung ----------------------------------------------------------------0 Reserviert 1 0 Ausgabequalit„t: 0: Qualit„t wie am Drucker eingestellt 1: Draft 2: High 2 0 Shingling: 0: Keines 1: 50% Shingling (2 Druck-Durchg„nge) 2: 25% Shingling (4 Druck-Durchg„nge) 3 1 Depletion: 0: Keine 4-7 1: 25% 2: 50% Reserviert Beim "Shingling" wird die Ausgabe einer Zeile in mehrere Durchg„nge aufgeteilt, um der Farbe zwischenzeitlich eine M”glichkeit zum Antrocknen zu geben und so eine saubere Schichtung der Farben zu gew„hrleisten. Der Defaultwert ist 0 (kein Shingling), die Werte 1 bzw. 2 verlangsamen die Ausgabe, da mehr Durchg„nge erforderlich sind. Beim "Depletion"-Verfahren wird nach einem (mir unbekannten - ich zitiere nur das Handbuch) gleichnamigen Algorithmus ein Teil der Farb-Pixel entfernt um Farbe zu sparen und die Qualit„t der Druckausgabe zu verbessern. Default ist hier 1 (25% Depletion). Hinweis: Es werden keinesfalls die angegebene Prozentzahl an Pixeln entfernt, es handelt sich um die Vorbesetzung einer Variable im o.g. Algorithmus. Die Einstellung der Druck-Optionen erfolgt durch Deklaration einer Variablen (oder typisierten Konstanten) vom Typ PaletteType, Zuweisung der Werte Aufruf von SetAllPalette mit der deklarierten Variablen als Parameter. Werte die sich nicht „ndern sollen (dazu geh”ren auch die mit "Reserviert" gekennzeichneten Eintr„ge) sollten mit -1 belegt werden (siehe Compiler-Handbuch). ACHTUNG: Sie m•ssen diese Werte nicht neu einstellen - der Treiber verwendet dann die unter "Defaultwert" stehenden Vorgaben. Diese Werte sind die Standard-Werte des Druckers und haben normalerweise eine saubere DruckAusgabe zur Folge. F•r spezielle Anwendungen oder kommerzielle Programme kann es jedoch u.U. sinnvoll sein, die Ausgabe zu beeinflussen. 10. Fehler im UNIT Graph 10.1 Fehlercodes Durch einen Fehler im UNIT Graph werden die negativen Fehlercodes, die der Treiber zur•ckgibt positiv an die Anwendung durchgereicht: Das StatusFeld des Treibers, •ber das die Fehlercodes r•ckgemeldet werden ist 1 Byte groá. Da die Fehlercodes negative Werte sind, h„tte dieses Feld als SHORTINT deklariert werden m•ssen. Die Entwickler haben dies aber •bersehen und das Feld als BYTE deklariert, was dazu f•hrt, daá die Fehlercodes nicht vorzeichenrichtig erweitert werden. Abhilfe schafft eine Abfrage wie in der folgenden Abbildung. Unter Umst„nden kann GraphResult entsprechend •berdefiniert werden. VAR Result : INTEGER; BEGIN { Grafik einschalten } InitGraph (GraphDriver, GraphMode, ''); { Fehlercode auswerten. Durch den Typecast werden die obersten 8 Bits abgeschnitten, durch die Zuweisung an einen INTEGER wird vorzeichenrichtig erweitert. } Result := SHORTINT (GraphResult); IF (Result <> 0) THEN BEGIN Writeln (GraphErrorMsg (Result)); Halt; END; .... END; 10.2 SetGraphMode Die Funktion SetGraphMode arbeitet fehlerhaft wenn Modusnummern gr”áer 10 angegeben werden. Von der Verwendung dieser Funktion wird abgeraten. Verwenden Sie stattdessen Aufrufe von CloseGraph und InitGraph. Siehe auch den folgenden Abschnitt. 10.3 RestoreCRTMode und SetGraphMode Die Funktionen arbeiten unter Borland-Pascal 7.0 im Protected-Mode nicht korrekt, u.U. ist ein GP Fault die Folge. 10.4 RegisterBGIDriver Manuell geladene (d.h. als .OBJ-File eingebundene oder aus einem Resource-File geladene) Treiber m•ssen unter Borland-Pascal 7.0 im Protected-Mode auf eine Adresse zu liegen kommen, die einen Offset von 0 hat. Ansonsten bricht das Grafik-Kernel beim zweiten Aufruf von InitGraph u.U. das Programm mit einer Fehlermeldung ab. Um sicherzustellen, daá der Treiber auf einer Adresse mit Offset 0 zu liegen kommt, wenn er als .OBJ-Datei eingebunden wird, erstellen Sie bitte ein separates Modul, in dem sich ausschlieálich der Treiber befindet. Exportieren Sie die Adresse des Treibers und f•hren Sie die Initialisierung der Grafik in einem anderen Modul durch. 11. Zusammenfassung Nachdem in den vorigen Abschnitten nach und nach immer mehr Details dargestellt wurden, sollen diese Informationen hier nochmals kurz zusammengefaát und anhand eines (diesmal vollst„ndigen) Beispiels in Turbo-Pascal demonstriert werden. Weitere Beispiele (auch in C) sind im Paket enthalten. * Die Einbindung des Treibers geschieht mittels der Prozedur InstallUserDriver, die die Nummer des Treibers zur•ckliefert. Diese Prozedur muá vor InitGraph aufgerufen werden. * Die Abfrage von Fehlern muá •ber den in Abschnitt 10 beschriebenen Umweg erfolgen, falls die Nummer des Fehlers ausgewertet werden soll (z.B. bei Aufruf von GraphErrorMsg zur Ausgabe einer Meldung). * Die Ausgabe der Grafik erfolgt beim Aufruf von ClearDevice sowie beim abschliessenden CloseGraph. * Die Einstellung von Ausdruck-Optionen oder die Erkl„rungen zum DateiHandle k”nnen Sie f•r den Anfang getrost vergessen. Der Ausdruck funktioniert normalerweise auch ohne daá Sie diese Optionen neu einstellen. (Falls Sie nicht ein sehr speziell konfiguriertes System haben. Aber dann wissen Sie ja sowieso, was mit diesen Dingen gemeint ist.) Komplettes Beispiel in Turbo-Pascal: VAR GraphDriver, GraphMode : INTEGER; Result : INTEGER; BEGIN { Einbinden des Treibers } GraphDriver := InstallUserDriver ('PRINTER', NIL); IF (GraphDriver < 0) THEN BEGIN { Fehlerbehandlung } .... END; { Modus setzen und Einschalten der Grafik } GraphMode := 11; { Modus 11, LaserJet 300 DPI } InitGraph (GraphDriver, GraphMode, ''); { Fehler auswerten } Result := SHORTINT (GraphResult); IF (Result <> 0) THEN BEGIN { Fehlerbehandlung } Writeln (GraphErrorMsg (Result)); Halt; END; { Grafik-Operationen } Line (0, 0, GetMaxX, GetMaxY); .... { Grafik ausgeben } ClearDevice; { Neue Grafik } Line (0, 0, GetMaxX, GetMaxY); .... { Grafik ausgeben und beenden } CloseGraph; END; 12. Zus„tzliche Informationen Dieser Abschnitt enth„lt zus„tzliche Informationen, die u.U. von Nutzen sein k”nnen. Weitere Hinweise entnehmen Sie bitte der Datei README.TXT. * Die Auswahl der Speicherm”glichkeit erfolgt in der Reihenfolge der damit erzielbaren Geschwindigkeit: - Der schnellste Zugriff wird durch die Verwendung von DPMISpeicher im Protected-Mode erreicht. - Direkt danach folgt EMS-Speicher, wobei der Unterschied zu DPMI fast vollst„ndig auf die zur Seitenumschaltung ben”tigte Zeit zur•ckzuf•hren ist und sich je nach verwendetem EM-Manager unterscheiden kann. - Bei Verwendung von XMS wird kein Speicher eingeblendet, sondern die Daten werden zwischen normalem und erweiterten Speicher hin- und herkopiert, was zus„tzlich Zeit ben”tigt. - Die Verwendung einer tempor„ren Datei auf Platte ist umso langsamer, je h”her die Aufl”sung ist (weil der interne Puffer des Treibers einen immer kleineren Bereich der Zeichenfl„che umfaát). Vor allem bei den hohen Aufl”sungen (ab 180 * 360 DPI) sollte die Verwendung von Platte wenn m”glich vermieden werden. (Wobei sich dies nicht verallgemeinern l„sst: Wird ein gutes Plattenpufferprogramm verwendet, ist u.U. auch in den h”heren Aufl”sungen die Ausdruckzeit akzeptabel. Versuche in den DOS-Boxen von OS/2 haben gezeigt, daá auch im Modus 19 mit 300 DPI noch Ausdrucke m”glch sind, die ben”tigte Zeit betr„gt ca. 3-4 Minuten.) * Die tempor„re Datei bei Auslagerung auf Platte wird beim Aufruf von InitGraph im aktuellen Verzeichnis angelegt. Soll diese Datei in einem bestimmten Verzeichnis liegen, so ist vor Aufruf von InitGraph dieses Verzeichnis zum aktuellen Verzeichnis zu machen. Sp„tere Wechsel des Verzeichnisses haben keinen Einfluss mehr auf die Lage der tempor„ren Datei. Die Auswertung einer Environment-Variable (wie z.B. TMP oder TEMP) erschien mir problematisch, da diese Variable oft auf eine RAM-Disk mit beschr„nkter Kapazit„t zeigt. Durch o.g. Verfahren ist es jedoch m”glich, das Verzeichnis festzulegen, in das die tempor„re Datei gelegt wird. * Da R•ckmeldungen des Treibers nach durchgef•hrten Operationen durch das Borland Grafik-Modul gr”átenteils nicht ausgewertet werden, ist die R•ckgabe eines Fehlercodes bei nicht eingeschaltetem Drucker nicht m”glich. Sie sollten daher vor Beginn der Grafik-Ausgabe den Drucker-Status pr•fen. PRINTER.BGI bricht bei Druckerfehlern (also auch bei ausgeschaltetem Drucker) den Ausdruck sofort ab. * CloseGraph ruft automatisch immer RestoreCRTMode auf, was zur Folge hat, daá der Text-Bildschirm gel”scht wird. Sie m•ssen daher eventuelle Inhalte retten und nach CloseGraph wiederherstellen (oder kurzfristig die Modus-Umschaltung verhindern, indem Sie einen eigenen Handler f•r den Interrupt 10h installieren). * F•r die Verwendung von EMS wird eine Unterst•tzung der EMS 3.2 kompatiblen Funktionen vorausgesetzt (dies wird von allen mir bekannten EMSTreibern erf•llt). F•r den XMM (E<x>tended <M>emory <M>anager) erwartet PRINTER.BGI zumindest eine Versionnummer von 2.0, das DPMI-Interface muá Version 0.9 oder neuer entsprechen. * Bei Auslagerung auf Platte •berpr•ft der Treiber bei der Initialisierung den zur Verf•gung stehenden Platz auf dem aktuellen Laufwerk. Falls eine Auslagerung in EMS oder XMS nicht m”glich ist, muá also zum Zeitpunkt des Aufrufs von InitGraph gen•gend Platz auf der Platte vorhanden sein. * Wird das Programm vor dem Aufruf von CloseGraph unterbrochen, erh„lt der Treiber keine Gelegenheit mehr, das von ihm verwendete Speichermedium "aufzur„umen". Dies kann zum Beispiel beim Debuggen eines Programms passieren, wenn das Programm nicht bis zu Ende ausgef•hrt wird. Die Folge davon sind belegte EMS-Seiten, belegter XMS-Speicher oder nicht gel”schte tempor„re Dateien auf der Festplatte. Vor allem letztere sind „rgerlich, weil sie beim Neustart des Systems nicht gel”scht werden und ob ihrer Gr”áe recht schnell die Platte f•llen. Diese Dateien werden vom Treiber als versteckte (Attribut Hidden) Dateien im aktuellen Verzeichnis angelegt. Sie sollten also nach einem Programm-Abbruch pr•fen, ob solche Dateien vorhanden sind (erkennbar an Namen wie AACGHFKL) und diese - falls vorhanden l”schen. * Die Aufl”sungen mit 240 * 72 DPI und 240 * 216 DPI funktionieren nicht auf 24-Nadeldruckern! Auf den ersten Blick scheinen auch die 24-Nadler •ber diese Modi zu verf•gen. Ein Test zeigt jedoch, daá •ber den unteren Seitenrand hinausgedruckt wird. Dies liegt daran, daá 24-Nadel Drucker diese Modi simulieren, indem nur jede dritte Nadel verwendet wird. Da der Nadel-Abstand bei 1/180 Zoll liegt ergibt sich bei Verwendung jeder dritten Nadel eine vertikale Aufl”sung von 60 DPI (im Gegensatz zu 72 DPI bei den 8-Nadlern). Aufgrund dieser niedrigeren Aufl”sung beansprucht das Bild in vertikaler Richtung mehr Platz, was zum šberschreiten des unteren Bildrandes f•hrt. * Der Modus 360 * 360 DPI wird nicht von allen Nadeldruckern unterst•tzt. Zus„tzlich ist dieser Modus von unterschiedlichen Herstellern auch unterschiedlich implementiert worden. Falls Ihr Drucker die DemoProgramme in diesem Modus fehlerhaft ausdruckt, pr•fen Sie bitte erst anhand Ihres Druckerhandbuchs, ob Ihr Drucker einen Befehl zum Einstellen des Zeilenvorschubs in Einheiten von 1/360 Zoll kennt. Wenn dies nicht der Fall ist, beherrscht Ihr Drucker diesen Modus nicht. Ist es der Fall, vergleichen Sie den Befehl bitte mit den folgenden beiden: Hersteller Steuersequenz ----------------------------EPSON ESC '+' <n> NEC FS '3' <n> Verwenden Sie dann den entsprechenden Modus des Treibers (NEC 360 * 360 oder EPSON 360 * 360). Sollte Ihr Drucker einen v”llig anderen Befehl zur Einstellung verwenden, m•ssen Sie eine Drucker-Definitionsdatei f•r diesen Modus erzeugen. Lesen Sie dazu bitte den entsprechenden Abschnitt. * In der C-Version existiert eine undokumentierte Variable namens _BGI_auto, die dazu verwendet werden kann, das L”schen des Bildschirms bei initgraph() und closegraph() zu verhindern. Diese Variable war im urspr•nglichen BGI-Konzept dafr vorgesehen war, das L”schen des Bildschirms zu unterdr•cken, indem sie vom Treiber (PRINTER.BGI) auf einen "magischen" Wert gesetzt wird. Aufgrund eines der vielen Fehler im Grafik-Kernel funktioniert dies jedoch nicht, da das L”schen des Bildschirms vor dem Aufruf des Treibers geschieht, so daá ein sp„teres Setzen dieser Variable wirkungslos ist. In der "C"-Version des Grafik-Kernels ist diese Variable jedoch ”ffentlich zug„nglich und kann so vor dem Einschalten des GrafikModus vom Programm gesetzt werden. Es gibt keine Garantie daf•r, daá dieses Vorgehen mit sp„teren Versionen des Grafik-Kernels kompatibel ist (es ist jedoch anzunehmen, daá sich an der GRAPHICS Library nicht mehr viel „ndern wird). Die Variable wird deklariert als extern char _BGI_auto; Nach der Zuweisung _BGI_auto = 0xA5; l”scht das Grafik-Kernel den Bildschirm nicht mehr. Diese Variable existiert auch in der Pascal-Version ist allerdings dort nicht zug„nglich, da der Name nur innerhalb von Graph bekannt ist. * Wenn sowohl der Treiber als auch das Programm EMS verwenden kann es unter Umst„nden zu Problemen kommen. Das ist vor allem dann der Fall, wenn das Programm Overlays ins EMS auslagert. Die einfachste M”glichkeit, diese Schwierigkeiten zu umgehen ist es, einem der beiden die Benutzung des EMS zu untersagen. Das kann im Fall der Overlays durch Streichen des Aufrufs von OvrInitEMS geschehen. Soll der Treiber kein EMS verwenden, so ist vor Aufruf von InitGraph s„mtlicher EMS-Speicher zu belegen. * Beim F•llen von komplexen Mustern mit FloodFill kann es u.U. notwendig sein, den Puffer, den Graph daf•r bereitstellt, mit der Prozedur SetGraphBufSize *vor* dem Aufruf von InitGraph etwas zu vergroessern (Default sind 4KB). 13. Bei Problemen und Fehlern Da sich leider in der Vergangenheit gezeigt hat, daá die wenigsten Schwierigkeiten tats„chlich am Treiber selber liegen, m”chte ich Sie bitten die folgenden Punkte zu beherzigen: * Lesen Sie die komplette Anleitung sowie alle README-Dateien auf der Diskette nochmals durch. Einige g„ngigere Fehlerquellen sind dort beschrieben. * Falls der Treiber bei Ihnen •berhaupt nicht funktionieren sollte •berpr•fen Sie bitte anhand der beigelegten Beispielprogramme ob das NichtFunktionieren an Ihrem Programm oder am Treiber liegt. * Versuchen Sie herauszufinden, ob der Fehler evtl. an Ihrer Hardware liegt, indem Sie Ihr Programm auf einem anderen Rechner testen. * Versuchen Sie, herauszufinden, ob eine spezielle Rechnerkonfiguration f•r den Fehler verantwortlich ist. Entfernen Sie dazu Ger„tetreiber aus den Konfigurationsdateien CONFIG.SYS und AUTOEXEC.BAT. * Falls Sie tats„chlich vermuten, einen Fehler im Treiber gefunden zu haben, versuchen Sie bitte, den Fehler einzukreisen und ein m”glichst kleines Programm herzustellen, bei dem der Fehler auftritt. Entfernen Sie dazu allen Code, der nicht unbedingt notwendig f•r die Reproduktion des Fehlers ist. Bitte senden Sie mir dieses Programm zusammen mit einer detailierten Fehlerbeschreibung zu. 14. Sonstiges Bei mir sind weitere BGI-Treiber f•r Plotter, f•r Super-VGA's und zur Ausgabe von PCX-Dateien zu denselben Bedingungen erh„ltlich. Die aktuellen Versionen erhalten Sie per Modem unter der Nummer 07071/440588, 8N1, V32bis. Falls Sie Interesse an weiteren Treibern, weiteren unterst•tzten Druckern usw. haben, setzen Sie sich bitte mit mir in Verbindung. Speziell Unterst•tzung von weiteren Druckern f•r den Druckertreiber werden von mir •blicherweise zu einem sehr g•nstigen Festpreis durchgef•hrt. 15. Dateien im Paket Das vorliegende Archiv muá folgende Dateien enthalten: Im Verzeichnis Im Verzeichnis Im Verzeichnis PRINTER PRINTER.BGI PRINTER.BP7 Der BGI-Treiber. BGI-Treiber f•r Borland-Pascal 7.0. PDFCOMP PDFCOMP.EXE PDFCOMP.DOC *.DEF Der Definitions-Compiler. Die Dokumentation dazu. Diverse Definitionsdateien. PIXFONT PIXFONT.PAS Modul zur Ausgabe von Pixelfonts beliebiger FONTDEMO.EXE Gr”áe. Die Dokumentation dazu. Programm zur Abspeicherung der VGA-Fonts (in den Gr”áen 8x14 und 8x16) als Datei. Quelltext dazu. Einige Pixelfonts zur Verwendung mit dem Modul PixFont. Beispielprogramm zu Anwendung von FONTDEMO.PAS FONTDEMO.DOC Quellcode zu PIXFONT.EXE. Dokumentation zu FONTDEMO. PIXFONT.DOC GETFONT.EXE GETFONT.PAS *.FNT PIXFONT. Im Verzeichnis C DEMO.EXE DEMO.C Im Verzeichnis PASCAL DEMO.EXE DEMO.PAS DEMO2.EXE DEMO2.PAS Im Verzeichnis BGILIB MAKELIB.BAT Kurzes Demo-Programm zur Verwendung des Treibers. Der Quellcode dazu. Kurzes Demo-Programm zur Verwendung des Treibers. Der Quellcode dazu. Ausf•hrliches Demo-Programm. Quelltext zu DEMO.PAS. Batch-Datei von Herrn Jung-Merkelbach zur Erzeugung zweier Libraries f•r den C- Compiler, die die kompletten Fonts und Treiber als OBJDateien enthalten.