Jay Link
Über den Autor:
Jay Link ist paarundzwanzig Jahre alt und lebt in Springfield,
Illinois. Weitere Hobbies neben Linux sind Bergsteigen und Fliegen. In seiner
wenigen freien Zeit ist er als Administrator bei InterLink BBS tätig,ein
(ungeplant) nicht kommerzieller Internetprovider, und jobbt gelegentlich,
um die Miete zahlen zu können.
M@il an den Autor
|
Grafikprogrammierung leicht gemacht: Eine Einführung in die SVGAlib
Wer auf der Suche nach
einer einfachen Möglichkeit der Grafikprogrammierung unter Linux ist,
wird bei der SVGAlib fündig werden. Die SVGAlib erlaubt es,
relativ leicht Programme mit Grafikunterstützung zu schreiben und
dabei den ganzen Zirkus um das X Window System zu vermeiden. Wer auch nur
die geringsten Kentnisse in C hat, kann die SVGAlib nutzen.
Was ist die SVGAlib?
Die SVGAlib ist eine Bibliothek für die Grafikprogrammierung unter
Linux. Sie erweitert die C Programmiersprache, welche keine Grafikunterstützung
bietet.
Aber es gibt doch eine Reihe von Programmen, welche in C geschrieben
sind und Grafik aufweisen !
Dies ist richtig, allerdings basieren sie alle auf zusätzlichen
Bibliotheken. C selbst bietet nur den Textmodus an, da alle Grafikfunktionen
abhängig vom jeweiligen Betriebssystem und nicht portierbar sind.
Leider arbeiten Grafikroutinen, die für ein bestimmtes
Betriebssystem entwickelt worden sind, nicht unter einem anderen System,
solange sie nicht komplett überarbeitet werden. Zum Beispiel sind
Grafikroutinen, programmiert für DOS oder Windows, unter Linux absolut
unbrauchbar.
Um C für die Grafikprogrammierung unter Linux zu nutzen, werden zusätzliche,
speziell für Linux entwickelte Funktionen benötigt, wie
sie eben zum Beispiel die SVGAlib bietet.
SVGAlib
ist einfach eine binäre C Bibliothek, die von anderen C Programmen
benutzt wird
|
Wie unterscheiden sich SVGAlib und das X Window System ?
Das X Window System (XFree86) ist serverbasiert. Bevor irgendein Programm,
welches X benötigt, laufen kann, muß der X Server gestartet
worden sein. Überdies sind die Systemanforderungen des X Servers recht
hoch, er ist ressourcenintensiv und unterbindet den Gebrauch der virtuellen
Konsolen (Alt 1-6).
SVGAlib hingegen erfordert keinerlei Vorbereitungen. Sie wird nicht "ausgeführt"
wie etwa der XServer. Vielmehr ist die SVGAlib einfach eine binäre
C Bibliothek, die von anderen C Programmen benutzt wird, genau wie alle
anderen Bibliotheken, die in den Verzeichnissen /lib und /usr/lib
zu finden sind. Ist die SVGAlib korrekt installiert, so fällt dem
einfachen Benutzer nicht einmal ihre Existenz auf. Auch zu beachten ist,
daß die virtuellen Konsolen durch den Einsatz der SVGAlib nicht beeinflußt
werden. Es ist weiterhin möglich, verschiedene Programme auf ihnen
laufen zu lassen. Kein Problem ist es zum Beispiel, auf einer Konsole
im Textmodus zu arbeiten, während auf einer anderen Konsole ein Programm
mit Grafikunterstützung läuft.
Nachteile
Es existieren viel mehr Programme für das X Window System, als für
die SVGAlib. Dies ist auf die Tatsache zurückzuführen, daß
das X Window System auf verschiedenen Plattformen (unter einer Reihe von
UNIX Derivaten) läuft, SVGAlib hingegen auf Linux beschränkt
ist. Desweiteren können unsauber geschriebene SVGAlib Programme die
Konsole zerschießen und so einen Reboot nötig machen. Letztendlich
sollte nicht allzu schnell wiederholt zwischen zwei Konsolen gewechselt
werden, auf denen jeweils gerade SVGAlib Programme laufen. Andernfalls
kann es zu Störungen der Bilddarstellung kommen, welche erst durch
einen Reboot behoben werden können.
Allerdings ist die Behauptung, SVGAlib sei ein Sicherheitsriskio, nur ein
Gerücht. Zwar müssen SVGAlib Programme mit "root"
Rechten gestartet werden (setuid root), die Rechte werden allerdings direkt
nach Beginn der Ausführung wieder abgegeben, so daß es keinen
Grund zur Sorge gibt.
Zusammenfassend kann man sagen, daß, trotz der obengenannten Nachteile,
der Geschwindigkeitsvorteil und die Einfachheit in der Nutzung die SVGAlib
für viele programmiertechnische Situationen recht interessant macht.
Beispiele
Für den Einsatz der SVGAlib müssen die Deklarationen ihrer Funktionen
in das C Programm eingebunden werden. Dies geschieht einfach durch #include
<vga.h> . Eines der einfachsten SVGAlib Programme ist: sample.c (hier herrunterladen)
#include <stdio.h>
#include <vga.h>
int main(void) {
vga_init();
vga_setmode(5);
vga_setcolor(4);
vga_drawpixel(10,10);
sleep(5);
vga_setmode(0);
exit(0);
}
Es wird ein einzelner roter Pixel auf dem Schirm gezeichnet. Nach
fünf Sekunden wird die Konsole wieder in den Textmodus umgeschaltet
und das Programm beendet.
Die erste Anweisung, vga_init(), gibt den "root" Status
auf und initialisiert die SVGAlib Bibliothek. In Zeile 2 wird mittels
vga_setmode(5)
Bildschirmodus 5 ausgewählt, welcher eine Auflösung von 320x200
bei 256 Farben realisiert (320x200x256). Dies kann alternativ durch den
Aufruf vga_setmode(G320x200x256) erreicht werden, beide Anweisungen
sind gleichwertig. Die nächste Anweisung, vga_setcolor(4),
bestimmt Rot als die aktuelle Zeichenfarbe. Es kann jeder Wert von 0 bis
255 gewählt werden. Durch andere Befehle stehen weitere Farben
zur Verfügung, allerdings werden erstmal nur die 256 Standardfarben
betrachtet. Zum Schluß wird bei den Koordinaten 10,10 der Pixel gezeichnet.
Dies ist elf Einheiten rechts vom linken Bildschirmrand und elf Einheiten
unterhalb des oberen Bildschirmrandes. Es sind elf und nicht zehn, da das
Koordinatensystem bei 0,0 anfängt, wobei die Koordinate 0,0 in der
oberen linken Bildschirmecke ist. vga_setmode(0) schaltet den
Bildschirm wieder in den Textmodus.
vga_setmode(text) ist identisch
zu vga_setmode(0). Es ist immer gut, dies am Ende des Programmes
zu tun. Andernfalls kann es zu Problemen kommen.
Um den Quelltext zu übersetzen, wird ganz normal gcc benutzt
(als "root" !). Zusätzlich muß -lvga angegeben
werden, da das Programm ja Funktionen der SVGAlib benutzt und an diese
gebunden werden muß. Es wird die Option -O3
benutzt, wodurch die höchste Optimierungsstufe eingestellt wird.
gcc -O3 -o sample sample.c -lvga
Damit das Programm auch von anderen Benutzern außer "root" genutzt werden
kann, muß man einfach das folgende Kommando ausführen:
chmod u+s sample
Das Programm wird gestartet durch den Aufruf von:
sample <oder wie auch immer es genannt worden ist>
Die Funktionen der Bibliothek werden in der Man-Page der SVGAlib beschrieben.
Statt diese jetzt hier alle zu erläutern, stelle ich ein weiteres
Beispielprogramm vor, das auf eine Gruppe von schnelleren SVGAlib
Funktionen zurückgreift: vgagl.
Aus der dazugehörigen Man-Page erfährt man, daß
vgagl
eine schnelle, auf Framebuffer Stufe arbeitende Grafikbibliothek ist, die
auf der SVGAlib basiert.
Prinzipiell bedeutet dies, daß einem umfangreichere Grafikfunktionen
zur Verfügung stehen, wie zum Beispiel das Zeichnen von geometrischen
Figuren mittels einer einzigen Anweisung.
Das folgende Programm benutzt vgagl. Es werden Farbabstufungen
in Blau dargestellt, wie sie von manchem Installationsprogramm benutzt
werden. Angefangen mit Hellblau am oberen Bildschrimrand, wird das Blau
zum unteren Rand hin dunkler. Im Unterschied zum ersten Beispiel wird auf
einem unsichtbaren "virtuellen" Bildschirm gezeichnet. Erst wenn alle Linien
gezeichnet worden sind, wird das fertige Bild in einem Zug auf den sichtbaren
"physikalischen" Bildschirm kopiert. Dadurch wird ein Flackern des
Bildschirmes verhindert, das Programm wirkt so ein wenig professioneller.
Man kann sich den virtuelle Bildschirm als "backstage" (hinter der
Bühne) vorstellen, wo "unsichtbar" die Vorbereitungen für die
jeweiligen Auftritte der Show stattfinden.
Das Kommando für die Übersetzung sollte wie folgt aussehen:
gcc -O3 -o gradient gradient.c -lvgagl -lvga
Wichtig ist, daß die Option -lvgagl vor -lvga
erscheint.
Es ist notwendig, daß vgagl immer als erste zu linkende
Bibliothek angegeben wird!
Auch nicht chmod u+s vergessen?
Hier ist der Quelltext: Download
#include <stdio.h>
#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>
GraphicsContext *physicalscreen;
GraphicsContext *virtualscreen;
int main(void) {
int i, j, b, y, c;
vga_init();
vga_setmode(5);
gl_setcontextvga(5);
gl_setcontextvgavirtual(5);
physicalscreen = gl_allocatecontext();
gl_getcontext(physicalscreen);
virtualscreen = gl_allocatecontext();
gl_getcontext(virtualscreen);
y = 0;
c = 0;
gl_setpalettecolor(c, 0, 0, 0);
c++;
for (i = 0; i < 64; i++) {
b = 63 - i;
gl_setpalettecolor(c, 0, 0, b);
for (j = 0; j < 3; j++) {
gl_hline(0, y, 319, c);
y++;
}
c++;
}
gl_copyscreen(physicalscreen);
getchar();
gl_clearscreen(0);
vga_setmode(0);
exit(0);
}
Zu beachten ist, daß nun #include <vgagl.h> zusätzlich
im Quelltext benötigt wird.
Zu Beginn werden zwei Zeiger für die beiden grafischen Kontexte deklariert:
GraphicsContext *physicalscreen
GraphicsContext *virtualscreen
Danach werden einige weitere Variablen deklariert und mittels vga_setmode()
der Bildschirmmodus gesetzt. Es wird wieder Modus 5 (G320x200x256) benutzt.
Beide Bildschirme, sowohl der "physikalische", als auch der "virtuelle"
Bildschirm müssen initialisiert und in den entsprechenden Variablen
die jeweiligen Kontexte gespeichert werden.
gl_setcontextvga(5)
gl_setcontextvgavirtual(5)
physicalscreen = gl_allocatecontext()
gl_getcontext(physicalscreen)
virtualscreen = gl_allocatecontext()
gl_getcontext(virtualscreen)
Nun wird festgelegt, daß wir mit dem virtuellen Bildschirm arbeiten
werden:
gl_setcontext(virtualscreen).
Mittels gl_setpalettecolor() werden 64 Blauschattierungen in der
Farbpalette definiert. Jeweils drei Linien werden im gleichen Blauton gezeichnet,
insgesamt 192 Linien. Die letzten 8 Linien würden eh in Schwarz gezeichnet
werden, fallen deswegen nicht weiter auf.
Sobald alle Linien gezeichnet worden sind, wird der Inhalt des virtuellen
Bildschirms auf den physikalischen Bildschirm mit gl_copyscreen(physicalscreen)
kopiert.
Diesmal wartet das Programm durch getchar() auf eine Benutzereingabe (Eingabe
durch irgendeine Taste), bevor es mit gl_clearscreen(0)
und vga_setmode(0) in den Textmodus zurückkehrt.
Einen Überblick über alle Funktionen der SVGAlib kann durch die
Eingabe von "man svgalib" und "man vgagl" gewonnen werden. Desweiteren
existiert zu jeder Funktion eine eigene Man-Page. Durch die hier gegebene
Einführung sollte man in der Lage sein, die neuen Befehle einfach
in eigene Programme einzubauen. Weitere hilfreiche Beispielprogramme kommen
mit der SVGAlib mit.
Die jeweils neueste Version der SVGAlib ist auf sunsite.unc.edu
in pub/Linux/libs/graphics oder auf tsx-11.mit.edu in
pub/linux/sources/libs zu finden. Zu der Zeit, als dieser Artikel
geschrieben wurde, war Version 1.3.0 die aktuelle Version.
Zum Schluß noch Folgendes: Die an sich recht gute Slackware Distribution
installiert die SVGAlib in die falschen Verzeichnisse. Nach der Installation
einer SVGAlib Version von Sunsite oder MIT ist dieses Problem behoben.
This website is
maintained by Miguel Angel Sepulveda
© Jay Link 1998
LinuxFocus 1998 |