\language=1
\magnification=\magstep1
\input nice
%%\input amiga	% amiga.tex is in the formatfile
\hsize = 5 in
\vsize = 7.7 in
\voffset = 0.4in

\def\mynum#1{\ifnum #1<10 0\the#1\else \the#1\fi}
\def\mymonth#1{\ifcase#1 \or Januar \or Februar \or M\"arz \or April
   \or Mai \or Juni \or Juli \or August
   \or September \or Oktober
   \or November \or Dezember \fi}

\def\LaTeX{{\rm L\kern-.36em\raise.3ex\hbox{a}\kern-.15em
    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
\def \DVIprint {DVIprint}
\def \ShowDVI {ShowDVI}
\def \spec {SpecialHost}

\book
\contentslevel=3
\contfill={\dotfill}
\contskip=3pt
\let\scstyle=\bf
\font\subsubsectiontitlefont=cmr10 scaled \magstep1

\def\showimage#1#2#3#4{
\hbox to #2{\vbox to #3{\vss
 \special{ifffile=#1 #4  hsize=#2 vsize=#3}
}\hss }
}

\def\showps#1#2#3#4{
\hbox to #2{ \vbox to #3{\vss
 \special{psfile=#1 #4 hsize=#2 vsize=#3}
}\hss }
}

\titlepage
\vskip 0.7in
\title{\spec{}, ein}
\title{Programm zum Auswerten}
\title{von special-Befehlen}
\title{für den Amiga}
\bigskip
\release{Version 1.18}
\smallskip
\release{vom}
\release {\mynum{\day}. \mymonth{\month}\mynum{\year}}
\bigskip
\author{von}
\author{Georg Heßmann \& Olaf Barthel}
\vfill
\abstract{
  \spec{} ist ein Hilfsprogramm für den Previewer \ShowDVI{} und den
  Druckertreiber \DVIprint{}. Es wertet die special-Befehle aus, die
  die Treiber dem Programm übergeben. Es ist in der Lage,
  IFF-ILBM-Bilder, jegliche über die {\tt datatypes.library}
  ladbare Bilder und PostScript-Dokumente in den \TeX-Text einzubinden,
  sowie TPIC Specials auszuwerten.
}
\vskip 1.2in
\endtitlepage

\medskip
\plainsection{Inhaltsverzeichnis:}
\medskip
\makecontents
\newpage

\section{Copyright und ähnliches}

Das Programm \spec{} ist ``freely distributable copyrighted software''.
Das heißt, jeder darf es sich kopieren und verwenden, das
Copyright bleibt aber vollständig bei uns (Georg Heßmann \& Olaf
Barthel).

Das Programm darf auch nur unverändert weitergegeben werden.

Das Programm darf ohne unsere ausdrückliche Genehmigung nicht
kommerziell verkauft werden. Als PD-Software vertrieben darf der Preis
5,- DM pro Diskette nicht überschreiten.

Es darf auch nur in vollständiger und unveränderter Form weitergegeben
werden.

Diese Anleitung ``{\tt spec.tex}'' ist ebenfalls Copyright Georg
Heßmann \& Olaf Barthel und darf nicht kommerziell vervielfältigt
werden. Man darf sie sich ausdrucken und auch kopieren, man darf sie
aber {\bf nicht} für Geld weitergeben.

Für weitere Erklärungen siehe das {\tt README}-Dokument.

Einzelne Dithering-Matrizen werden mit Erlaubnis von Wolf
Faust verwendet.

\section{Allgemeines über \spec{}}

Jeder, der auch nur ein wenig mit \TeX{} gearbeitet hat, kennt dessen
gravierendsten Nachteil: die fehlende Möglichkeit, Graphiken zu
erstellen und in den Text einbinden zu können. Es gibt zwar Ansätze,
dies \TeX{} beizubringen (in La\TeX{} oder PIC\TeX{}), aber sie sind
zum Scheitern verurteilt, wenn die Graphiken auch nur etwas
komplizierter werden.

Nur mit einem Trick kann man diese Einschränkung umgehen:
die Verwendung des \\special-Befehls.
Glücklicherweise wurde im DVI-Dateiformat
eine Möglichkeit vorgesehen, auch nicht Standardisiertes in die
DVI-Datei aufzunehmen. Dazu dient der \\special-Befehl. Alles was
in geschweiften Klammern diesem Befehl folgt, wird unverändert
in die DVI-Datei übernommen. So können treiberabhängige
Anweisungen am \TeX-Programm vorbei in die DVI-Datei gelangen.
Der jeweilige Treiber kann den \\special-Befehl auswerten und
zum Beispiel eine Graphik in die aktuelle Seite einbinden.

Der Nachteil dieser Methode soll aber nicht verschwiegen werden.
Sobald man mit \\special-Befehlen arbeitet, ist die DVI-Datei nicht
mehr portabel. Das heißt, man kann diese Datei nicht mehr
auf beliebige Rechner übertragen
und erwarten, daß die Ausgabe dort genau so aussieht, wie auf
dem eigenen Rechner. So gravierend ist diese
Einschränkung allerdings auch nicht, da im
schlimmsten Fall die \\special-Befehle einfach
ignoriert werden und der Text eben ohne Graphik
ausgedruckt wird.

Wie arbeitet \spec?
\parwithoutskip
\spec{} nutzt die Möglichkeit des Multitasking und des
Message-Transfers des Amiga aus, um auf möglichst flexible Art und
Weise die \\special-Befehle auszuwerten. \spec{} wird parallel zu dem
jeweiligen Treiber (\ShowDVI{} oder \DVIprint) gestartet und wartet
auf eine hereinkommende Meldung des Treibers. Trifft der Treiber bei
der Auswertung des DVI-Files auf einen \\special-Befehl, so übergibt
er diesen unverändert dem \spec-Programm zusammen mit ein paar
weiteren Informationen, wie z.B. der derzeitigen Auflösung des Bildes.

