Ein kleiner PCX-Lader

Da ich letztens (oder diesmal?) eine Routine vorgestellt hatte,
die ein RAW-Bild auf die Mattscheibe funzt, folgt heute die
versprochene PCX 2 RAW Routine. PCX deswegen, weil andere Formate
nur noch unter Lizenz (und bald berhaupt nicht mehr) benutzt
werden drfen oder weil der Aufbau von anderen Formaten so
irrsinnig kompliziert fr mich erscheint, da ich mich flugs fr
das PCX-Format entschieden habe. Im Grunde ist PCX genau so
aufgebaut wie die RAW-Dateien, die erzeugt werden. Ehrlich, wenn
die Komprimierung nicht benutzt wird, haben sie denselben Aufbau,
wenn man vom Header absieht. Es existieren zwar heute einige
"Abarten" (hey, Weiterentwickelungen nennt man das!), aber das
Prinzip ist dasselbe: eine Bilddatei wird so in die Datei
geschrieben, wie auch ihr physikalischer Aufbau auf dem Bildschirm
ist. Wahlweise gibt es noch eine einfache Kompression, die von den
meisten Programmen allerdings standardmig eingeschaltet ist. Sie
beschrnkt sich auf Lauflngenkodierung, was nichts anderes
bedeutet, als da aufeinanderfolgende Bytes zusammengefat werden
und ein Steuerbyte davorgefunzt wird (Neues Schlagwort: "funz!").
Leider ist das ganze System nicht so richtig ausgereift, so da
Files mit Kompression unter (gar nicht so seltenen) Umstnden
lnger als ohne Kompression werden. Egal, der grobe Aufbau eines
PCX-Files ist folgender:
- 128 Bytes Header, wo alle wichtigen Bildinformationen
gespeichert sind
- 768 Bytes Farbpalette (3*256) am Ende des Files und
- dazwischen die reinen Bilddaten.
Zum Header ist nur folgendes zu sagen: grtenteils stehen da
Dinge drin, die man nicht braucht. Einige Daten sind Palettendaten
aus der 16-Farben-ra und groe Teile bestehen aus weiten Strecken
Nullbytes. Selbst ZSoft (die Firma, die das PCX-Format entwickelt
hat), schreibt in ihrer offiziellen Dokumentation zum PCX-Format,
da man den Header "normalerweise ignorieren kann (wenn man immer
dieselben Bildauflsungen einliest)". Naja, da fragt man sich,
warum da 128 Bytes kostbarer Platz verschwendet wird!? Jedenfalls
lasse ich in der Routine nur Bilder zu, die eine Auflsung von
320*200 Pixel haben und das prfe ich auch im Header. Auerdem
schaue ich nach, ob die Datei berhaupt ein PCX-Bild ist (das
erste Byte mu $a sein).
Dann sollte man die Farben einlesen und setzen, da es immer
komisch aussieht, wenn zuerst das Bild aufgebaut und dann erst die
korrekten Farben gesetzt werden. Wie gesagt liegen die die
Farbdaten am Ende des Files und beginnen bei einem Offset von -768
ab Fileende (an Offset -769 mu brigens eine 12 und im Header
sollte an Postion 2 eine 5 stehen! Auf die Abfrage habe ich aber
verzichtet). Die RGB-Werte sind auch tatschlich als R, G und B
(in dieser Reihenfolge) abgespeichert. Sie mssen blo um jeweils
2 Bit nach rechts geshiftet (oder durch 4 geteilt) werden, da sie
als 8 Bit-Werte abgespeichert wurden, der VGA-DAC aber nur 6 Bit-
Werte vertrgt. Nun knnen die Bilddaten eingelesen werden. Zurck
zu Offset 129 und anfangen zu dekodieren. Es gibt zwei Arten von
Bytes: das Steuerbyte und das Datenbyte. Ein Steuerbyte gibt an,
wie oft das (nachfolgende) Datenbyte in den Speicher geschrieben
wird. Tritt ein Datenbyte einzeln auf, wird es direkt in den
Grafikspeicher geschrieben. Das Steuerbyte erkennt man an seiner
Besonderheit: seine obersten beiden Bits sind gesetzt. Man mu
also jedes Byte darauf prfen, ob seine obersten Bits gesetzt sind
(AND 192). Falls sie es sind, mssen die unteren 6 Bits des
Steuerbytes maskiert (AND 63) werden, da sie die Informationen
beinhalten, wie oft das (darauffolgende) Datenbyte in den
Grafikspeicher geschrieben werden mu (maximal 63 mal). Das macht
man dann solange, bis 200 Zeilen gefllt sind. That's it!
Auch wenn das PCX-Format auf Anhieb einfach aussieht, es gibt eine
Menge spezifischer Sachen und Sonderflle, die man beachten mu,
wenn man sich einen echten PCX-Viewer bastelt. Daher garantiere
ich auch, da mindestens 75% aller PCX-Dateien mit der Funktion
nicht darstellbar sind. Aber ich hoffe, die Infos haben erst
einmal gengt. Ach ja, die Routine braucht die Unit HartKodi, die
aber hoffentlich auch noch irgendwo in irgendeinem Verzeichnis
herumfunzt ( <- !)

                                    PCX you! FoWL
