Zeichenwerkzeuge routinenweise (Teil 3)

Herzlich willkommen zum dritten Teil von »Mikrodraw«. Heute sind der Rest des reduzierenden Lassos, die Block-Effekt-Funktionen sowie die Textausgaberoutine an der Reihe.

Diesmal wenden wir uns verschiedenen Grafikeffekten und der Darstellung von Texten zu. Doch zuvor noch mehr Informationen zur Lasso-Funktion. In der letzten Ausgabe erklärten wir das normale Lasso. Die reduzierende Version verfährt ein zweites Mal auf ähnliche Weise, um eine andere Maske zu erzeugen. Das Umgrenzungsrechteck setzen wir auf den ansonsten leeren Bildschirm, kopieren den bereits zum ersten Mal ausmaskierten Originalausschnitt dort hinein und füllen erneut mit Schwarz. Wieder setzt ein »PUT«-Befehl die Vorlage im »AND-NOT«-Modus darüber, und das Ziel ist fast erreicht. In »bild$(2)« befindet sich nun die Maske, »biId$(3)« enthält nach wie vor das Original. Wir nähern uns dem Ende: »lasso_kopieren« erledigt den Rest. Einfach aber wirkungsvoll sorgen zwei »PUT«-Befehlefür ein maskiertes Erscheinen der Vorlage. Der erste setzt die Maske so auf den Hintergrund, daß lediglich Raum für das Original bleibt, der zweite fügt dieses ein. Soweit zum Thema »kopieren und bewegen«. Letzteres ist, wie bereits im letzten Teil erwähnt, nur eine Unterart des Kopierens. Der Ablauf aller Effektfunktionen ähnelt sich, sodaß wir die vergleichbaren Teile nur einmal beschreiben. So beginnen alle Routinen dieser Sparte nach der Vereinbarung lokaler Variablen mit den beiden Funktionen »Vollbild«, die den Bildschirm freiräumt und die Menüleiste ausblendet, und »raster«, womit der Anwender den Bereich anwählt, auf den sich die folgende Bearbeitung bezieht. Dann folgt eine Sicherheitsabfrage auf die Größe des angewählten Ausschnitts.

Wenden wir uns dem Biegen zu. Allerdings fallen unsere Erläuterungen dazu weniger ausführlich aus, denn ein großangelegter Kursus in angewandter Geometrie unter besonderer Berücksichtigung der gesammelten Winkelfunktionen sollte unser Programmierkurs eigentlich nicht werden. Wer die mathematischen Grundlagen beherrscht, erkennt die angewendeten Formeln wieder - wer nicht, darf die Probe aufs Exempel machen: Es funktioniert, auch wenn man nicht alles unbedingt begreift. Die Biegerei geht in drei Stufen vor sich: Zunächst legt der Anwender fest, welchen Ausschnitt er verbiegen möchte - das erledigt die Procedure »raster«. Sodann bestimmt er den Grad der Biegung, das passiert in der DO-LOOP-Schleife, die ein dem gewählten Ausschnitt in der Größe entsprechendes Rechteck nach oben oder unten biegt. Schließlich berechnet das Programm den Inhalt des verbogenen Ausschnitts. Dabei findet eine Funktion Verwendung, die erst im GFA-Basic 3.0 enthalten ist: »RC_COPY«, die den Einsatz umfangreicher Bit-Manipulationen auf Assembler-Ebene erspart. Schließlich erhält das bearbeitete Bildmaterial per Aufruf von »kopieren« seinen endgültigen Platz zugewiesen. Beim Verzerren geht es so weiter: Den angewählten Block holen wir nach »a$« und setzen ihn mittenzentriert auf den inzwischen gelöschten Bildschirm.

Effektfunktionen, die Juwelen von Mikrodraw

Die daraus resultierenden neuen horizontalen Eckkoordinaten legen wir in »xa%« und »xe%« ab. Jetzt geht es los. Nachdem der Quell-Puffer »c$« belegt ist, startet eine DO-LOOP-Schleife, in der die Verzerrung stattfindet. Die IF-Abfrage hält den ausgewählten Bearbeitungsbereich innerhalb der Bildschirmgrenzen. »xe%« ist die neue Endkoordinate. In »d« berechnen wir den Skalierungsfaktor, den wir später für die Verzerrungsstärke benötigen. Er setzt die horizontale Veränderung in Relation zur vertikalen Ausdehnung des Bearbeitungsausschnitts.

**Ein gutes Grafikprogramm zu entwickeln, kostet viel Arbeit. K. Lavassas, einer der Väter von Lava-draw, machte sich die Mühe. In GFA-Basic erschafft er Ihren speziellen Zeichenkasten.**