Die Aufgabe des \spec{}-Programms ist es, die Message
des Treibers abzuholen und den \\special-Befehl
auszuwerten. Wird in dem Befehl der
Name eines Bildes angegeben, so lädt das Programm
das angegebene Bild und paßt es der eingestellten
Auflösung an (verkleinert oder vergrößert es).
Danach übergibt es die so erzeugte Bitmap dem
Treiber. Dieser muß sie nur noch in seine eigene
Bitmap, in der er eine ganze \TeX-Seite hält, einkopieren.

Warum aber ein eigenes Programm für die Auswertung des \\special-Befehls?
\parwithoutskip
Diese Lösung ist meiner Meinung nach erheblich flexibler, als die
gesamte Auswertung des \\special-Befehls in jeden Treiber einzubauen.
Dadurch, daß eine fest definierte Schnittstelle zwischen den
Treibern und dem \spec{}-Programm existiert, kann man die Programme
alle unabhängig voneinander weiterentwickeln, ohne auf größere
Schwierigkeiten zu stoßen.

So kann man zum Beispiel das Format des \\special-Befehls umdefinieren
oder neue Fähigkeiten in das \spec{}-Programm einbauen, wie z.B. die
Auswertung von Vektorgraphiken, ohne auch nur eine
Winzigkeit in den Treibern ändern zu müßen.
Oder falls ich etwas in den Treibern ändere und jemand sich
ein eigenes \spec{}-Programm geschrieben hat, sollten keine
Probleme bei der Zusammenarbeit dieser Programme auftreten.


\section{Der Aufruf von \spec{}}

\spec{} läßt sowohl von der Shell als auch von der Workbench
aus aufrufen. Beim Aufruf können dem Programm entweder über
Piktogramm-Merkmale (Icon-Tooltypes) oder Befehlszeilenargumente
folgende Parameter übergeben werden:

\medskip
\staggered{\tt USESCREEN }

\key {\tt TRANSFER} \spec{} kann \ShowDVI{} und \DVIprint{}
auf verschiedene Arten ein Bild übermitteln, bzw. statt
eines Bildes nur einen Platzhalter übertragen. Mit dem
Schlüsselwort {\tt TRANSFER} muß einer der Parameter
{\tt FILE} (= das Bild wird in einer Datei über den
Umweg über die Festplatte, Diskette, etc. übertragen),
{\tt MEMORY} (= das Bild wird im Speicher des Amiga
aufgebaut und übertragen) oder {\tt NONE} (= es wird
kein Bild, sondern stattdessen ein Platzhalter in Form
eines leeren Bildes übertragen). Als Beispiel:
{\tt TRANSFER=MEMORY}

\key {\tt RENDER} Hiermit läßt sich bestimmen, ob das
Programm Bilder unverändert an \ShowDVI{} und \DVIprint{}
weitergeben, oder ob ein Rahmen um sie herum gezeichnet
werden, bzw. eine schwarze Fläche gezeichnet werden
soll. Zum Schlüsselwort {\tt RENDER} muß einer der
Parameter {\tt FRAME} (= ein Rahmen wird um das Bild
gezeichnet), {\tt CLEAR} (= eine schwarze Fläche wird
statt des Bildes gezeichnet) oder {\tt PLAIN}
(= das Bild wird nicht verändert) angegeben werden.
Als Beispiel: {\tt RENDER=PLAIN}

\key {\tt BASEDPI} Sofern eine Bilddatei keine Informationen
bereitstellt, in welcher Auflösung es gezeichnet wurde,
wird auf den hier angegebene Parameter zurückgegriffen.
Näheres zu seiner Funktion ist unter der Beschreibung
der Bedienungselemente der Benutzeroberfläche nachzulesen.
Als Beispiel: {\tt BASEDPI=100}

\key {\tt INVERT} Dieser Parameter bewirkt, daß jedes
Bild nach der Umrechnung invertier wird (Weiß wird
Schwarz und umgekehrt).

\key {\tt USESCREEN} Wird dieser Parameter angegeben,
versucht \spec{} sein Ausgabefenster auf dem Bildschirm
von \ShowDVI{} zu öffnen. Ist dies jedoch nicht zu machen,
wird das Fenster auf dem Workbench-Bildschirm geöffnet.

\key {\tt NOGUI} Üblicherweise verwendet \spec{} eine
ausgefeilte Benutzeroberfläche, die allerdings
nur dann zur Verfügung steht, wenn die benötigten
Komponenten des MUI-Pakets installiert sind. Ist dies
nicht der Fall, wird auf eine vereinfachte Oberfläche
zurückgeschaltet, in der das Programm lediglich seine
Meldungen ins Ausgabefenster schickt und durch
Drücken der Tastenkombination {\tt Control+C}
beendet werden kann.
\endstaggered

\spec{} liest {\bf erst} die Konfigurationsdatei und
wertet {\bf danach} die über Kommandozeile/Tooltypes
übergebenen Parameter aus.

\section{Der Aufbau des Fensters von \spec{}}

Hinweis: Die folgende Beschreibung gilt nur für den Fall, daß
die Benutzeroberfläche {\bf nicht} über den Schalter
{\tt NOGUI} abgeschaltet wurde.

Das Fenster von \spec{} ist in drei Teile unterteilt:

\centerline{\showimage{Kontrollfeld}{10cm}{5cm}{mode=ordered}}

Der obere Teil dient der Eingabe. Dort sind alle Kontrollfelder zu
finden, mit denen das Programm gesteuert wird.

Der mittlere Teil ist als Kontrollfenster für die Aktivitäten des
Programms gedacht. Dort wird mitprotokolliert, was das Programm gerade
macht. Unter der Liste befindet sich eine Füllanzeige, mit der
das Fortschreiten bestimmter Arbeitsschritte dokumentiert wird.

Der untere Teil enthält Funktionstasten, mit denen einzelne
Programmfunktionen direkt gesteuert werden können, die nicht
die Bearbeitung von \\special-Befehlen betreffen.

\section{Die Bedienung von \spec{}}

