Farbe aufs Papier

Ausdruck von DEGAS-Bildern mit HP DeskJet 500C

Die Beliebtheit des DeskJet 50OC von Hewlett 
Packard ist sp„testens seit der CeBIT '92 stark 
angestiegen. Doch leider ist die mitgelieferte 
Software nicht sehr ST-Benutzer-freundlich. 
Mit folgendem Programm lassen sich Bilder vom 
DEGAS.PI1-Format in Farbe ausdrucken.

Kaum hat man den Drucker ausge- 
packt, schon geht das Problem los. 
Die Handbcher verweisen den 
Benutzer, der nun gleich einen Farbaus- 
druckmachen m”chte, auf die mitgeliefer- 
te Software. Doch leider wird diese nur fr 
DOS- bzw. Microsoft Windows angebo-
ten. Lediglich einen mden Dreizeiler als 
Testfarbdruck kann man sofort erzeugen. 
Oder man strapaziert sein Farbband und 
erzeugt mittels Druckerdsenreinigung 
einen mehrzeiligen Dreifarbausdruck. Der 
Nicht-nur-Anwender wirft natrlich so- 
fort einen Blick in das Handbuch und
entdeckt folgende Steuercodes, um die 
Farbpalette Cyan-Yellow-Magenta einzu- 
stellen:

  027, 042, 114, 045, 051, 055

Doch leider fhren anschliežende Grafik- 
ausgaben nicht zum Erfolg. Um es kurz zu 
machen: Die Befehlsfolge ist leider falsch 
angegeben, und das Umschalten zwischen 
den Farben in einer Zeile ist erst berhaupt 
nicht erw„hnt. Aber solche Fehler finden 
sich leider in vielen Druckerhandbchern. 
Doch abgesehen von diesem Manko hat 
man einen hervorragenden Drucker vor 
sich, der, hat man seine Funktionsweise 
erst einmal durchschaut, wundersch”ne 
Mehrfarbbilder erzeugen kann.

Farbe auf dem DeskJet 500

Jeder Grafikausgabe sollte eine Initiali- 
sierung vorausgehen, die den Drucker 
auf die folgenden Grafikdaten vorbereitet. 
Zun„chst erfolgt das Umschalten auf 
die Cyan-Yellow-Magenta-Farbpalette 
(CYM-Palette):

  027, 042, 114, 045, 051 ,085

Die Grafikaufl”sung kann zwischen 75, 
100, 150 und 300 Punkten pro Zoll betra- 
gen. Dazu muž die Anzahl der Punkte pro 
Zoll in ASCII-Werte umgerechnet werden.

  ,75':,7' (ASCII = 55) ,,5' (ASCII = 53) 
  ->055, 053 
  ,300': ,3' (ASCII = 51) ,,0' (ASCII = 48) 
  ->  051, 048, 048

Die allgemeine Einstellung lautet: 027, 
042, 116, #...#, 082, wobei #...# die ASCII- 
Werte der Aufl”sung sind, also stellt die 
Befehlsfolge:

  027, 042, 116, 051, 048, 048, 082

den Drucker auf 300 Punkte pro Zoll ein. 
Der relative vertikale Pixel-Versatz nach 
jeder Grafikzeile (frher Y-Offset) muž 
auf ,0' (ASCII = 48) gesetzt werden

  027, 042, 098, 048, 089

Die eigentliche Grafikausgabe erfolgt zei- 
lenweise. Es gibt dafr zwei Grafikbefeh- 
le. Der eine veranlažt den Drucker, in der 
gerade aktuellen Farbe zu drucken, bleibt 
aber anschliežend in der Zeile, um ein 
erneutes Drucken mit der n„chsten Farbe 
zu erm”glichen. Der Befehl lautet:

027, 024, 098, #...#, 118 (#...# = Anzahl der 
                                       Bytes)

Der andere druckt in der aktuellen Farbe, 
fhrt anschliežend aber zu einem Sprung 
in die n„chste Grafikzeile, quasi einem 
Carriage-Return bei normalem Textaus- 
druck vergleichbar. Er lautet:

  027, 042, 098, #...#, 087

Zuerst druckt man in Cyan, dann in Ma- 
genta, schliežlich in Yellow, darauf er- 
folgt die n„chste Zeile. Dies erreicht man 
durch folgende Befehlsfolge:

  027, 042, 098, #...#, 118 + Grafikdaten fr 
                                    Farbe Cyan 
  027, 042, 098, #...#, 118 + Grafikdaten fr 
                            Farbe Magenta 
  027, 042, 098, #...#, 087 + Grafikdaten fr 
                            Farbe Yellow

