HomeMapIndexSearchNewsArchivesLinksAbout LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
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

[Ilustration]


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.


Worst viewed with Internet Explorer (try Netscape 4.5, it is better) 

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.

gradient

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.

Übersetzung: Harald Radke
This website is maintained by Miguel Angel Sepulveda
© Jay Link 1998
LinuxFocus 1998