Das Programm wird vollständig über Gadgets gesteuert.
Dies sind:

\medskip
\staggered{\tt ShowDVI to front }

\key {\tt Transfer} \spec{} kann \ShowDVI{} und \DVIprint{}
auf verschiedene Arten ein Bild übermitteln, bzw. statt
eines Bildes nur einen Platzhalter übertragen. Der Schalter
{\tt Transfer} kann auf die folgenden Werte gestellt werden:

\medskip
\staggered{\tt Image in memory }
\key {\tt Image in memory} Das Bild wird im Speicher des
Amiga aufgebaut und direkt an \ShowDVI{}, bzw. \DVIprint{}
übertragen. Dies hat zum einen den Vorteil, daß nach dem
Umrechnen des Bildes kein Zugriff auf Festplatte oder Diskette
mehr stattfindet, aber auch den Nachteil, daß ein jedes Bild
beim erneuten Anzeigen noch einmal neu gelesen und umgerechnet
werden muß, selbst wenn sich seit dem letzten Anzeigen
weder Bild noch Auflösung geändert haben.

\key {\tt Image on disk} Ein einmal umgerechnetes Bild
wird in eine Datei geschrieben für den Fall, daß es noch einmal
gebraucht wird. Auf diese Weise muß ein Bild nicht jedesmal
neu umgerechnet werden, wenn es angezeigt werden soll, aber
sich weder Bild noch Auflösung geändert haben.

\key {\tt No image} Statt eines Bildes wird ein Platzhalter
übergeben, der einem leeren Bild entspricht. Der Platzhalter
hat dieselbe Größe wie das Bild, das nicht gezeigt wird.

\endstaggered

\key {\tt Rendering} Hier läßt sich einstellen, ob das an
\ShowDVI{} oder \DVIprint{} zu schickende Bild verändert
werden soll:

\medskip
\staggered{\tt No modification }

\key {\tt No modification} Das Bild wird nicht verändert.

\key {\tt Draw a frame} Das Bild wird mit einem dünnen
Rahmen umgeben.

\key {\tt Clear image} Das Bild wird durch eine schwarze
Fläche ersetzt.

\endstaggered

\key {\tt Invert} Ist dieser Schalter aktiv, so wird jedes
Bild vor der Übertragung an \ShowDVI{} oder \DVIprint{}
invertiert (Schwarz wird Weiß und umgekehrt).

\key {\tt Base DPI} Sofern eine Bilddatei (PostScript-Dokumente
sind hiervon nicht betroffen) keine Informationen über die
Auflösung des Bildes enthält, wird stattdessen der hier angegebene
Wert verwendet.

\key {\tt Jump to ShowDVI} Drückt man auf diesen Knopf,
wird versucht, das Ausgabefenster auf den Bildschirm
des \ShowDVI{}-Programmes zu verlegen. Ist dies nicht
zu machen, wird das Fenster auf dem Workbench-Bildschirm
geöffnet.

\key {\tt ShowDVI to front} Wird dieser Schalter
betätigt, wird das \ShowDVI{}-Programm -- sofern es gerade
läuft -- in den Vordergrund gebracht und aktiviert.

\key {\tt Clear list} Dieser Schalter löscht die
darüber befindliche Liste von Nachrichten.

\endstaggered


\section{Das Menü}

Bestimmte Funktionen von SpecialHost können auch über ein Menü
aufgerufen werden.

\medskip
\staggered{\tt Use public screen }
\key{\tt About...} Gibt ein paar Zeilen Copyright-Text aus.
\key{\tt Load settings} Liest das Konfigurationsfile erneut ein.
	Setzt also alles wieder in den Urzustand zurück.
\key{\tt Save settings} Speichert die derzeitige Konfiguration in
	eine Datei ab.
\key{\tt Use public screen} Ist diese Funktion aktiv, versucht
	\spec{} das Ausgabefenster auf dem Bildschirm von \ShowDVI{}
	zu öffnen.
\key{\tt Quit} Beendet das Programm.
\endstaggered

\section{Das Format des special-Befehls}

Damit die \TeX-Treiber \ShowDVI{} und \DVIprint{} das Programm
\spec{} nach einzubindenden Bildern abfragen, müssen
diese wissen, nach was sie fragen sollen. Dies steht im
\TeX-Text, die Anweisung ist der \\special-Befehl. Alles was bei

\centerline{{\tt \\special\{}beliebiger Text{\tt \}}}

dem \\special-Befehl zwischen den geschweiften Klammern steht, wird
vom \TeX-Programm ignoriert und unverändert zum Treiber durchgereicht.
Trifft nun \ShowDVI{} oder \DVIprint{} auf solch einen Befehl, so wird
überprüft, ob ein \spec{}-Programm im Hintergrund läuft. Ist dies
nicht der Fall, so wird der \\special-Befehl einfach ignoriert.
Existiert das \spec-Programm, so bekommt dieses den vollständigen
Befehl per Nachricht übermittelt.

Es ist also das \spec-Programm, welches den Special-Befehl auswertet
und die Bedeutung der einzelnen Wörter des Befehls festlegt. Da dieser
Special-Befehl in keiner Weise standardisiert ist, kann sich das
Format von Treiber zu Treiber ändern.

Das vorgestellte Format gilt also nur für diese Kollektion von
Treibern und ist auch hier noch nicht endgültig festgelegt. In neueren
Versionen werden sicherlich noch Funktionen hinzukommen. Es wird aber
auf Abwärtskompatibilität Wert gelegt, so daß man ohne Probleme auf
neuere Versionen umsteigen kann.

Das derzeitige Format der \\special-Befehle:

\centerline{\tt \\special\{anw1 anw2 anw3\}}

Die einzelnen Anweisungen innerhalb der Klammern werden mit ein oder
mehreren Leerschritte voneinander getrennt.

Eine Anweisung wiederum besteht aus einem Schlüsselwort und einem
Wert, so daß eine genauere Betrachtung des \\special-Befehle folgendes
Format hervorbringt:

