\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


\titlepage
\vskip 0.7in
\title{\spec{}, ein}
\title{Programm zum Auswerten}
\title{von special-Strings}
\title{f\"ur den AMIGA}
\bigskip
\release{$\beta$-Version 0.94}
\smallskip
\release{vom}
\release {\mynum{\day}. \mymonth{\month}\mynum{\year}}
\bigskip
\author{von}
\author{Georg He\ss{}mann}
\vfill
\abstract{
  \spec{} ist ein Hilfsprogramm f\"ur den Previewer \ShowDVI{} und den
  Druckertreiber \DVIprint{}. Es wertet die special-Strings aus, die
  die Treiber dem Programm übergeben. Es ist in der Lage IFF-Bilder
  in den \TeX-Text einzubinden, sowie TPIC Specials auszuwerten.
  Der vollständige Source liegt dem Programm bei.
}
\vskip 1.2in
\endtitlepage

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

\section{Copyright und \"ahnliches}

Das Programm \spec{} ist ``freely distributable copyrighted software''.
Das hei\ss{}t, jeder darf es sich kopieren und verwenden, das
Copyright bleibt aber vollst\"andig bei mir (Georg Heßmann).

Das Programm darf auch nur unver\"andert weitergegeben werden.

Das Programm darf ohne meine ausdr\"uckliche Genehmigung nicht kommerziell
verkauft werden. Als PD-Software vertrieben darf der Preis 5 DM pro Diskette
nicht \"uberschreiten.

Es darf auch nur in vollst\"andiger und unver\"anderter Form
weitergegeben werden.

Diese Anleitung ``{\tt spec.tex}'' ist ebenfalls Copyright Georg Heßmann 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.

Die Sourcen d\"urfen ver\"andert werden, solange diese deutlich
gemacht wird und die Copyright-Notiz unver\"andert im Source
verbleibt. Diese geänderten Sourcen dürfen aber nur mit dem explizieten Hinweis,
daß sie geaendert wurden, weitergegeben werden. Und dies auch nicht im Rahmen
von Pas\TeX, sondern nur auf einer eigenen Diskette.

Wenn \"Anderungen gemacht werden, sollten diese mir nach
M\"oglichkeit mitgeteilt werden, damit sie in die allgemeine
Version eingebaut werden k\"onnen.

Zu beachten ist das Copyright der Files `flext.c' und `specialparse.c'.

F\"ur weitere Erkl\"arungen siehe das README-File.


\section{Allgemeines \"uber \spec{}}

Jeder, der auch nur ein wenig mit \TeX{} gearbeitet hat, kennt dessen
gravierendsten Nachteil: die fehlende M\"oglichkeit, Graphiken zu erstellen
und in den Text einbinden zu k\"onnen.
Es gibt zwar Ans\"atze, 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\"ankung umgehen:
die Verwendung des \\special-Kommandos.
Gl\"ucklicherweise wurde im DVI-File-Format
eine M\"oglichkeit vorgesehen, auch nicht Standardisiertes in das
DVI-File aufzunehmen. Dazu dient das \\special-Kommando. Alles was
in geschweiften Klammern diesem Kommando folgt, wird unver\"andert
in das DVI-File \"ubernommen. So k\"onnen treiberabh\"angige
Anweisungen am \TeX-Programm vorbei ins DVI-File gelangen.
Der jeweilige Treiber kann den \\special-String auswerten und
zum Beispiel eine Graphik in die aktuelle Seite einbinden.

Der Nachteil dieser Methode soll aber nicht verschwiegen werden.
Sobald man mit \\special-Strings arbeitet, ist das DVI-File nicht
mehr portabel. Das hei\ss{}t, man kann dieses File nicht mehr
auf beliebige Rechner \"ubertragen
und erwarten, da\ss{} die Ausgabe dort genau so aussieht, wie auf
dem eigenen Rechner. So gravierend ist diese
Einschr\"ankung allerdings auch nicht, da im
schlimmsten Fall die \\special-Strings einfach
ignoriert werden und der Text eben ohne Graphik
ausgedruckt wird.

Wie arbeitet \spec?
\parwithoutskip
\spec{} nutzt die M\"oglichkeit des Multitasking und des Message-Transfers
des AMIGA aus, um auf m\"oglichst flexible Art und Weise die
\\special-Strings 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-String, so \"ubergibt er
diesen unver\"andert dem \spec-Programm zusammen mit ein paar weiteren
Informationen wie der derzeitigen Aufl\"osung des Bildes.

Die Aufgabe des \spec{}-Programms ist es, die Message
des Treibers abzuholen und den \\special-String
auszuwerten. Wird in dem String der
Name eines IFF-Files angegeben, so l\"adt das Programm
das angegebene Bild und pa\ss{}t es der eingestellten
Aufl\"osung an (verkleinert oder vergr\"o\ss{}ert es).
Danach \"ubergibt es die so erzeugte Bitmap dem
Treiber. Dieser mu\ss{} sie nur noch in seine eigene
Bitmap, in der er eine ganze \TeX-Seite h\"alt, einkopieren.

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

So kann man zum Beispiel das Format des \\special-Strings umdefinieren
oder neue F\"ahigkeiten in das \spec{}-Programm einbauen wie die
Auswertung von Farb- oder Vektorgraphiken, ohne auch nur eine
Winzigkeit in den Treibern \"andern zu m\"u\ss{}en.
Oder falls ich etwas in den Treibern \"andere und jemand sich
ein eigenes \spec{}-Programm geschrieben hat, sollten keine
Probleme bei der Zusammenarbeit dieser Programme auftreten.

Damit der Vorteil zum Tragen kommt, gebe ich den gesamten
Source des \spec{}-Programms heraus. Vielleicht findet sich jemand,
der sich in der Bildverarbeitung gut auskennt und
Lust hat, das Programm zu erweitern.


\section{Der Aufruf von \spec{}}

Im derzeitigen Entwicklungsstadium besitzt \spec{} noch keine
einzige Option, die man ihm beim Aufruf angeben k\"onnte.

Die einzige Besonderheit ist vielleicht, da\ss{} sich das
Programm von selbst in den Hintergrund legt. Der CLI-Prompt
erscheint wieder sofort nach dem Aufruf. Das Programm
ignoriert auch 'stdin' und 'stdout'. 'stderr' wird
dazu benutzt, im schweren Fehlerfall eine Meldung auszugeben.
In solch einer Situation beendet sich das Programm.



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

Das Window von \spec{} ist in drei Teile unterteilt.
Der obere Teil dient der Eingabe. Dort sind alle Gadgets,
mit denen das Programm gesteuert wird.

Der mittlere Teil besteht lediglich aus einer Statuszeile, in der
angezeigt wird, auf welche Art das Programm die Bilder \"ubergeben soll.

Der untere Teil ist als Kontrollfenster f\"ur die Aktivit\"aten des
Programms gedacht. Dort wird mitprotokolliert, was das Programm gerade so
macht. Es merkt sich auch die Zeilen, die nach oben herausgeschoben werden,
wenn es viele Meldungen ausgibt. Diese k\"onnen mit
den Cursor-Tasten wieder hervorgeholt werden.


\section{Die Bedienung von \spec{}}

Das Programm wird vollst\"andig \"uber Gadgets gesteuert.
Dies sind:
\staggered{\tt base DPI }

\key {\tt Memory} Wenn man dieses Gadget anklickt, so veranla\ss{}t man
 das \spec{}-Programm, einen Zeiger auf die Bitmap des einzubindenden
 Bildes an den Druckertreiber oder Previewer zu \"ubergeben.

\key {\tt File} Dieses Gadget bewirkt, da\ss{} dem Treiber nur ein Dateiname
 \"ubergeben wird, in dem die Bitmap in einem besonderen (einfachen)
 Format abgespeichert ist. Das File hat als Endung die DPI-Aufl\"osung
 des Treibers. Dabei wird allerdings erst gepr\"uft, ob dieses
 File j\"ungeren Datums ist als das
 eigentliche IFF-File. Ist das IFF-File neuer -- es wurde also
 ge\"andert -- oder existiert das Bitmap-File noch nicht, so
 wird die Bitmap im Speicher erstellt und das Bitmap-File neu
 angelegt. Da ja dann das Bild ohnehin schon im Speicher steht,
 wird nun die Bitmap direkt \"ubergeben.

\key {\tt Mem-B} Dieses Gadget ist verwandt mit dem {\tt Memory}-Gadget.
 Der einzige Unterschied ist, da\ss{} der Treiber zus\"atzlich
 angewiesen wird, einen Rand um das Bild zu zeichnen.

\key {\tt File-B} Dieses Gadget \"ahnelt dem {\tt
 File}-Gadget, der Treiber zeichnet jedoch einen Rand um das Bild.

\key {\tt Border} Hier weist das \spec{}-Programm den Treiber an,
 lediglich einen Rand, der der Gr\"o\ss{}e des Bildes entspricht,
 zu zeichnen. Die Gr\"o\ss{}e ermittelt das \spec-Programm, indem
 es den Header des IFF-Files einliest.

\key {\tt Rect.} Hat die selbe Funktion wie das {\tt Border}-Gadget.
 Nur wird nicht ein Rand, sondern ein ausgef\"ulltes
 Rechteck gezeichnet.

\key {\tt Base DPI} Mit diesem Gadget gibt man an, in welcher Aufl\"osung
 die IFF-Bilder gezeichnet sind, die man in den \TeX-Text einbindet.
 Es wird standardm\"a\ss{}ig auf 100dpi
 gesetzt. Dies bedeutet, da\ss{} ein Bild im Previewer, eingestellt auf
 100dpi, unver\"andert angezeigt wird. Bei einem Druckertreiber mit
 300dpi Aufl\"osung aber, wird das Bild um den Faktor 3
 vergr\"o\ss{}ert. Wenn die {\tt Base DPI} auf 100 eingestellt bleibt,
 so bedeutet dies, da\ss{} 100 Punkte im IFF-Bild immer ein Inch
 auf der Seite ausmachen -- egal mit welcher Aufl\"osung dieses
 Bild angeschaut oder ausgedruckt wird.

\key {Invert} Wenn dieses Gadget aktiviert ist, wird die Bitmap des
 einzubindenden Bildes invertiert.

\key {Blitter} SpecialHost kennt zwei verschiedene Methoden um 
 schwarz-weiß Bilder zu vergrößern -- verkleinern. Einmal mittels
 einer Software-Routine. Diese ist zawr nicht übermäßig schnell, liefert
 dafür aber recht gute Ergebnisse. Dann gibt es noch eine Routine, die den Blitter
 zu Hilfe nimmt. Diese ist {\bf erheblich} schneller, ezeugt aber manchmal
 eine etwas schlechtere Ausgabe. Mit dem Gadget {\tt Blitter} kann man 
 entscheiden, welche Art der Skalierung verwendet werden soll.

\key {\tt Icon} Durch Anklicken dieses Gadgets wird das Fenster in
 ein kleines Icon verwandelt. \"Offnen kann man dieses Icon durch einen
 Doppelklick. Das Programm arbeitet auch als Icon ungest\"ort weiter.

\key {\tt Show} Diese Gadget holt den \ShowDVI-Screen nach vorne.
\endstaggered



\section{Das Menü}

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

Es gibt drei Menüs: {\tt Project}, {\tt Draw Modus} und  {\tt Misc}

\subsection{Das Untermenü Project}

\staggered{\tt Save Config }
\key{\tt About } Gibt ein paar Zeilen Copyright-Text aus.
\key{\tt Read Config } Liest das Konfigurationsfile erneut ein. Setzt also alles
	wieder in den Urzustand zurück.
\key{\tt Save Config } Speichert die derzeitige Konfiguration in ein File ab.
	Dazu gehören auch so Sachen wie die aktuelle Fensterposition.
\key{\tt To ShowDVI } Enspricht dem {\tt show} Button.
\key{\tt Iconify} Entspricht dem {\tt icon} Button.
\key{\tt Use PubScr } Dies funktioniert nur unter 2.0. Wenn dies angewählt ist, versucht
	SpecialHost sein Fenster auf dem \ShowDVI{} Public-Screen zu öffnen.
\key{\tt Quit} Beendet das Programm.
\endstaggered

\subsection{Das Untermenü Draw Modus}

Die sechst Menüpunkte dieses Untermenüs entsprechen genau den
6 Gadgets auf der rechten Seite des SpecialHost Fensters.

\subsection{Das Untermenü Misc}

\staggered{\tt Use Blitter }
\key{\tt Invert } Enstpricht dem {\tt Invert} Button.
\key{\tt Use Blitter } Entspricht dem {\tt blitter} Button.
\endstaggered



\section{Das Format des special-Strings}

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

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

dem \\special-Kommando zwischen den geschweiften Klammern steht, wird
vom \TeX-Programm ignoriert und unver\"andert zum Treiber durchgereicht.
Trifft nun \ShowDVI{} oder \DVIprint{} auf solch einen String, so wird
\"uberpr\"uft, ob ein \spec{}-Programm im Hintergrund l\"auft.
Ist dies nicht der Fall, so wird das \\special-Kommando einfach ignoriert.
Existiert das \spec-Programm, so bekommt dieses den vollst\"andigen
String per Message \"ubermittelt.

Es ist also das \spec-Programm, welches den Special-String auswertet und
die Bedeutung der einzelnen W\"orter des Strings festlegt.
Da dieser Special-String in keiner Weise standardisiert ist,
kann sich das Format von Treiber zu Treiber \"andern.

Das vorgestellte Format gilt also nur f\"ur diese Kollektion
von Treibern und ist auch hier noch nicht endg\"ultig festgelegt.
In neueren Versionen werden sicherlich noch Funktionen hinzukommen.
Es wird aber auf Abw\"artskompatibilit\"at Wert gelegt,
so da\ss{} man ohne Probleme auf neuere Versionen umsteigen kann.

Das derzeitige Format der \\special-Strings:

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

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

Eine Anweisung wiederum besteht aus einem Schl\"usselwort und einem Wert,
so da\ss{} eine genauere Betrachtung des \\special-Strings folgendes
Format hervorbringt:

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

Zwischen Schl\"usselwort (key) und Wert (value) mu\ss{} immer ein
Gleichheitszeichen stehen.

Als Schl\"usselw\"orter gibt es bisher:
\staggered{\quad\tt ifffile }
\key{\quad\tt ifffile } definiert den Filenamen eines IFF-Files,
\key{\quad\tt hoffset } gibt einen horizontalen Offset an,
\key{\quad\tt voffset } gibt einen vertikalen Offset an,
\key{\quad\tt hsize } legt die horizontale Gr\"o\ss{}e des Bildes fest,
\key{\quad\tt vsize } legt die vertikale Gr\"o\ss{}e des Bildes fest.
\key{\quad\tt mode } gibt den Type des IFF-Files an. Dies ist entweder
		`{\tt bw}' f\"ur schwarz-wei\ss{} Bilder, `{\tt color}' f\"ur
		Farbbilder oder `{\tt ham}' f\"ur HAM-Bilder.
\key{\quad\tt red } legt den Rot-Anteil des Farbbildes fest. Damit kann der
		Rot-Anteil des Bildes verstärt oder vermindert werden.
\key{\quad\tt green } legt den Gr\"un-Anteil des Farbbildes fest.
\key{\quad\tt blue } legt den Blau-Anteil des Farbbildes fest.
\key{\quad\tt gamma } definiert die ``Gamma-Korrektion'' f\"ur das Farbbild.
		Damit kann das gesamte Bild aufgehellt werden. Die Helligkeit
		der Farbe (r, g, b) wird bestimmt durch:
		$$h = 255*\left({{(red*r+green*g+blue*b)}\over{15*(red+green+blue)}}\right)^{gamma}$$
\endstaggered

Bei {\tt ifffile} wird als Wert der Filename eines IFF-Files angegeben.
Dazu ist zu beachten, da\ss{} das aktuelle Directory jenes ist, in welchem
das \spec-Programm gestartet wurde. Aus diesem Grund sollte der Filename
eines IFF-Files immer den kompletten Pfad enthalten. In der
jetzigen Version ist es leider noch nicht m\"oglich, das aktuelle Directory
innerhalb des \spec{} Programms zu \"andern.

Bei den n\"achsten vier Schl\"usselw\"ortern wird als Wert eine Dimensionsangabe
verlangt. Diese besteht aus einer reellen Zahl plus einer Einheitsbezeichnung.
Folgende Einheiten stehen zur Verf\"ugung:
\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\^ot point $1157 dd = 1238 pt$
\key{\quad\tt cc} cicero $1cc = 12dd$
\endstaggered

Der Parameter von {\tt mode} ist, wie schon gesagt, aus: {\tt bw}, {\tt color} oder {\tt ham}.
Die Schl\"usselw\"orter {\tt red}, {\tt green}, {\tt blue} und {\tt gamma} verlangen als
Parameter eine reelle Zahl. Standardm\"a\ss{}ig sind folgende Werte vordefiniert:
{\tt red=1.0}, {\tt green=1.0}, {\tt blue=1.0} und {\tt gamma=0.5}.

Hier ein paar Beispiele f\"ur einen \\special-Strings:

\itemlist{$\bullet$ }
\next{\tt \\special\{ifffile=dh0:pict/graphic1\}}\hfill\break
 Hier wird das IFF-File ``graphic1'' aus dem Directory ``dh0:pict''
 an der aktuellen Textposition eingebunden.
\next{\tt \\special\{ifffile=graphic2 hoffset=1.5in\}}\hfill\break
 Diesmal wird das Bild aus dem aktuellen Directory des \spec{} Programms
 geholt und um 1,5 Zoll nach rechts verschoben.
\next{\hbox{\tt \\special\{ifffile=graphic3~voffset=-1cm~hsize=2in~vsize=1in\}}}
 \hfill\break
 Das Bild ``graphic3'' wird bei diesem Beispiel um einen Zentimeter
 nach oben verschoben und auf die Gr\"o\ss{}e 2 mal 1 Zoll
 vergr\"o\ss{}ert oder verkleinert.
\enditemlist

Bei der Verwendung der Schl\"usselw\"orter {\tt hsize} und {\tt vsize}
mu\ss{} \"ubrigens nicht mehr auf die richtige Einstellung der
``Base DPI'' geachtet werden, da dann das Bild auf jeden Fall auf die
geforderte Gr\"o\ss{}e gebracht wird. Die Orginal-
Gr\"o\ss{}e des Bildes wird dann ignoriert.


Mit Ausnahme der TPIC Specials, die im Anschluß erläutert werden, muß derzeit
immer ein IFF-File 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-Strings. 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-File (z.B.\ {\tt pict.tex}):

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

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

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

Das entstehende DVI-File 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{Die Software-Schnittstelle zu den Treibern}

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

\subsection{Die Kommunikation \"uber Ports}
Die Kommunikation der Treiber mit dem \spec{}-Programm l\"auft mittels eines
Message-Ports ab. Sobald \spec{} gestartet wird, \"offnet es einen Port
mit dem Namen ``special\_dvi''. An diesem Port wartet das Programm
auf Meldungen der Treiber.

Wenn ein Treiber im DVI-File auf einen \\secial-String st\"o\ss{}t,
testet er zuerst, ob der Port des \spec{}-Programms existiert.
Wenn nicht, ignoriert er den String. Falls doch, so erzeugt
der Treiber einen Port mit dem Namen ``special\_reply'' und richtet
ihn als Reply-Port ein.

\"Uber den Port ``special\_dvi'' schickt er dem
\spec{}-Programm eine Meldung, in der die derzeitige
Aufl\"osung des Druckers (oder Bildschirms) sowie der
\\special-String steht.

\spec{} wertet diese Message aus und f\"ugt die {\tt special\_map}
Struktur hinzu. Diese enth\"alt die Gr\"o\ss{}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\"uck.

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

Danach l\"oscht der Treiber seinen Reply-Port.

W\"ahrend diese Kommunikation abl\"auft -- zwischen dem Versenden der ersten
Meldung durch dem Treiber und dem Reply der zweiten Message durch das
\spec{} Programm -- d\"urfen 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\"achsten Reset. Da kein
Timeout implementiert ist, hilft in dem Fall nur ein Reboot
weiter. Wenn man das \spec{} Programm \"andert, dann
mu\ss{} man darauf achten, da\ss{} w\"ahrend der
Kommunikation das Programm nie abgebrochen werden
kann. Auch bei einem Fehlerfall mu\ss{} die
Kommunikation immer zu Ende gef\"uhrt werden.

\subsection{Das Bitmap-File-Format}

Um nicht immer wieder das zeitaufwendige Vergr\"o\ss{}ern oder Verkleinern der
Bilder durchf\"uhren zu m\"ussen, gibt es die M\"oglichkeit, die schon auf
die richtige Gr\"o\ss{}e gebrachten Bilder abzuspeichern.
Dies kann man mittels der zwei {\tt File}-Gadgets einstellen.

Damit man die Bilder immer in den verschiedenen Aufl\"osungen parat hat,
wird beim Abspeichern die jeweilige Aufl\"osung des Druckers (beziehungsweise
des Bildschirmes) angeh\"angt.
Speichert man beim Previewer mit einer Aufl\"osung von
91dpi das Bild {\tt testbild} ab, so wird eine Datei
{\tt testbild.91x91} erzeugt.

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

Die n\"achsten vier Bytes ergeben sich, wenn man den Special-String, der
zu diesem Bild geh\"ort, Buchstabe f\"ur Buchstabe aufaddiert.
Dies hat den Sinn, da\ss{} man daran erkennt, ob sich der Special-String
ge\"andert hat, seitdem man das File erzeugt hat. Ist dies der
Fall, so wird das Bild neu berechnet und abgespeichert.

Nun folgen zwei Langw\"orter, die die Breite und H\"ohe des Bildes in
Pixel angeben.

Zum Schlu\ss{} kommt die Bitmap, Zeile f\"ur Zeile. Die L\"ange einer
Zeile wird bis auf 16 Bit aufgerundet. F\"ur eine Zeile mit 100 Bit
ben\"otigt man also sieben 16-Bit-W\"orter.

Noch ein weiteres Datum wird indirekt mit dem File gespeichert. Das
Erstellungsdatum. Es wird dazu verwendet zu \"uberpr\"ufen, ob
das IFF-Bild j\"ungeren Datums ist als das Bitmap-File. Ist dies der
Fall, so mu\ss{} nat\"urlich die Bitmap neu berechnet werden, da
sich das IFF-Bild allem Anschein nach ge\"andert hat.

Durch diesen Datumsvergleich und durch das \"Uberpr\"ufen des \\special-Strings
wird sichergestellt, da\ss{} kein veraltetes Bitmap-File verwendet
wird. Man kann also ohne weiteres den Zeichenmodus
{\tt Transfer picture in a file} als Standard verwenden. So mu\ss{} ein
Bild f\"ur eine Aufl\"osung nur einmal berechnet
werden, und steht dann immer als File zur Verf\"ugung.
Das einzige, da\ss{} dabei zum Problem werden kann, ist
der Speicherplatz, da die Bitmap-Files ungepackt
abgespeichert werden.


\subsection{Der Source}

Um sich in dem Source schnell zurechtzufinden, wird
hier zu jedem File eine kurze Beschreibung gemacht.
\staggered{\tt specialhost.c }
\key{special.c}  Source der Kommunikationsfunktionen f\"ur die Treiber.
\key{special.h}  Definitionen der Strukturen, die f\"ur die Kommunikation
   gebraucht werden.
\key{flextr.c}  Modul zum Vergr\"o\ss{}ern oder Verkleinern von
   einfarbigen Bitmaps. Algorithmus aus dem FBM-Packet
   entnommen.
\key{specialhost.c} Modul mit allen Funktionen, die zur Kommunikation mit
   den Treibern gebraucht werden. Dazu noch Funktionen
   f\"ur die Auswertung des \\special-Strings.
\key{specialhost.h} Defines f\"ur Fehlermeldungen und Draw-Modus.
   Dazu noch Prototypen der modul\"ubergreifenden Funktionen.
\key{specialparse.c} Modul, das die Auswertung des \\special-Strings
   \"ubernimmt. Dieses Modul hat seinen Ursprung im
   File ``dospecial.c'' des PostScript-Treibers ``dvips''
   von Thomas Rokicki.
\key{specialparse.h} Definitionen von Strukturen f\"ur das File
   ``specialparse.c''.
\key{specialwin.c} In diesem Modul wird das Fenster- und Gadget-Handling
   angewickelt. Hier ist auch die ``main''-Funktion mit
   der Hauptschleife, in der auf alle m\"oglichen
   Signale gewartet wird.
\key{specialwin.h} Hier werden die Gadgets definiert.
\key{iff.h} Headerfile von Christian A. Webers ``iff.library''.
   Allerdings habe ich es so ge\"andert, da\ss{} nun auch mit dem Aztec-C Compiler
   die Pragmas verwendet werden.
\endstaggered



\section{Was w\"are alles noch zu tun}

Neben ein paar Unsch\"onheiten bei der Bedienung des Programms,
fehlt vor allem eine bessere Bildverarbeitung.
Zum Beispiel Postscript-Support wäre sicherlich schön.
Und mit der ``{\tt post.library}'' ist es auch sicherlich nicht
übermäßig schwierig, dies einzubauen.

Aber aus diesem Grund gebe ich den vollst\"andigen Source
des Programms frei. Vielleicht findet sich jemand, der
sich in der Bildverarbeitung auskennt und ein wenig
Zeit und Lust hat, sein Wissen in das Programm einzubringen.



\section{Ben\"otigte Soft- und Hardware}

Zur Hardware ist nur zu sagen: ein Amiga, und zwar nach M\"oglichkeit
einer mit etwas mehr Speicher. Sonst kann es bei gro\ss{}en
Bildern und hoher Aufl\"osung zu Speichermangel kommen.

Als Software werden die \TeX-Treiber \ShowDVI{} und \DVIprint{} ben\"otigt.
Dazu noch die ``iff.library'' von Christian A. Weber.



\section{Bekannte Fehler}

Das File ``specialwin.c'' l\"a\ss{}t sich nicht mit dem Optimierer von Lattice
\"ubersetzen. Dagegen erzeugt der Aztec-C-Compiler Version 5.0a inkorrekten
Code f\"ur das Modul ``specialparse.c''.

Manchmal kommt es vor, daß Bilder bei der Option {\tt transfer in file} nicht angezeigt
werden. Dies kann man umgehen, in dem man auf {\tt transfer in memory} umschaltet.
Bis zur Version 1.0 wird der Fehler aber sicherlich noch behoben werden.


\bye