Durch šbereinanderdrucken der drei 
Grundfarben erh„lt man weitere vier Far- 
ben. Cyan und Yellow ergeben Grn, Cyan 
und Magenta ergeben Blau, Yellow und 
Magenta ergeben Rot, alle drei Farben 
zusammen ergeben Schwarz. Mit Weiž 
sind es somit acht ,echte' Farben. Vor dem 
Ausdruck jeder Grafikzeile muž dem Com- 
puter die Anzahl der Bytes mitgeteilt wer- 
den, die gedruckt werden sollen, wobei
jedes Byte acht Punkten nebeneinander 
entspricht. Bit 7 entspricht dem linken, Bit 
0 dem rechten Punkt. Dabei muž die An- 
zahl der Bytes zun„chst wieder so in ASCII- 
Werte umgerechnet werden, wie dies be- 
reits oben beschrieben wurde, also z.B. : 40 
Punkte nebeneinander entsprechen 5 Bytes. 
DerASCII-Wertvon ,5' ist 53. DerBefehl 
wrde lauten:

  027, 042, 098, 053, 118 + 5 weitere Bytes

Um 320 Punkte zu drucken, hieže dies: 
320 Punkte entsprechen 40 Bytes. ASCII- 
Wert von ,4' ist 52, ASCII-Wert von ,0' 
ist 48.

  027, 042, 098, 052, 048, 118 + 40 
                              weitere Bytes

An einem Beispiel soll diese Theorie nun 
noch einmal verdeutlicht werden. Es sol- 
len alle acht Farben nebeneinander in der 
niedriegsten Aufl”sung gedruckt werden 
und zwar in folgender Reihenfolge: Weiž, 
Cyan, Magenta, Yellow, Blau, Grn, Rot, 
Schwarz. Zum Drucken von acht Punkten 
reicht ein Grafik-Byte. Zuerst wird in Cyan 
gedruckt, welche in den Farben Cyan (lo- 
gisch), Blau, Grn und Schwarz enthalten 
ist. Es mssen also die Bits 6, 3, 2 und 0 
gesetzt werden (siehe Bild 3). Man erh„lt 
den Dezimalwert ,77'. Magenta ist in den 
Farben Magenta, Blau, Rot und Schwarz 
enthalten,also sind die Bits 5, 3, 1 und 0 zu 
setzen (siehe Bild 3), man erh„lt den Dezi- 
malwert ,43'.Yellow schliežlich ist in den 
Farben Yellow, Grn, Rot und Schwarz 
enthalten. Dies entspricht den Bits 4, 2, 1 
und 0 (siehe Bild 3), der Dezimalwert 
betr„gt ,23'. Somit fhren zusammenfas- 
send folgende Befehle zu dem Gewnschten:

   027, 042, 114, 045, 051, 085 
      CYM-Farbpalette 
   027, 042, 1 1 6, 055, 053, 082 
      75 Punkte pro Zoll 
   027, 042, 098, 048, 089 
      Y-Offset auf ,0' 
   027, 042, 098, 049, 118, 077 
      Farbe Cyan 
   027, 042, 098, 049, 118, 043 
      Farbe Magenta 
   027, 942, 098, 049, 087, 023 
      Farbe Yellow

Hat man einmal die Sucht nach Farbe 
berhaupt befriedigt, entsteht schnell der 
Wunsch nach mehr Farben. In diesem Fall 
hilft es nur, durch geschicktes Nebenein- 
andersetzen und Mischen der acht Grund- 
farben das menschliche Auge zu berli- 
sten. Um einen farbigen Bildschirmpunkt 
auzudrucken, verwende ich daher eine 
Matrix aus 6x6 Punkten, in der die acht 
Grundfarben so angeordnet sind, daž man 
den Eindruck einer neuen Farbe erh„lt. 
  Der ATARI-ST stellt seine 512 Farben 
aus den drei Farben Rot, Grn und Blau 
mit je acht Helligkeitsstufen zusammen 
(8*8*8=512). Den Wert einer Farbenenne 
ich RGB-Wert, der somit Werte von 000 
bis 777 annehmen kann. Doch wie k”nnen 
diese Farben jetzt mit Hilfe der Drucker- 
farben Cyan, Magenta und Yellow darge- 
stellt werden? 
  Am einfachsten ist es, wenn man sich 