Die folgende FOR-NEXT-Schleife läßt den verzerrten Ausschnitt auf dem Bildschirm erscheinen. Von oben nach unten fortschreitend, kopieren wir den Quellpufferinhalt aus »c$« per RC_COPY so um, daß sich die kopierte Zeile mit steigender Entfernung vom vertikalen Startpunkt immer weiter horizontal (um den Faktor »d«) verschiebt, woraus sich die Verzerrung ergibt. Ist der Anwender mit der Wirkung einverstanden und beendet er per Mausklick rechts die Verzerrung, berechnen wir die Ausschnittsgröße neu und übergeben an die Kopierfunktion, die das Ergebnis an gewünschter Stelle plaziert.

Die beiden Software-Spiegel arbeiten sehr ähnlich. Sie unterscheiden sich im wesentlichen in der Steuerung der Laufvariablen: von links nach rechts bzw. von oben nach unten. Auch hier findet die GFA-Basic-Funktion RC-COPY Anwendung. Ihren Einsatz schauen Sie sich am besten im Listing der Verzerrfunktion an, wo die ausführlichen Kommentare Ihnen das Verständnis erleichtern. Die Spiegelei besteht im Grunde nur aus einer Kopieraktion, in der die betreffende Zeileninformation quasi »rückwärts« erscheint.

Einfach, aber wirkungsvoll ist auch die folgende Procedure »bild-manipulation«. Sie führt die Aktionen Solarisation, Verstärken und Verdünnen aus, indem sie den Quellausschnitt mit entsprechendem Kopiermodus mehrfach auf den Bildschirm setzt. Die Solarisation führt dazu, daß der Quellausschnitt, jeweils um einen Pixel nach oben/unten und links/rechts versetzt, auf das Original aufkopiert wird. Ein abschließender Durchgang an ursprünglicher Stelle, aber im XOR-Modus, löscht die eigentliche Information, und es bleiben lediglich die »drumherum«-kopierten Bildteile übrig. Beim Verstärken bleibt es bei den zusätzlichen Pixeln, beim Verdünnen läßt die AND-Verknü-pfung die versetzten Kopien zum Lösch-Angriff werden - nur die Pixel »in der Mitte« bleiben stehen. Wie das Ergebnis der drei Aktionen aussieht, zeigt unser Bild.

Auch die Format-Änderung, »formen« genannt, ist einfacher, als der erste Blick dies vermuten läßt. Der Trick besteht darin, je nach Verhältnis zwischen Ursprungs- und Ziel-Größe eine entsprechende Zahl von Bildschirmzeilen/-spalten auszulassen bzw. doppelt zu verwenden. Auch hier sorgt RC_COPY erschaubaren Code. Die ursprüngliche Version der Procedure arbeitete noch mit BITBLT und seinen endlosen Parametertabellen.

Nachdem der Quellbereich markiert ist, sorgt eine Sortierung der Koordinaten dafür, daß die linke obere und rechte untere Ecke mit jeweils den entsprechenden Koordinaten belegt sind. Dann legen wir den Quellbereich in »a$« ab. Mit der Alertbox »Blockformen - proportional - beliebig« gestatten wir es dem Anwender, den Zielbereich entweder völlig unabhängig oder den Proportionen der Vorgabe entsprechend zu bearbeiten.

Mit diesem Menü gestaltet der Anwender das Aussehen der Textausgabe in Microdraw

Wer also eine maßstabsgetreue Vergrößerung bzw. Verkleinerung benötigt, der sollte die proportionale Funktion benutzen.

In zwei Durchgängen erfolgt nun die eigentliche Formatänderung.

Je nachdem, ob der ursprüngliche Ausschnitt größer oder kleiner als das Ziel ist, verwenden wir die zugehörige Koordinate als Begrenzung der Laufvariablen, also »ym%« bzw. »yl%«. Vergleichbares gilt für den zweiten Durchgang, wenn wir die Ausschnittbreite bearbeiten. Dort kommt entweder »xm%« oder »xl%« zum Einsatz. Von besonderer Bedeutung ist jeweilsdie Variable »d«, diedas Verhältnis von Quelle zu Ziel rechnerisch repräsentiert. Sie dient dazu, die entsprechende Zahl von Pixeln zu überspringen bzw. doppelt zu kopieren. Wer sich genaueren Einblick verschaffen möchte, läßt sich den Wert von »d« durch eine provisorisch eingeschaltete Print-Anweisung mit folgender Tastaturabfrage (VOID GEM-DOS(8)) anzeigen. Abschließend berechnen wir die neuen Koordinaten und übergeben das Ergebnis an die Kopierfunktion.

