Malprogramm TT Paint 256, Teil 2

Unser 256-Farben-TT-Malprogramm erhält nun Grund- und Menüfunktionen, die bereits am Ende dieser Folge einfaches Freihandmalen und Farbauswahl gestatten.

Zum Betrieb eines Malprogramms sind grafische Funktionen notwendig, sog. grafische Primitive. »TTPaint« verwendet hierzu ausschließlich Routinen, die von der grafischen Benutzungsoberfläche GEM bereitgestellt werden. Es nutzt die Ausgabefunktionen »v_pline« zum Zeichnen von Punkten, Linien und ungefüllten Polygonen, »v_fillarea« zum Zeichnen gefüllter Polygone, »v_bar« zum Zeichnen von gefüllten bzw. ungefüllten Rechtecken, »v_ellipse« zum zeichnen von gefüllten bzw. ungefüllten Ellipsen und »v_gtext« zur Textdarstellung.

Um die Art der Ausgabe zu beeinflussen, existieren Attributfunktionen, die im Rahmen der defensiven Programmierung vor jeder Ausgabefunktion mit den gewünschten Parametern aufgerufen werden sollten. Es werden z. B. die Attributfunktionen zum Setzen der Zeichenfarbe, Linienstärke, Fülltyp und Schreihmodus verwendet.

Ferner müssen Funktionen zur Mauszeigersteuerung angewandt werden. Dazu gehören »vq_mouse« zur Mausstatusabfrage, »v_show_c« und »v-hide_c« zum Ein- bzw. Abschalten des Grafik-Cursors. Die beiden letzten Funktionen werden benötigt, um Veränderungen des Hintergrunds durch den Mauszeiger zu verhindern. Die Routine »graf_mouse« bestimmt das Aussehen des Grafik-Cursors.

Da Ausgabefunktionen typischerweise sehr oft gebraucht werden, erscheint es sinnvoll, gekapselte Grundfunktionen zu implementieren, die durch geeignete Parameter alle benötigten Attribute setzen und die gewünschte Ausgabefunktionen aufrufen. So entstehen die grafischen Grundfunktionen Plot, Point, Line, Box, Ellipse, Polygon und Text. In diesen Funktionen werden nicht alle von GEM unterstützten Attributfunktionen genutzt, eine Erweiterung ist jedoch ohne weiteres möglich. Natürlich müßten dann selbstverständlich neue Menüfunktionen in TTPaint integriert werden, was aber überhaupt kein Problem ist, wie Sie sehen werden.

TTPaint setzt sich aus vier Arbeitsbereichen zusammen: der Toolbox, in der sich alle Werkzeuge zum Bearbeiten der Grafik (z.B. Linien, Kreis etc.) durch Mausklick auswählen lassen, dem Farbmischer, in dem sich einzelne Farben der Farbpalette aus den Grundfarben Rot, Grün und Blau zusammenstellen lassen (additive Farbmischung), der Farbpalette, in der die Pinselfarbe aus 256 Farbvarianten gewählt wird und schließlich aus der Arbeitsfläche, auf der die Werkzeuge eingesetzt werden.

Die Toolbox wird mittels der Funktion »Draw_Menue« aufgebaut. Man unterscheidet zwischen statischen und veränderlichen Icons. Die veränderlichen Icons geben Auskunft, ob Rechtecke, Ellipsen und Polygone un- bzw. gefüllt angewendet werden. Der Farbmischer ist in diesem Kursteil noch nicht integriert. Zur Anzeige der Farbpalette wird über die Funktion »Show_Colors« ein 32 x 8 großes Farbfeld gezeichnet.

Die Funktion »Check_Toolbox« überwacht die Werkzeugkiste. Zunächst überprüft sie, ob die linke Maustaste gedrückt ist und ob sich der Mauszeiger im Bereich der Werkzeugkiste befindet. Ist dies der Fall, wünscht der Benutzer eine Menüauswahl. Jetzt muß die Berechnung erfolgen, welche der Funktionen angeklickt wurde. Die Toolbox besteht aus 4 x 4 Feldern. Die Zuordnung eines Felds zu einem Funktionscode geschieht so: Transformation der Mauskoordinaten auf die Toolbox-Koordinaten durch Subtraktion der Koordinaten der linken oberen Toolbox-Ecke Mx, My.

Die Felder sind fest auf die Größe 40 x 40 Pixeln gesetzt. Daraus ergibt sich eine Gesamtgröße der Toolbox von 160 x 160 Pixeln. Die transformierten Mauskoordinaten werden durch 40 (Feldgröße) dividiert. Jetzt können die X- und Y-Koordinaten logischerweise nur im Intervall [0,3] liegen. Diese Werte müssen nun zu einem Funktionscode (Code) verknüpft werden. Dies geschieht durch Verschieben des Y-Werts um 2 Bit nach links, um 2 Bit Platz für den X-Wert zu schaffen, der nun in den Code mittels Oder-Verknüpfung eingefügt wird. Der Code liegt jetzt im Intervall [0,15] (Y x 4 + X) und ist bereit zur Auswertung. Als Echo für den Benutzer wird die angewählte Funktion markiert (»Mark_Icon«).