\centerline{\tt \\special\{key1=val1 key2=val2 key3=val3\}}

Zwischen Schlüsselwort (key) und Wert (value) muß immer ein
Gleichheitszeichen stehen.

Als Schlüsselwörter gibt es bisher:

\medskip
\staggered{\quad\tt patchcolours }
\key{\quad\tt ifffile} Definiert den Dateinamen eines zu ladenden
Bildes.
\key{\quad\tt psfile}  Definiert den Dateinamen eines zu ladenden
PostScript-Dokumentes.
\key{\quad\tt psinitfile} Dient zum Ändern des Namens der
Datei, die zum Initialisieren des PostScript-Interpreters
verwendet wird. Standardmäßig wird {\tt TeX:ps/init.ps}
verwendet.
\key{\quad\tt psinitstring} Ist ein bis zu 256 Zeichen langer
PostScript-Befehl, der nach dem Aufruf der
Initialisierungsdatei des PostScript-Interpreters ausgeführt
wird.
\key{\quad\tt hoffset} Gibt den horizontalen Versatz des Bildes an.
\key{\quad\tt voffset} Gibt den vertikalen Versatz des Bildes an.
\key{\quad\tt hsize} Legt die horizontale Größe des Bildes fest,
\key{\quad\tt vsize} Legt die vertikale Größe des Bildes fest.
\key{\quad\tt scale} Legt den Faktor fest, um den das Bild
in der Größe verändert werden soll.
\key{\quad\tt hscale} Legt den horizontalen Vergrößerungs-/Verkleinerungsfaktor fest.
\key{\quad\tt vscale} Legt den vertikalen
Vergrößerungs-/Verkleinerungsfaktor fest.
\key{\quad\tt mode} Legt die Methode fest, mit der das Bild
in Schwarz/Weiß umgerechnet werden soll.
\key{\quad\tt threshold} Gibt den prozentualen Schwellwert für das Schattierungsverfahren
		``Blue noise'' an. Gebräuchliche Werte bewegen sich zwischen
		30\% und 50\%.
\key{\quad\tt red} Legt den Rot-Anteil des Farbbildes fest. Damit kann der
		Rot-Anteil des Bildes verstärkt oder vermindert werden.
\key{\quad\tt green} Legt den Grün-Anteil des Farbbildes fest.
\key{\quad\tt blue} Legt den Blau-Anteil des Farbbildes fest.
\key{\quad\tt bright} Definiert die Helligkeit für das Farbbild.
\key{\quad\tt contrast} Definiert den Kontrast für das Farbbild.
\key{\quad\tt gamma} Definiert die ``Gamma-Korrektur'' für das Farbbild.
\key{\quad\tt transfer} Bestimmt, wie ein Bild übertragen werden soll.
		{\tt transfer=memory} überträgt es im Speicher des
		Amiga, {\tt transfer=file} überträgt es im Speicher des
		Amiga, greift aber im Bedarfsfall auf ein auf Diskette/Festplatte
		zwischengespeichertes Bild zurück und {\tt transfer=none} überträgt
		statt des Bildes einen Platzhalter. Wird der {\tt transfer} Parameter
		nicht angegeben, werden die aktuellen Programmeinstellungen verwendet.
\key{\quad\tt render} Legt fest, ob das Bild so wie es ist, übertragen wird,
		oder ob es auf eine bestimmte Art und Weise verändert werden
		soll. {\tt render=plain} verändert das Bild nicht,
		{\tt render=frame} zeichnet einen dünnen Rahmen um das Bild
		und {\tt render=clear} zeichnet statt des Bildes eine schwarze
		Fläche. Wird der {\tt render} Parameter nicht angegeben, werden
		die aktuellen Programmeinstellungen verwendet.
\key{\quad\tt basedpi} Sofern eine Bilddatei keine Informationen bereitstellt,
		in welcher Auflösung es gezeichnet wurde, wird auf den hier angegebenen
		Parameter zurückgegriffen (z.B. {\tt basedpi=100}). Fehlt der Parameter
		{\tt basedpi}, werden die aktuellen Programmeinstellungen verwendet.
\key{\quad\tt invert} Mit diesem Schalter läßt sich das Bild vor der Übertragung noch
		invertieren. Mit {\tt invert=on} wird die Invertierung aktiviert, mit
		{\tt invert=off} wird sie abgeschaltet. Fehlt der Parameter
		{\tt invert}, werden die aktuellen Programmeinstellungen verwendet.
\key{\quad\tt patchcolours} Bilder, die mit den alten
		IFF-Routinen (1985-1987) geschrieben wurden, wie z.B. von {\it
		DeluxePaint I-III\/} enthalten keine absolut korrekten
		Farbinformationen. So hat die Farbe Weiß statt des RGB-Tripels
		{\tt FF:FF:FF} den Wert {\tt F0:F0:F0}. Aus
		der weißen Farbe wird so ein blasses Hellgrau. Hierdurch
		können krasse Fehler beim Umrechnen der Farbwerte entstehen.
		Der Parameter {\tt patchcolours} sorgt dafür, daß eine solche
		defekte Farbpalette im Bedarfsfall angepaßt wird.
\key{\quad\tt ditheropt} Eine Zahl, die die Größe der von den
Schattierungsroutinen zu benutzende Matrix beeinflußt. Gegenwärtig
kann dies entweder 4 oder 8 sein. Je größer der Wert, desto
kleiner die Matrix. Dies hat seinen Sinn, wenn Matrizen, die
große Strukturen im Bild erzeugen, auf kleine Bilder
angewendet werden, wobei viele Bildinformationen verlorengehen
können. Reduziert man die Größe der Matrix, so schränkt dies
zwar die Anzahl der darstellbaren Farbschattierungen ein, aber
es werden nicht ganz soviele Bilddetails verschluckt. Bisher
unterstützen nur die folgenden Schattierungsverfahren die
Definition der Matrizengröße: {\tt fwdbrick}, {\tt bckbrick},
{\tt halftone} und {\tt spiraldot}.
\endstaggered