zun„chst den Ausdruck der acht Grundfar- 
ben Weiž, Cyan, Magenta, Yellow, Blau, 
Grn, Rot und Schwarz berlegt. Farbe 
Weiž (RGB-Wert 777) wrde bedeuten, 
daž der Drucker keine Farbe druckt, d.h. 
die Grafikdaten fr Cyan, Magenta und 
Yellow bestnden also nur aus Nullen. 
Diese Druckerfarbanweisung nenne ich 
CMY-Wert (Cyan-Magenta-Yellow- 
Wert), also in diesem Falle: CMY-Wert= 
000. Reines Rot hat den RGB-Wert 700, 
auf dem Drucker mžten die Farben Yel- 
low und Magenta gedruckt werden. Der 
CMY-Wert erh„lt den Wert 077. Dabei 
bedeutet ,0', daž kein Cyan enthalten ist. 
Die erste ,7' steht vorerst fr Magenta 
drucken, die zweite ,7' fr Yellow druk- 
ken. Schwarz hat den RGB-Wert 000; da 
alle Druckerfarben miteinander gemischt 
werden mssen, um Schwarz zu erhalten, 
ist der CMY-Wert 777. Daraus folgt, daž 
sich die Farben Rot-Cyan, Grn-Magenta 
sowie Blau-Yellow komplement„r zuein- 
ander verhalten, d.h. ist die Farbe Grn auf 
dem Bildschirm vorhanden, mssen Cyan 
und Yellow, nicht aber Magenta gedruckt 
werden. (Daher auch die Bezeichnung 
CMY und nicht CYM!). Damit sind bisher 
nur die acht Grundfarben bercksichtigt; 
wie sieht es aber mit den anderen 504 
Farben aus?

Analog zu obiger Feststellung k”nnte man 
annehmen, daž eine Bildschirmfarbe, die 
Rot ganz, Grn zur H„lfte und kein Blau 
enth„lt, also den RGB-Wert 730 hat, den 
CMY-Wert 047 haben mžte, und tat- 
s„chlich liegt man mit dieser šberlegung 
goldrichtig. Doch was bedeutet ein CMY- 
Wert von 047 fr den Drucker? Wie kann 
man,wenn,0'bedeutet: ,keine Farbedruk- 
ken' und ,7' bedeutet: ,Farbe drucken', 
den Wert ,4' drucken? Die L”sung heižt: 
man erstelle sich eine Matrix (oh Gott, 
schon wieder Mathematik), die die Werte 
1 bis 7 enth„lt, z.B.

  1742653 
  5317426 
  2653174 
  7426531 
  3174265 
  6531742 
  4265317
 
Diese Matrix (die allgemeine Drucker- 
maske) gilt fr jede der drei Druckerfar- 
ben. Hat Cyan wie im obigen Beispiel 
(CMY-Wert 047) den Wert ,0', bedeutet 
das, daž an keiner Stelle dieser Matrix die 
Farbe Cyan gedruckt werden soll. Magen- 
ta hat den Wert ,4', d.h. an allen Stellen der 
Matrix mit den Werten  1 bis 4 soll Magen- 
ta gedruckt werden. Yellow schliežlich 
hat den Wert ,7', d.h. an allen Stellen der 
Matrix wird Yellow gedruckt. Anhand 
zweier grafischer Beispiele sei das Ver- 
fahren noch einmal verdeutlicht (siehe Bild 
4). Jeweils links befindet sich die Origi- 
nalfarbe mit zugeh”rigem RGB-Wert. 
Rechts daneben sieht man in abnehmen- 
der Aufl”sung die Farbe, wie sie vom 
Drucker anhand der Matrix erstellt wird. 
Man erkennt, wie nach und nach die vom 
Drucker erstellte ,Mischfarbe' den Ein- 
druck der linken Originalfarbe annimmt. 
Je kleiner ein Druckerpunkt, d.h. je besser 
die Druckeraufl”sung dabei ist, desto bes- 
ser das Ergebnis.

Zun„chst muž das Degas-PI1-Bild ab Spei- 
cheradresse filepos geladen werden. Die-
se Routine ist im Listing nicht enthalten. 
Sie kann auch von einem anderen Pro- 
gramm aus erfolgen, wichtig ist nur, daž 
am Ende ab Speicheradresse filepos das 
Bild im Speicher steht. Die ersten 32034 
KBytes eines jeden Degas-PI1-Bildes sind 
fr uns von Interesse. Die zwei ersten 
Bytes geben die Aufl”sung und die Spei- 
cherart (compressed oder uncompressed) 
an. Die folgenden 32 Bytes enthalten In- 
formationen zu den 16 Farben, gefolgt von 
den 32000 Bytes fr das eigentliche Bild. 
  Listing 1 enth„lt das Hauptprogramm. 