Die Funktion »Invertieren« ist noch am wenigsten kompliziert. Sie holt den zu verändernden Block einfach nach »a$« und gibt ihn per Invert-Kopiermo-dus wieder aus. Mehr ist nicht zu tun. Um allerdings auf so wenig Programmplatz diese Wirkung zu erzielen, bedarf es der erwähnten Hilfsfunktionen (z. B. »raster«), ohne die der gesamte Aufbau ungleich komplizierter ausfallen würde. Grundsätzlich ist bekanntlich der Erfolg einer Programmieraktion maßgeblich davon abhängig, inwieweit es gelingt, die gestellten Aufgaben in sinnvolle Abschnitte zu zerlegen, die durch mehrfachen Aufruf doppelte Code-Erzeugung zu vermeiden helfen. Kommen wir zum letzten Funktionsblock für heute, der Textabteilung. Wie bei den anderen Funktionen teilt sich die Arbeit in eine Attribut- und eine Aktionsprocedure auf. Wer mag, sollte die »textart«-Routine zu den anderen Parameterfunktionen kopieren, »textart« zeigt ein weiteres Verfahren zur Ermittlung von Parametern: das Nachvollziehen der Anwenderreaktion. Zunächst bauen wir unser Textmenü in der FOR-NEXT-Schleife auf. Wie das Ganze am Ende aussieht, zeigt unser Bild. Sodann erfragen wir den Wunsch des Anwenders: Wir verbinden eine bestimmte vertikale Mausposition mit einer Kombination von Textattributen. Das gewünschte Textbild erscheint invertiert - eine Anwendung der Puffertricks, der im großen das gesamte Programm durchzieht. Per Mausklick verlassen wir das Menü. Anstatt jetzt direkt aus der Mausposition auf die Attribut-Kombination zu schließen, die der Anwender wünscht, lassen wir die READ-Schleife noch einmal ablaufen - bis wir beim Ziel angekommen sind, um sodann die beiden Parameter »ta%« und »tg%« zu übernehmen.

Eine eigene »Textabteilung« wurde nicht vergessen

Umfangreicher ist die Funktion »text-schreiben« ausgefallen. Zunächst räumen wir mit »Vollbild« den Bildschirm frei und setzen die aktuellen Textparameter. Per »VDISYS 38« ermitteln wir die Höhe der gerade aktivierten Zeichengröße. Dann initialisieren wirdas »Bäumchen-wechsel-dich«-Spiel mit den Bildschirmpuffern, um darauf in der DO-Schleife die Tastaturabfrage durchzuführen. Die eingetippten Buchstaben erscheinen auf einer Art Lineal, das den linken Rand und die horizontale Position beschreibt. Die Bedienung unseres Mini-Editors erklärt sich aus dem Listing:

< Del > löscht die gesamte aktuelle Zeile, < Esc > verläßt die Funktion, < Backspace > löscht das letzte Zeichen im Eingabestring, < Return > setzt die letzte Zeile auf den Schirm und positioniert das Eingabefeld eine Zeile (also eine Buchstabenhöhe) darunter. Ist das eingegebene Zeichen keines der bislang behandelten, so binden wir es an den Eingabestring. Bei den nun folgenden Scan-Codes bewirkt < Undo > , daß alles, was bei diesem Funktionsaufruf bislang an Text auf dem Schirm erschienen ist, wieder verschwindet.

< Help > dagegen bringt die letzte Zeile wieder in den Bearbeitungsrahmen, also auf das Lineal. Solange die Maustasten ungedrückt bleiben, ist der eingegebene Text frei auf dem Bildschirm positionierbar. Erst ein Mausklick links setzt ihn an der aktuellen Position fest auf das Bild.

So wirken sich die Funktionen »Solarisieren«, »Verdünnen« und »Verstärken« auf einen Grafiktext aus

Soweit zum eigentlichen Programmteil. Als zusätzliches Bonbon legt Konstantinos Lavassas eine Effekt-Routine bei, die einen interessanten Titelvorspann erzeugt. Im Hintergrund beschreibt die Routine den Schirm mit dem gewünschten Text. Sodann belegt sie je nach »Effektdichte« eine Anzahl von Puffern, die sodann im Abstand »my%« von oben in das Bild »hineinfallen«. Ein beliebiger Tastendruck beendet die Routine, die Sie auf Wunsch in den Programmstart einbauen.

Das war's für heute. Im nächsten und letzten Teil beschäftigen wir uns ausführlich mit einem 9-Nadel-treiber für den Ausdruck und zeigen, wie man auf die Zeichenfläche von »Lavadraw« von GFA-Basic aus zugreift und für diese Profisoftware eigene Programmodule entwickelt. Diese Änderung des »Kursfahrplanes« war durch die zahlreichen Effektfunktionen unvermeidlich. Auch diesmal soll der Hinweis nicht fehlen, daß Sie ruhig auf Unverstandenes, Unverständliches oder zu Kompliziertes hinweisen dürfen. Unsere Anschrift finden Sie im Impressum. (uh)

Kursübersicht

Teil 1: Menüleiste aufbauen,Systemfunktionen, Diskettenoperationen, Zeichenfunktionen
Teil 2: Blockoperationen wie Lassoaktionen, kopieren, bewegen, biegen
Teil 3: Grafik-Effekte, Textdarstellung, Titel- und Vorspanngenerator
Teil 4: Erweiterungen und Feinheiten


Ulrich Hilgefort Konstantinos Lavassas
Aus: TOS 08 / 1990, Seite 84

Links

Copyright-Bestimmungen: siehe Über diese Seite