Bei {\tt ifffile} und {\tt psfile} ist als Wert der Name einer Datei
anzugeben. Dazu ist zu beachten, daß die jeweils aktuelle Schublade
jene ist, in welcher das \spec-Programm gestartet wurde. Aus diesem
Grund sollte jeder Dateiname immer den {\bf kompletten} Pfadnamen
enthalten.

Über die beim Programm {\tt dvips} mitgelieferten
Formatdateien {\tt epsf.sty} und {\tt epsf.tex} eingebundenen
EPSF-Dateien werden von \spec{} direkt gelesen und bearbeitet.

Das Programm lädt alle bekannten IFF-ILBM-Formate (2..256 Farben,
HAM, HAM8, 8 Bit Graustufen, 12..24 Bit Echtfarben). Steht die
{\tt datatypes.library} zur Verfügung, die Bestandteil der
Workbench 3.0 ist, werden Bilder, die nicht im IFF-ILBM-Format
vorliegen, auf diesem Weg gelesen. Dies setzt natürlich voraus,
daß ein jeweils passendes Lademodul zur Verfügung steht. Zum
Zeitpunkt der Erstellung dieses Dokuments existierten frei
verfügbare Lademodule für die Formate {\tt GIF}, {\tt JPEG}, {\tt PCX},
{\tt MacPaint} und {\tt Windows Bitmap}.

Statt realer Dateien kann auch die Zwischenablage (clipboard)
ausgelesen werden (Hinweis: die zu lesenden Daten müssen dabei
zwingend im IFF-ILBM-Format vorliegen). Hierzu muß man
als Parameter {\tt ifffile=clipboard:<Nummer>} angeben. Die
Nummer gibt an, welcher der 256 verschiedenen Kanäle der
Zwischenablage ausgelesen werden soll (z.B. {\tt clipboard:1}).
Die in spitzen Klammern stehende Nummer kann entfallen, es wird
dann Kanal Nr. 0 ausgelesen, der standardmäßig vom Betriebssystem
benutzt wird.

Damit ein über das {\tt psfile}-Schlüsselwort angegebenes
PostScript-Dokument gelesen und ausgewertet werden kann, muß
die {\tt post.library} im System installiert sein. Bevor
das angegebene Dokument gelesen wird, ruft \spec{} im
Normallfall die Datei {\tt TeX:ps/init.ps} auf, die zur Initialisierung des
PostScript-Treibers gedacht ist (über den Special-Befehl kann
der Name der aufzurufenden Datei geändert werden). Sie dient u.a. dazu, die
Pfade zum Suchen der PostScript-Fonts einzustellen und sollte
vom Anwender vor dem ersten Probelauf konfiguriert
werden. Nähere Informationen hierzu sind der Dokumentation
des ``Post''-Paketes zu entnehmen.

Bei den Schlüsselwörtern {\tt hoffset}, {\tt voffset}, {\tt hsize} und
{\tt vsize} wird als Wert eine Dimensionsangabe verlangt. Diese
besteht aus einer reellen Zahl plus einer Einheitsbezeichnung.
Folgende Einheiten stehen zur Verfügung:

\medskip
\staggered{\quad\tt mm }
\key{\quad\tt pt} point (wird von \TeX{} verwendet)
\key{\quad\tt pc} pica $1 pc = 12 pt$
\key{\quad\tt in} inch $1 in = 72.27 pt$
\key{\quad\tt bp} big point $72 bp = 1 in$
\key{\quad\tt cm} centimeter
\key{\quad\tt mm} millimeter
\key{\quad\tt dd} didôt point $1157 dd = 1238 pt$
\key{\quad\tt cc} cicero $1cc = 12dd$
\endstaggered

Die Parameter der Schlüsselwörter {\tt vscale}, {\tt hscale}
und {\tt scale} legen den Faktor fest, um den das Bild in
der Größe verändert werden soll. Der Wert 0.5 entspricht
eine Halbierung der Größe, der Wert 2.0 eine Verdoppelung
der Größe.

Bei der Umrechnung eines Bildes in Schwarz/Weiß müssen die Farbwerte
jedes Punktes nach einem bestimmten Verfahren in Graustufen
umgerechnet werden. Dies geschieht, indem die Rot-, Grün-
und Blaukomponenten eines jeden Farbwertes mit bestimmten
Faktoren multipliziert, addiert und die Summe durch 100 geteilt
wird. Die Faktoren lassen sich über die Schlüsselwörter
{\tt red}, {\tt green} und {\tt blue} einstellen. Standardmäßig
werden die Parameter {\tt red=30 green=59 blue=11} verwendet, was
die Farbkomponenten ihren Helligkeitswerten entsprechend in die
Rechnung einfließen läßt. Die Summe der Faktoren darf 100 nicht
überschreiten, im Bedarfsfall werden die Werte entsprechend angepaßt.

Die Schlüsselwörter {\tt bright}, {\tt contrast} und
{\tt gamma} bewirken eine Veränderung des Bildes. Die
Parameter können sich im Bereich -100..100 bewegen,
der Wert 0 läßt das Bild unverändert. Während {\tt bright}
und {\tt contrast} Helligkeit und Kontrast des Bildes
jeweils linear verändern, wirkt sich der {\tt gamma}-Parameter
nicht-linear auf beide Eigenschaften aus. Ein Gamma-Wert größer als 0
hellt das Bild auf, ein Wert kleiner als 0 dunkelt es ab.

Dem Schlüsselwort {\tt mode} muß einer der Parameter {\tt bw},
{\tt fs}, {\tt burkes}, {\tt sierra}, {\tt jjn}, {\tt stevenson}, {\tt stucki},
{\tt bluenoise}, {\tt ordered}, {\tt random}, {\tt halftone},
{\tt bckbrick}, {\tt fwdbrick}, {\tt hexagon}, {\tt spiraldot}
oder {\tt horizontal} folgen. Standardmäßig wird {\tt mode=fs}
verwendet. Der jeweilige Parameter gibt an, mit welchem
Schattierungsverfahren ein Bild in Schwarz/Weiß-Darstellung
umgerechnet werden soll:

\medskip
\staggered{\tt horizontal }

\key {\tt bw} Es wird ein simples Schwellwertverfahren
verwendet. Liegt ein Helligkeitswert unter der Schwelle,
erscheint er als schwarzer Punkt, liegt er über der
Schwelle, erscheint er als weißer Punkt.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=bw}}

\key {\tt fs} Das Verfahren von R.W. Floyd und L. Steinberg (4 gestreute
Fehlerwerte, serpentinenartige Verteilung) wird verwendet,
das sehr feine, chaotische Muster erzeugt. Dies ist das
klassische Fehlerstreuungsverfahren.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=fs}}

\key {\tt burkes} Das Verfahren von D. Burkes (7 gestreute
Fehlerwerte, serpentinenartige Verteilung) wird verwendet.
Auch dies ist ein Fehlerstreuungsverfahren, das die
Fehler aber im Gegensatz zum Floyd-Steinberg Verfahren
auf wesentlich mehr Punkte verteilt. Das Resultat ist
eine gleichmäßigere Streuung der Punkte.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=burkes}}

\key {\tt sierra} Das Verfahren von F. Sierra (10 gestreute
Fehlerwerte, serpentinenartige Verteilung) wird verwendet.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=sierra}}

\key {\tt jjn} Das Verfahren von J.F. Jarvis, C.N. Judice und W.H. Ninke
(12 gestreute Fehlerwerte, serpentinenartige Verteilung) wird verwendet. Dieses
Verfahren hebt -- was ein unerwünschter Nebeneffekt sein kann
-- die Schärfe des jeweiligen Bildes.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=jjn}}

\key {\tt stucki} Das Verfahren von P. Stucki (12 gestreute
Fehlerwerte, serpentinenartige Verteilung) wird verwendet.
Dieses Verfahren ähnelt dem von Jarvis, Judice \& Ninke,
jedoch wird die Bildschärfe nicht erhöht.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=stucki}}

\key {\tt bluenoise} R. Ulichney's Verfahren ``Blue noise'' (4 gestreute
Fehlerwerte, serpentinenartige Verteilung) wird verwendet. Im
Zusammenhang mit diesem Verfahren wird ein Schwellwert-Parameter
verlangt (anzugeben über das Schlüsselwort {\tt threshold}). Fehlt
dieser Parameter, entspricht dieses Verfahren in seiner Wirkung
dem vom Floyd und Steinberg.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=bluenoise threshold=30}}

\key {\tt stevenson} Das Verfahren von R.L. Stevenson und G.R.
Arce (12 versetzte gestreute Fehlerwerte, serpentinenartige
Verteilung) wird verwendet.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=stevenson}}

\key {\tt random} Ein Zufallsmuster wird über die
Bilddaten gelegt, die dadurch sehr rauh wirken. DeluxePaint
verwendet dieses Verfahren zum Mischen von Farben.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=random}}

\key {\tt ordered} B.E. Bayer's Verfahren wird verwendet. Hierbei wird
ein schachbrettartiges Muster über die Bilddaten gelegt. Das entstehende Bild
erhält eine sehr regelmäßige Maserung.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=ordered}}

\key {\tt halftone} Ein sehr verbreitetes Verfahren aus der
Druckindustrie, das z.B. zum Drucken von Fotos in Zeitungen
oder beim Siebdruck eingesetzt wird. In niedrigen Auflösungen
wirkt es sehr grob, es hat aber auch seine Vorteile:
will man Fotokopien eines Ausdrucks machen, kippen Bilder,
die mit den Verfahren {\tt fs}, {\tt random} und {\tt ordered}
erzeugt wurden, aufgrund der feinen Strukturen,
die die Algorithmen erzeugen, sehr leicht in zu helle oder
zu dunkle Bilder um. Diesen Effekt kann man bei {\tt halftone}
nicht beobachten. Dieses Verfahren erzeugt kreisförmige
Strukturen im sich ergebenden Bild.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=halftone}}

\key {\tt fwdbrick} Dieses Verfahren erzeugt diagonale
Linienstrukturen im sich ergebenden Bild.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=fwdbrick}}

\key {\tt bckbrick} Dieses Verfahren erzeugt diagonale
Linienstrukturen im sich ergebenden Bild (ähnlich wie {\tt fdwbrick},
nur gespiegelt).

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=bckbrick}}

\key {\tt hexagon} Dieses Verfahren erzeugt rautenförmige
Strukturen im sich ergebenden Bild.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=hexagon}}

\key {\tt spiraldot} Dieses Verfahren erzeugt quadratische
Strukturen im sich ergebenden Bild.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=spiraldot}}

\key {\tt horizontal} Dieses Verfahren erzeugt horizontale
Linienstrukturen im sich ergebenden Bild.

Beispiel:

\centerline{\showimage{Graustufen}{8cm}{1cm}{render=frame mode=horizontal}}

\endstaggered

Die maximale Bildgröße ist auf 32.768 $\times$ 32.768
Punkte beschränkt, die Seitengröße eines PostScript-Dokuments
sogar auf 30.000 $\times$ 30.000 Punkte. Überschreitet ein
Bild diese Grenzen, wird gnadenlos abgeschnitten.

Hier ein paar Beispiele für einen \\special-Befehl:

\itemlist{$\bullet$ }
\next{\tt \\special\{ifffile=Bridge.pic hsize=8cm vsize=5cm mode=jjn\}}\hfill\break

 Hier wird die IFF-ILBM-Datei ``Bridge.pic'' an der aktuellen Textposition
 in der Größe 8 × 5 cm eingebunden, zum Umrechnen in Schwarz/Weiß wird das
 Verfahren von Jarvis, Judice \& Ninke benutzt:

\centerline{\showimage{Bridge.pic}{8cm}{5cm}{mode=jjn}}

