hp2xx — Ein Konverter für HPGL-Daten

Heinz Werntges (heinz@biokyb.uni-duesseldorf.de) Abt. Biokybernetik, Geb. 26.12, Heinrich-Heine-Universität, D-4000 Düsseldorf 1

Zusammenfassung HPGL ist ein Quasistandard für Vektorgrafiken. Wer HPGL-Bilder in TEX-Dokumente einbinden will, erhält mit hp2xx ein Hilfsmittel für alle typischen Vorgehensweisen: hp2xx kann Druckerdateien erzeugen, so daß Abbildungen in alter Weise separat gedruckt und eingeklebt werden können. Es generiert aber auch Rastergrafik (PCX), entweder für direkte Einbindung wie mit den emTEX-Treibern, oder für Weiterverarbeitungen wie z.B. mit bm2font, sowie Atari-ST screendump-Dateien. Das EPS-Format (encapsulated PostScript) ermöglicht auflösungsunabhängige Bildeinbindung und ist insbesondere für hochauflösende Drucker oder Lichtsatzanlagen interessant. Auch METAFONT wird unterstützt. Auf DOS-Rechnern mit VGA-Grafik ist schließlich ein Preview-Modus realisiert. — Das ausführbare Programm ist ”public domain“ und wird zur Zeit auf DOS, Sun (SPARC), sowie (mit Einschränkungen) auf VAX/VMS und ATARI unterstützt.

1 Einleitung

Das Programm hp2xx liest HPGL-Quelltext ein und erzeugt je nach Betriebsart Ausgaben in verschiedenen Formaten. Es gibt zwei Formatfamilien: Vektor- und Rastergrafik-Formate.

Zu den Vektorformaten zählen das METAFONT- und das (encapsulated) PostScript-Format. Folgende Rastergrafiken werden unterstützt: HP-PCL (Level 3 bzw. Laserjet/Deskjet-kompatibel), PCX (wird z.B. von Paintbrush unter MS-Windows und den emTEX-Treibern akzeptiert) und Atari-ST Bitmaps (screen dumps). Auf PC’s mit VGA-Karte wird unter DOS außerdem ein Preview-Modus angeboten, der dank BIOS-Aufrufen auch moderne hochauflösende VGA-Karten unterstützt.

hp2xx wurde auf der Basis von D. Donath’s HPtoMF [Don90] entwickelt und hat von diesem Programm die METAFONT-Generierung, den Kern des HPGL-Scanners und das allgemeine Konzept der Bildgrößenkontrolle geerbt. Es versteht nur einfache HPGL-Kommandos, aber die Praxis zeigt, daß viele HPGL-Quellen nur von diesen elementaren Kommandos Gebrauch machen. Insbesondere wurden HPGL-Ausgaben von AutoCAD, TechPlot und GKS mit hp2xx problemlos verarbeitet.

Mit den Ausgaben von hp2xx steht eine Vielzahl an Möglichkeiten offen: Der VGA-Preview hilft, die HPGL-Datei zu überprüfen oder Änderungen in ihr rasch zu erkennen. Er vermittelt einen guten Eindruck vom später zu erwartenden Bild, da u.a. die korrekten Seitenverhältnisse eingehalten werden. Wer einen HP-Laserjet (oder Kompatiblen) bzw. Deskjet ohne HPGL-Emulation besitzt und zum Ausdrucken von HPGL-Grafiken einsetzen möchte, verwendet das PCL-Format.

Für TEX steht ein geräte- und auflösungsunabhängiger Weg der Grafikeinbindung über METAFONT zur Verfügung, der allerdings etwas umständlich ist und an einige Kapazitätsgrenzen anderer Programme stoßen kann [Don90]. Auf DOS-Rechnern und mit emTEX ist die Erzeugung von PCX-Dateien eine besonders einfache Methode der Grafikeinbindung. Das PCX-Format ist ferner ein idealer Ausgangspunkt für bm2font [Sow90], mit dessen Hilfe Rastergrafiken (auch große und komplizierte Bilder!) in TEX-fonts (pk-files) unter Umgehung des langsamen METAFONT gewandelt werden können.