Die Toolbox-Funktionen enthält sofort aktivierbare Verwaltungs- und Zeichenfunktionen, die erst nach Wechsel zum Arbeitsblatt aktiv werden. Die Werkzeugkiste läßt sich folgendermaßen um weitere Funktionen erweitern: Das Menü muß weiter nach oben verschoben (My) und die Größe der Toolbox entlang der y-Achse vergrößert werden (z. B. 160 x 200 für 20 statt 16 Felder). Diese Vergrößerung muß in der Routine »Check_Toolbox« und natürlich in »Draw_Menue« berücksichtigt werden. Bei 4 x 5 Feldern liegt der Funktionscode dementsprechend im Intervall [0,19]. Die neuen Werkzeuge sind dann entweder in »Use_Tool« aufzurufen, falls es sich um Malfunktionen handelt oder in »Check_Toolbox«, wenn neue Verwaltungsfunktionen integriert werden sollen.

Die Farbpalette wird von der Funktion »Check_Colorbox« überwacht. Hierzu verwendet sie die Funktion »Get_Colorindex«, die den neuen Farbindex zurückliefert oder den alten beibehält, falls der Benutzer keine neue Farbe angeklickt hat. Außerdem werden die Slider im Farbmischer aktualisiert, was jedoch in dieser Folge noch keine Wirkung zeigt. Die Funktion »Get_Colorindex« berechnet den Index der Farbe nach dem gleichen Verfahren, das bei der Bestimmung des Funktionscodes bei der Menüauswahl angewendet wurde. In der Farbpalette erhält der Benutzer ein Echo auf seine Eingabe. Die gewählte Farbe wird umrahmt, die alte demarkiert. Im Farbmischer wird die aktuelle Zeichenfarbe dargestellt. Alle Malfunktionen werden über die Funktion »Use_Tool« aufgerufen. Der Benutzer muß dazu die rechte Maustaste drücken, um auf das Arbeitsblatt zu gelangen. Der Funktionscode »Code« wird ausgewertet und in die entsprechende Funktion verzweigt.

Die Überwachung aller Benutzereingaben ist die Aufgabe der Funktion »Get_User_Interaction«. Sie enthält die Hauptschleife von TTPaint, in der die Funktionen »Check_Colorbox« »Check_Toolbox« und »Use-Tool« so lange durchlaufen werden, bis durch die Verwaltungsfunktion »Quit« das Terminierungsflag gesetzt wird. Die Funktion »TTPaint« initialisiert das Malprogramm mittels »Init_TTPaint« und verzweigt zur Hauptfunktion »Get_User_Interaction«.

In »Init-TTPaint« werden Basisparameter gesetzt, die Farbpalette initialisiert »Init_Palette« und Menü- sowie Arbeitsbildschirm gelöscht. Danach wird das Menübild durch »Draw_Menue« aufgebaut. Das Default-Tool »Freihand« wird markiert. Routinen zum Retten und Setzen der Farbpalette sind in den Funktionen »Get_Palette« und »Set_Palette« enthalten. Da in einem Malprogramm üblicherweise die Farbpalette verändert wird, muß natürlich die Eingangspalette gerettet und vor Verlassen des Programms restauriert werden.

Der Wechsel vom Menübild zum Arbeitsblatt und umgekehrt wird von den Funktionen »To_Paper« und »To-Menue« übernommen. Die beiden Funktionen warten zunächst bis die rechte Maustaste losgelassen wird. Dann wird mit der XBIOS-Funktion »Set_Screen« auf den jeweils anderen Screen umgeschaltet.

Da nun alle Voraussetzungen zur Programmierung der Werkzeuge von TTPaint gegeben sind, folgen zwei Verwaltungsfunktionen: »Quit« und »Erase« sowie die Zeichenfunktion »Free_Hand«. Das Werkzeug Erase »löscht« nach Rückfrage das Arbeitsblatt. Die Rückfrage erfolgt über eine Alertbox, das Löschen des Arbeitsblattes erfolgt mittels »v_clrwk«. Quit setzt nach Rückfrage das globale Terminierungsflag »Ende« und springt zum Desktop.

Zum Abschluß der zweiten Folge die erste Zeichenfunktion: »Free_Hand«. Diese Funktion setzt gemäß der Mausposition Punkte in der gewählten Farbe, solange die linke Maustaste gedrückt bleibt. Zum Setzen der Punkte wird das Unterprogramm »Point« verwendet, das wiederum gefüllte Kreise über GEM zeichnet. So werden unterschiedliche Pinselstärken möglich.

Aufgrund der noch fehlenden Funktionen werden auch jetzt noch während des Übersetzens mehrere Warnings ausgegeben. In der nächsten Folge ergänzen wir Disketten- und nahezu alle Zeichenfunktionen.

TT Paint Source 09/1992

Carsten und Hendrik Behrens/hu



Aus: ST-Magazin 09 / 1992, Seite 70

Links

Copyright-Bestimmungen: siehe Über diese Seite