\next{\tt \\special\{ifffile=Bridge.pic hsize=8cm vsize=5cm hoffset=1.5cm mode=halftone\}}\hfill\break

Diesmal wird das Bild um 1,5 Zentimeter nach rechts verschoben und
das `Halftone'-Schattierungsverfahren benutzt:

\centerline{\showimage{Bridge.pic}{8cm}{5cm}{mode=halftone hoffset=1.5cm}}

\next{\tt \\special\{ifffile=AmigaWorld.pic hsize=8cm vsize=5cm mode=bluenoise threshold=50\}}\hfill\break

 Hier wird die IFF-ILBM-Datei ``AmigaWorld.pic'' an der aktuellen Textposition
 in der Größe 8 × 5 cm eingebunden. Zum Umrechnen in Schwarz/Weiß wird das
 Verfahren ``Blue noise'' mit einem Schwellwert von 50\% benutzt:

\centerline{\showimage{AmigaWorld.pic}{8cm}{5cm}{mode=bluenoise threshold=50}}

\next{\tt \\special\{psfile=golfer.eps hsize=2.5in vsize=4.0in scale=0.33 render=frame\}}\hfill\break

 Das PostScript-Dokument ``golfer.eps'' wird auf 1/3 verkleinert in einem
 2,5 × 4,0 Zoll großen Bereich angezeigt, um das Bild wird ein Rahmen gezeichnet:

\centerline{\showps{golfer.eps}{2.5in}{4in}{scale=0.33 render=frame}}
\enditemlist

Bei der Verwendung der Schlüsselwörter {\tt hsize} und {\tt vsize} muß
übrigens nicht mehr auf die richtige Einstellung der ``Base DPI''
geachtet werden, da dann das Bild auf jeden Fall auf die geforderte
Größe gebracht wird. Die Orginalgröße des Bildes wird dann ignoriert.


Mit Ausnahme der TPIC Specials, die im Anschluß erläutert werden, muß
derzeit immer ein Dateiname angegeben werden.

\section{TPIC Unterstützung}

SpecialHost versteht auch die Befehle der TPIC Sprache. In dieser
Sprache gibt es Kommandos zum Zeichnen von Linien, Kreisen, Splines
usw. Die Sprache TPIC ist genormt und wird auch von einigen anderen
Programmen unterstützt. Zum Beipiel von dem Makropaket EEPIC, das
Bilder im TPIC Format erzeugt.

Die TPIC Specials werden etwas anders verarbeitet, als die bisher
besprochenen Special-Befehle. Die TPIC Kommandos werden von den
Treibern vorbereitet und SpecialHost bekommt nur noch komplette TPIC
Kommandos übergeben. Dadurch wird etwas Kommunikation zwischen den
Programmen eingespart.


\section{FIG-Bilder in \TeX-Texte}

Das ``FIG'' Programm ist ein vektororientiertes Graphicprogramm, mit
dem man Zeichnungen erstellen kann und im ``fig'' Format abspeichern
kann. Diese Zeichnungen kann man nun auch auf sehr einfache Art und
Weise in einen \TeX-Text einbinden. Dazu muß man lediglich ein paar
Schritte ausführen.

Als erstes wird das Bild mit dem {\tt FIG} Programm zeichnen und
abspeichern. Z.B.\ {\tt pict.fig}. Nun muß man das Bild in ein anderes
Format konvertieren. Dazu wird das Programm {\tt Fig2Dev} verwendet.
Der Aufruf:

{\narrower\tt Fig2Dev $>$pict.eepic -L eepic pict.fig \par}

Dies konvertiert das Programm in das ``EEPIC'' Format. EEPIC ist ein
Makropacket das zusammen mit \LaTeX{} verwendet werden kann. Nun
schreibt man ein kleines \TeX-Dokument (z.B.\ {\tt pict.tex}):

{
\narrower
\beginverbatim
\documentstyle[11pt,epic,eepic]{article}
\begin{document}
\input pict.eepic
\end{document}
\endverbatim
}

Dieses Dokument muß nun mit \LaTeX{} übersetzt werden. Also z.B.\ mit:

{\tt\narrower virtex \&lplain pict\par}

Die entstehende DVI-Datei kann man wie üblich mit \ShowDVI{} ansehen
und mit \DVIprint{} ausdrucken. Allerdings muß dabei natürlich \spec{}
im Hintergrund laufen, da das EEPIC Format TPIC Specials verwendet.


\section{Das optimale Schattierungsverfahren}

Wenn ein Programm schon eine derartig große Menge von
Schattierungsverfahren zur Verfügung stellt, liegt die Frage
nahe, welches Verfahren mit welchen Parametern zu einem
optimalen Ergebnis führt. Hierzu läßt sich keine allgemein
gültige Antwort finden, es gibt allerdings eine Reihe von
Regeln, an denen man sich orientieren kann.

Zunächst sollte man diese Dokumentation einmal auf dem Drucker
ausgeben lassen, den man später verwenden möchte und sich die
ausgedruckten Bilder anschauen. Die Schwächen und Vorteile der
einzelnen Verfahren zeigen sich meist schon beim ersten
Ausdruck. Im Gegensatz zur Darstellung am Computerbildschirm
überlappen sich die einzelnen Punkte auf dem bedruckten
Papier. Insbesondere Verfahren wie {\tt fs}, {\tt jjn} und
{\tt ordered} versagen leicht bei diesen Bedingungen, sie
führen zumeist nur dann zu guten Ergebnissen, wenn die
einzelnen Bildpunkte diskret angeordnet sind. Ist dies
nicht der Fall, sollten beim Ausdruck eher Verfahren wie
{\tt halftone} oder {\tt hexagon} verwendet werden. Sollen
später Fotokopien der Ausdrucke gemacht werden, ist wiederum
in der Mehrzahl der Fälle ein Verfahren wie {\tt halftone} oder {\tt hexagon}
im Vorteil, da der Kopiervorgang üblicherweise diskret
angeordnete Bildpunkte zusammenfaßt und verwischt.

\section{Die Software-Schnittstelle zu den Treibern}

Hier ein kurzer Einblick in die Arbeitsweise des \spec{} Programms.

\subsection{Die Kommunikation über Ports}
Die Kommunikation der Treiber mit dem \spec{}-Programm läuft mittels
eines Message-Ports ab. Sobald \spec{} gestartet wird, öffnet es einen
Port mit dem Namen ``{\tt special\_dvi}''. An diesem Port wartet das
Programm auf Meldungen der Treiber.

Wenn ein Treiber in der DVI-Datei auf einen \\special-Befehl stößt, testet
er zuerst, ob der Port des \spec{}-Programms existiert. Wenn nicht,
ignoriert er den Befehl. Falls doch, so erzeugt der Treiber einen Port
mit dem Namen ``{\tt special\_reply}'' und richtet ihn als Reply-Port ein.

Über den Port ``{\tt special\_dvi}'' schickt er dem
\spec{}-Programm eine Meldung, in der die derzeitige
Auflösung des Druckers (oder Bildschirms) sowie der
\\special-Befehl steht.

\spec{} wertet diese Message aus und fügt die {\tt special\_map}
Struktur hinzu. Diese enthält die Größe des Bildes, den Offset und
auch den Namen des Bitmap-Files oder einen Pointer auf die Bitmap.
Diese Meldung schickt es per ``ReplyMsg'' an den Treiber zurück.

Sobald der Treiber alle Informationen der ``special\_map'' ausgewertet
hat, schickt er dem \spec{}-Programm noch eine Meldung, damit dieses
weiß, daß der Speicherplatz der ``special\_map'' wieder freigegeben
werden kann. Diese Meldung wird von \spec{} sofort bestätigt.

Danach löscht der Treiber seinen Reply-Port.

Während diese Kommunikation abläuft -- zwischen dem Versenden der
ersten Meldung durch dem Treiber und dem Reply der zweiten Message
durch das \spec{} Programm -- dürfen die beiden Partner der
Unterhaltung auf keinen Fall unterbrochen werden. Sobald einer der
beiden seine Kommunikation einstellt, entsteht ein Deadlock. Das
andere Programm wartet bis zum nächsten Reset. Da kein Timeout
implementiert ist, hilft in dem Fall nur ein Reboot weiter. Wenn man
das \spec{} Programm ändert, dann muß man darauf achten, daß während
der Kommunikation das Programm nie abgebrochen werden kann. Auch bei
einem Fehlerfall muß die Kommunikation immer zu Ende geführt werden.

\subsection{Das Bitmap-Dateiformat}

Um nicht immer wieder das zeitaufwendige Vergrößern oder Verkleinern
der Bilder durchführen zu müssen, gibt es die Möglichkeit, die schon
auf die richtige Größe gebrachten Bilder abzuspeichern.

Damit man die Bilder immer in den verschiedenen Auflösungen parat hat,
werden die Dateien beim Abspeichern in einer Schublade
untergebracht, deren Name von der der Auflösung des Druckers,
bzw. des Bildschirms abhängt. Speichert man beim
Previewer mit einer Auflösung von 91dpi das Bild {\tt testbild} ab, so
wird die Datei unter {\tt SpecialHost\_91x91/testbild} erzeugt.
Existiert noch keine Schublade unter dem Namen {\tt SpecialHost\_91x91},
so wird sie angelegt.

Diese Datei hat ein ganz besonderes Format.\parwithoutskip Die ersten
vier Bytes des Files sind das `Magic Word' ``SPEC''. An diesem erkennt
man, daß es eine Bitmap-Datei des \spec{} Programms ist.