Da nicht jeder ST-Besitzer ohne weiteres 
knapp 1 MByte zur Verfgung stellen kann, 
die ein komplettes Bild belegen wrde, 
wird immer eine Bildschirmzeile berech- 
net (bestehend aus 320 Bildpunkten, die 
aus jeweils 6x6 Druckerpunkten bestehen, 
das ganze fr alle drei Druckerfarben) und 
diese ausgedruckt. Dadurch belegt das ge- 
samte Programm nur maximal 70 KByte. 
Zun„chst werden die Grundfarbmasken 
fr die 16 Farben erstellt. Das sind jene 
Masken, die fr jede der 16 Farben eine 
Matrix fr jede der drei Druckerfarben 
enthalten. Somit braucht der Computer 
anschliežend nur noch den Bildschirm 
Punkt fr Punkt abzufragen und kann den 
Bildschirmpunkt entsprechend dieser 
Masken ausgeben (ab m2 stehen die allge- 
meinen Druckermasken, ab filepos2 die 
16 Farben des Bildes, abfilepos3 das ei- 
gentliche B i Id, ab4die fertigen Masken im 
Speicher). Dies geschieht ab schleife 11. 
Da der Drucker immer 8 Bits auf einmal 
ausgibt, die Druckermatrix fr einen Bild- 
schirmpunkt jedoch 6x6 Pixel enth„lt, 
mssen Teile der Punkte auf die zu druk- 
kenden Bytes verteilt werden. D.h. das 
erste gedruckte Byte enth„lt 6 Pixel des 
ersten Bildschirmpunktes und zwei Pixel 
des zweiten, das zweite Byte enth„lt die 
restlichen 4 Pixel des zweiten Bildschirm- 
punktes und die ersten vier Pixel des drit- 
ten Punktes, das dritte Byte enth„lt die 
letzten zwei Pixel des dritten Bildschirm- 
punktes und alle 6 Pixel des vierten Punk- 
tes. Danach wiederholt sich alles von vor- 
ne. Die Routinen, die dieses Verschieben 
berechnen, wiederholen sich zum Teil und
sind daher gesondert abgedruckt (Listing 
2 + 3). Sie sind an die entsprechende Stelle 
in das Hauptprogramm (siehe Listing 1) 
einzufgen. Hierzu gehe man wie folgt 
vor: Man gebe zun„chst Listing 1 ein. An 
der Stelle, wo man auf die Listings 2 und 
3 verwiesen wird, fahre man mit der Ein- 
gabe von Listing 2 fort. Dieses Listing 2 
wird insgesamt viermal hintereinander be- 
n”tigt.  Die jeweiligen  Unterschiede kann 
man dem Listing 3 entnehmen. D.h. an den 
Stellen A-G sind beim ersten Mal die Be- 
fehle von A1-G1 aus Listing 3 einzuset- 
zen, beim zweiten Mal die Befehle A2-G2 
usw. Am Ende fahre man mit der Eingabe 
von Listing 1 ab weiter8: fort. 
  Ab Schleife_8 schliežlich wird die ent- 
sprechende Bildschirmzeile ausgedruckt. 
Listing 4 enth„lt die Unterprogramme, um 
das Bild zu zentrieren (ab leer), um eine 
bestimmte Anzahl von Zeichen zu druk- 
ken (ab druck) und um die Grundfarbmas- 
ken zu erstellen (ab mask). 
  Die entsprechenden Labels/Zeiger fr 
verschiedene Zwischenspeicher, das ei- 
gentliche Bild (abfilepos), die Grundfarb- 
masken (ab f), Druckermasken fr Cyan 
(d_0), Magenta (d_1) und Yellow (d_2) 
sowie die allgemeine Druckermaske (ab 
m2) sind in Listing 5 definiert.

Ich habe bewužt mehr Wert darauf gelegt, 
das Verfahren zu beschreiben als das As- 
sembler-Listing. Auf GEM-Einbindung 
wurde verzichtet, um das Programm nicht 
unn”tig in die L„nge zu ziehen. 
   Durch die Einbindung eines Drucker- 
Spoolers k”nnte der Druckvorgang, der 
momentan bei ca. 15 Minuten/Bild liegt, 
im Hintergrund stattfinden. Noch interes- 
santer w„re allerdings das Ausdrucken von 
Grafiken mit 512 Farben (z.B. Spektrum 
512). Aufgrund der L„nge des vollst„ndi- 
gen Listings wurden hier nur die wichti- 
gen Routinen abgedruckt. Das fertige Pro- 
gramm und das gesamte Listing findet sich 
auf der  Monatsdiskette  zur  ST-Computer.

                             Oliver Gimm