Moderne PostScript-Drucker und insbesondere Lichtsatzanlagen mit ihrer hohen Auflösung benötigen Vektorgrafikdaten für bestmögliche Druckqualität bzw. geräteunabhängige Grafikeinbindung. hp2xx erzeugt für diese Geräte EPSF (encapsulated PostScript format), so daß zusammen mit einem PostScript-Treiber wie z.B. Tom Rokicki’s dvips hochwertige Ausdrucke erstellt werden können. Achtung: In den meisten Fällen bedeutet die Entscheidung für PostScript eine Abkehr vom Previewing, denn schnelle (!) PostScript-Previewer sind noch selten anzutreffen.

2 Aufbau und Funktion

hp2xx ist in C geschrieben und als Filter konzipiert, liest also standardmäßig von stdin, schreibt nach stdout und meldet Diagnose auf stderr. Unter UNIX ist daher normaler Filterbetrieb möglich (z.B. piping in die Druckerqueue bei PCL-Format), DOS verhindert dies aber bei Binärdateien. Die Möglichkeiten und Grenzen anderer Betriebssysteme sind noch nicht ausgelotet.

Das Programm ist modular konstruiert (Abb. 1 und kann deshalb leicht um neue Formate erweitert werden. Es arbeitet in (zwei oder) drei Phasen: Wie schon sein Urahn HPtoMF arbeitet sich der HPGL-Scanner erst durch den Quelltext, schreibt alle gefundenen Vektoren in eine temporäre Datei (mit tmpfile() angelegt) und ermittelt dabei Skalierungsinformation.

Bei den Rastergrafik-Formaten wird dann in Phase 2 das zu erzeugende Rasterbild zeilenweise allokiert. Reicht der Hauptspeicher nicht aus, was bei großen Bildern bei hoher Auflösung unter DOS leicht passieren kann, wird automatisch in eine Swap-Datei ausgelagert. Diese Datei muß das gesamte Bild aufnehmen können! Nach gelungener Initialisierung werden die Vektoren der temporären Datei im Speicher geplottet.

Als letzte Phase folgt die Formatierung ins Ausgabeformat. Vektorformate können unmittelbar die temporär abgelegten Vektoren umcodieren, während für Rasterformate das interne Rasterbild geeignet konvertiert wird.

[figure]

Scanner HPGL-Datei

[figure]

Temporäre Datei, vektor-orientiert

Bitmap-Generator

METAFONT–

PostScript–

[figure] [figure] [figure]

.ps-Datei

.mf-Datei

Bitmap (Speicher)

PCL-Formatierer PCX-

VGA-

[figure] [figure]

[figure]

[figure]

PCL-Datei PCX-Datei Monitor

[figure]

Abbildung 1: Modularer Aufbau von hp2xx und interner Datenfluß.

3 Optionen

Der allgemeine Programmaufruf lautet:

     hp2xx [Optionen] [Quelldatei(en)]

Tabelle 1 faßt alle Optionen zusammen und ist zum raschen Nachschlagen gedacht. Optionale Längenangaben werden stets in mm getroffen (Ausnahme: -p). Die folgenden Abschnitte beschreiben die Optionen etwas genauer und geben Beispiele.

3.1 Kontrolle der Bildmaße

Absolute Größenangaben und Translationen im HPGL-Code spielen keine Rolle. hp2xx ermittelt das Fenster der verwendeten Plotterkoordinaten und bildet es auf ein Rechteck mit default-Höhe 100 mm ab. Die Wunschhöhe wird mit der Option -h angegeben.

Normalerweise wird das Verhältnis Höhe/Breite aus den HPGL-Koordinaten übernommen. Es kann auf Wunsch mit -a verändert werden.

Aus der gegebenen Bildhöhe und dem ermittelten Quotienten Höhe/Breite folgt die Bildbreite. Mit -w kann alternativ die Bildbreite vorgegeben werden. Eventuelle Angaben von -h werden dann ignoriert.

Für Serien gleichskalierter Bilder ist es wichtig, Bilder mit konstantem Maßstab erzeugen zu können, auch wenn die Motive die Ränder des Bildfensters nicht im-

Option Format Default  Kurzbeschreibung

Allgemeine Optionen:

-f  char *  Name der Ausgabedatei (default: stdout)
-m  char * pcl  Ausgabe-Modus. Gültig: atari, mf, pcl, pcx, ps, (vga)
-p  int  1  Dicke der Stiftspitze (pensize). Einheit:

PCL,PCX: [dots], mf: [1/10 mm]. Gültig: 1-4

-q  off  (Quiet). Diagnosemeldungen ausschalten.
-r  double 0.0  Rotationswinkel [Grad]. -r90 erzeugt Querformat.
-s  char * hp2xx.swp Name der swap-Datei

Kontrollen der Bildmaße:

-a  double 1.0  Aspect-Faktor (> 0), korrigiert Verhältnis Seite/Höhe.
-h  double 100  Höhe (height) [mm] des Bildes
-w  double -  Breite (width) [mm] des Bildes. Hat Vorrang vor -h
-x  double -  Max. linker Rand der (rotierten) HPGL-Koordinaten
-X  double -  Min. rechter Rand der (rotierten) HPGL-Koordinaten
-y  double -  Max. unterer Rand der (rotierten) HPGL-Koordinaten
-Y  double -  Min. oberer Rand der (rotierten) HPGL-Koordinaten

Kontrolle der Rasterung:

-d  int  75  DPI-Wert für x-Richtung (oder x- und y-Richtung)
-D  int  75  Separater DPI-Wert für y-Richtung

Reine PCL-Optionen:

-F  off  Seitenvorschub (FormFeed) an das Dateiende setzen
-i  off  Initialieren des Druckers vor der Grafik-Ausgabe
-S  off  (Deskjet) Spezial-Kommando benutzen
-o  double 0.0  Linken Rand (x offset) [mm] einfügen
-O  double 0.0  Oberen Rand (y offset) [mm] einfügen
-d  (s.o.)  Hier nur 300, 150, 100, 75 gültig!
-D  (s.o.)  Hier ungültig!

Reine VGA-Optionen unter DOS:

-V  int  18  VGA mode byte (dezimal). Für SuperVGA-Karten
-W  int  640  VGA pixel width (Zahl horiz. Pixel des Grafikmodus)
-H  Hilfstext anzeigen.

Tabelle 1: Liste aller Optionen (ggf. mit Parametern), nach Sachgebieten sortiert mer erreichen. Mit den Optionen -x, -X, -y, -Y ist es möglich, ein konstantes, umschreibendes Rechteck in Plotterkoordinaten anzugeben. Die Diagnosedaten eines Probelaufs mit hp2xx über alle HPGL-Dateien einer Serie helfen, ein geeignetes Rechteck zu finden. ACHTUNG: Wird das Fenster zu eng gewählt, überschreibt hp2xx die Voreinstellungen unter Verlust der beabsichtigten Skalierung. Diagnosedaten beachten!

Bei einigen Zielformaten kann das Ausgaberechteck verschoben werden. Ohne weitere Option wird es in die obere linke Ecke des Ausgabemediums plaziert.

3.2 Allgemeine Optionen

Die Wahl des Ausgabeformats wird mit -m getroffen. In der Regel lenkt man die Ausgaben mittels -f statt nach stdout in eine Datei. Beim Atari-Modus darf kein Suffix angegeben werden!

Sämtliche HPGL-Vektoren können noch vor ihrer Speicherung einer Drehtransformation um einen beliebigen Winkel unterzogen werden (Option -r). Insbesondere für die Erzeugung von Bildern im Querformat ist dies praktisch.

Sollte hp2xx seine interne ”bitmap“ auslagern müssen, so geschieht dies in die Datei hp2xx.swp im aktuellen Verzeichnis. Wenn dies nicht erwünscht ist, kann mit -s ein anderer Dateiname (incl. Laufwerk und Pfad) angegeben werden, z.B. bei Vorhandensein einer RAMdisk oder zur Vermeidung der Auslagerung auf Floppy-Disk.^{1}

Im Filterbetrieb können die Diagnosen von hp2xx stören, auch wenn sie konsequent nach stderr ausgegeben werden. Sie lassen sich mit -q ausschalten.

Bei hoher Auflösung sind Linien aus einzelnen Pixeln oft zu dünn. Die simulierte Stiftspitze kann ggf. mit -p auf ein Pixelquadrat mit Kantenlänge 1–4 Pixel vergrößert werden. Bei den Vektorformaten werden zur Zeit nur dieselben Angaben (also 1,2,3,4) akzeptiert, obwohl hier beliebige Werte denkbar sind. Die Angabe erfolgt dann in zehntel(!) Millimeter. Hinweis: Bei Bedarf kann eine mf- oder ps-Datei editiert werden. Die Stiftdicke (steht in der Nähe des Dateianfangs) läßt sich dann beliebig ändern.

3.3 Kontrolle der Rasterung

Rasterformate können in verschiedenen Punktdichten erzeugt werden. Voreingestellt ist 75 dots/inch (DPI), die Voreinstellung der PCL-Drucker. Mit -d kann sie verändert werden, wobei für PCL nur die Werte 75, 100, 150 und 300 zulässig sind. Bei PCX können beliebige Angaben erfolgen.

Für Spezialanwendungen ist es möglich, in y-Richtung eine eigene Punktdichte zu spezifizieren (Option -D). Diese Option ist eigentlich erst für spätere Versionen von hp2xx gedacht, die Laserdrucker mit z.B. 300×600 DPI oder NEC Nadeldrucker mit 360×180 DPI unterstützen können soll.

1Die temporäre Datei zur Aufnahme der erkannten HPGL-Vektoren wird davon nicht beeinflußt.

Ihr Name wird von hp2xx nicht spezifiziert; vielmehr wird sie mittels eines maketemp()-Aufrufs erzeugt. Ihr Ort und Name sind Sache des Compilers.

Beim Atari-Modus werden in der Regel keine absoluten Bildmaße gewünscht, sondern Vielfache eines Bildschirminhalts. Hier hilft ein wenig Rechnen: Der Atari-ST Bildschirm bietet 640 × 400 Pixel Auflösung. Bei 75 dots/inch und 25.4 mm/inch sind für 400 Zeilen also rund 135.3 mm Bildhöhe (75 · 135/25.4) anzugeben (-h 135.3). Für die Bildbreite gilt Ähnliches. Bitte beachten: Reicht ein Bildschirminhalt nicht aus, schreibt hp2xx das restliche Bild in mehrere Dateien, deren Suffix von .000 bis .999 reichen kann, wobei .zzs aus einem zweiziffrigen Zeilenindex und einer Spaltenziffer besteht. Die größte zulässige Grafik enthält demnach 6400 × 40000 Punkte, was bei 300 DPI einer Fläche von 21.33 × 133.3 cm^{2} entspricht und hoffentlich eine Weile reicht.

3.4 PCL-Optionen

Ohne Optionen wird das Bild linksbündig und ab der aktuellen vertikalen Position ausgegeben. Ein Seitenvorschub erfolgt nicht. Dadurch ist es möglich, mehrere Abbildungen auf einer Papierseite auszugeben. Mit Option -o kann ein linker Rand, mit -O ein oberer Rand erzeugt werden. Flag -i initialisiert den Drucker vor Beginn des Bildes, Flag -F verursacht einen Seitenvorschub am Bildende. Es gibt ein HP Deskjet-spezifisches Kommando, das sich mit Flag -S einschalten läßt.

3.5 PostScript-Besonderheiten

Im Gegensatz zu PCL-Druckern ist der Bezugspunkt von PostScript-Druckern die untere linke Ecke des Mediums. hp2xx setzt das Bild allerdings in die obere linke Ecke. Dazu wird intern angenommen, daß eine DIN A4-Seite im Hochformat (297mm) bedruckt wird. Da PS-Drucker keinerlei Rand lassen, wird in der Regel die Benutzung der Optionen -o, -O unumgänglich sein. Sie beziehen sich weiterhin auf den linken und oberen Rand.

PostScript besitzt mehrere Arten, Linien zu zeichnen. Voreingestellt sind Linien mit abgerundeten Enden. Sollte das nicht erwünscht sein, können PostScript-Kundige am Anfang der Ausgabedatei nach dem Kommando ”setlinecap’ßuchen und die eigenen Wünsche einbauen. Auch eigene Liniendicken können so eingetragen werden.

3.6 VGA-Optionen (nur DOS)

Im VGA-Modus werden viele Optionen ignoriert. Insbesondere die Punktdichte wird automatisch gesetzt. Es werden quadratische Pixel (Kreis bleibt Kreis!) und ein Höhe/Breite-Verhältnis von 4/3 unterstellt.

Für eine möglichst universelle Unterstützung vieler Grafikkarten wird das Bild ausschließlich via BIOS-Aufrufe erzeugt. Voreingestellt ist der Standard-VGA Modus 18 (hex 12), also 640×480 APA. Durch Überschreiben des Modusbytes mit -V und Angabe der neuen Pixelbreite mit -W können auch höherauflösende Modi verwendet werden. Empfohlen wird der 800×600-Modus, falls vorhanden.

ACHTUNG: Die Aktivierung von Grafikmodi, für die der angeschlossene Monitor nicht geeignet ist, kann den Monitor beschädigen! Der Autor übernimmt keinerlei Haftung für mit hp2xx verursachte Schäden irgendwelcher Art.

3.7 Beispiele

     hp2xx -m vga demo.hp

VGA-Ausgabe, 640×480 APA (nur DOS)

     hp2xx -m vga -p2 -V41 -W800 demo.hp

VGA-Ausgabe, 2×2 Pixel Stiftspitze, 800×600 APA-Modus einer bekannten VGA-Karte mit ET3000-Chip (nur DOS)

     hp2xx -m pcx -f demo.pcx -p3 -d300 demo.hp

PCX-Datei ”demo.pcx“ erzeugen, 3×3 Pixel Stiftspitze, 300 DPI

     hp2xx -p2 -d150 -q -o30 -O50 -F demo.hp | lpr

PCL-Ausgabe in den Spooler (UNIX), 2×2 Pixel Stiftspitze, 150 DPI, keine Diagnose, 30 mm linker und 50 mm oberer Rand, FormFeed am Ende.

4 Entwicklung, Verfügbarkeit, Einschränkungen

Das Programm hp2xx baute auf D. Donath’s HPtoMF auf, ging aber bald eigene Wege. Es ist vollständig in C geschrieben, leicht portierbar und wegen seiner Modularität einfach zu erweitern. Es wurde ausgiebig unter DOS und SUN-OS 4.x getestet und besonders häufig in Verbindung mit emTEX im PCX-Modus eingesetzt.

Sein größter Nachteil ist der kleine HPGL-Wortschatz. Nur solche HPGL-Kom-mandos, die leicht in Vektoren umgesetzt werden können, werden verstanden. Insbesondere werden Schraffuren, Kreise/Ellipsen und auch HPGL-Textausgabe nicht unterstützt. Die Erfahrung zeigte bisher aber, daß die meisten HPGL-Quellen, die auch andere Ausgabeformate unterstützen, sich auf eben diesen ”kleinsten gemeinsamen Nenner“ beschränken (siehe Einleitung).

Bisher wurde hp2xx auf DOS, Unix, VAX/VMS und ATARI portiert. Es ist beabsichtigt, die Dokumentation und die ausführbaren Programme für alle vier Rechnerfamilien (Unix: vorläufig nur SUN-OS 4.x, Sparc) auf den bekannten Servern zu hinterlegen.

Wenn hp2xx Verbreitung findet und die noch nicht entdeckten ”Kinderkrankheiten“ sowie Änderungswünsche (durch Mitteilung von Anwendern – ja, auch Sie!) überwunden hat, wird auch der Quellcode verteilt. Hiermit verspreche ich, den Quellcode spätestens dann freizugeben, wenn ich die Programmwartung einstelle! Wenn der Quellcode bereitgestellt wird, dann unter den Bedingungen der Free Software Foundation, also den Regeln von Richard Stallman’s GNU-Projekt.

Literatur

[Don90] Dirk Donath. HPtoMF — Ein Konverter von HPGL in METAFONT-Format. TEXnische Komödie, 2(3):19–22, 1990.

[Sow90] Friedhelm Sowa. Integration of Graphics into TEX. TUGboat, 12(1):58, 1990. TEX90 Conference Proceedings.