Die nächsten vier Bytes ergeben sich, wenn man über die einzelnen
Zeichen des Special-Befehls, der zu diesem Bild gehört, eine CRC-32
Prüfsumme zieht. Dies hat den Sinn, daß man daran erkennt, ob sich der
Special-Befehl geändert hat, seitdem man die Datei erzeugt hat. Ist
dies der Fall, so wird das Bild neu berechnet und abgespeichert.

Nun folgen zwei Langwörter, die die Breite und Höhe des Bildes in
Pixel angeben.

Zum Schluß kommt die Bitmap, Zeile für Zeile. Die Länge einer Zeile
wird bis auf 16 Bit aufgerundet. Für eine Zeile mit 100 Bit benötigt
man also sieben 16-Bit-Wörter.

Noch ein weiteres Datum wird indirekt mit der Datei gespeichert. Das
Erstellungsdatum. Es wird dazu verwendet zu überprüfen, ob das
Ursprungsbild jüngeren Datums ist als die Bitmap-Datei. Ist dies der
Fall, so muß natürlich die Bitmap neu berechnet werden, da sich das
Bild allem Anschein nach geändert hat.

Durch diesen Datumsvergleich und durch das Überprüfen des
\\special-Befehls wird sichergestellt, daß keine veraltete Bitmap-Datei
verwendet wird. Man kann also ohne weiteres den Zeichenmodus
{\tt Transfer picture in a file} als Standard verwenden. So muß ein Bild
für eine Auflösung nur einmal berechnet werden, und steht dann immer
als Datei zur Verfügung. Das einzige, daß dabei zum Problem werden
kann, ist der Speicherplatz, da die Bitmap-Dateien ungepackt
abgespeichert werden.


\section{Benötigte Soft- und Hardware}

Zur Hardware ist nur zu sagen: ein Amiga, und zwar nach Möglichkeit
einer mit etwas mehr Speicher. Sonst kann es bei großen Bildern und
hoher Auflösung zu Speichermangel kommen.

Als Software werden die \TeX-Treiber \ShowDVI{} und \DVIprint{} benötigt.
Um PostScript-Dokumente einbinden zu können, wird die {\tt post.library}
(mindestens Version 1.5) benötigt.

\section{Bekannte Fehler}

Bisher sind (leider?) keine Programmfehler bekannt.

\bye
