Coders.ger Magazine | Programmieren
15



Grafik, Spiele, Demos
programmieren unter Linux
In einer losen Reihe wollen wir euch unter dem Namen Grafik, Spiele, Demos programmieren unter Linux in dieser und den nächsten Ausgaben in die Grafik und Effektprogrammierung unter dem freien Betriebsystem Linux einweisen. Der erste Teil dieser Reihe wird sich mit der SVGALIB und der Grafikausgabe beschäftigen. Die SVGALIB bietet Funktionen vom aktivieren eines Grafikmodis bis hin zum Zeichnen von Punkten und Linien. Leider unterstuetzt die SVGALIB Highcolor und Truecolor Modis nicht mit jeder Grafikkarte. Doch es gibt Abhilfe. Unterstützt die SVGALIB deine Grafikkarte nicht vernünftig installiere einfach die GGI-LIB und dazu das Paket SVGALIB4GGI von www.ggi-project.org. Danach lassen sich auch mit Deiner Karte 16, 24 und 32Bit Modis nutzen. Am Einfachsten läßt sich der Umgang mit einer Library an einem Beispiel erklären. Die beiden include-Zeilen fügen die Definitiotionen der Grafikfunktionen (vga.h / SVGALIB) und für die Standart Ein/Ausgabe (stdio.h) ein. In der Main Funktion wird dann in den Grafikmodus 320x240 bei 256
Beispiel 1:

#include <vga.h>
#include <stdoi.h>

int main ()
{
     int er;
// Grafikmodus einschalten
    er=vga_setmode(G320x240x256);       
// er<>0 bedeutet Fehler
...
// Zurrück zum Textmode
     vga_setmode (TEXT);
}


Farben geschaltet. Und darauf wieder zurück in den Textmodus. Ein anderer Grafikmodus wäre z.B. "G800x600x64K" (800x600 bei 16bit Farben). Alle Grafikmodi sind in der Datei /usr/include/vga.h aufgeführt. Kompiliert wird Beispiel 1 und auch alle anderen dieser Folge mit gcc -lvga NAME. Nun haben wir zwar den Grafikmodus aktiviert aber wie wir eine Grafik darauf ausgeben wissen wir noch nicht. Zum Setzen einzelner Punkte auf dem Bildschirm stellt die SVGALIB die Funktionen vga_setcolor (Farbwert) und vga_drawpixel (x,y). In Beispiel 2 wird kurz gezeigt wie man mit diesen Funktionen und mit vga_drawline (x1
Beispiel 2:

#include <vga.h>
#include <stdoi.h>

int main ()
{
     int er;
// Grafikmodus einschalten
    er=vga_setmode(G320x240x256);       
// er<>0 bedeutet Fehler

// Farbe 15 (Weiss) auswählen
     vga_setcolor(15);
// setzt Punkt bei 100,100
     vga_drawpixel (100,100);
// zeichnet eine Linie
     vga_drawline (150,150,450,450);
// warten auf Taste
     vga_getch();
// Zurrück zum Textmode
     vga_setmode (TEXT);
}


,y1,x2,y2) Pixel auf den Bildschirm bringt. Zur Darstellung einfacher Bilder und zum Zeichnen sind die Funktionen der SVGALIB schnell genug möchte man aber Animationen oder Demos programmieren wird man schnell an die Grenzen der vga_drawpixel - Funktion kommen. Erheblich schneller geht's wenn man anstatt jeden einzelnen Pixel mit vga_drawpixel zu berechnen und dann zu setzen direkt auf den Grafikspeicher der Grafikkarte zugreift. Dazu bietet die SVGALIB den Pointer graph_mem. Liest man diesen wie in unserem Beispiel 3 gezeigt aus kann man über ein Array auf den Grafikspeicher zugreifen und so schnellstmöglich Pixel setzen, löschen oder auslesen. Wenden wir

Beispiel 3:

#include <vga.h>
#include <stdoi.h>

int main ()
{
     int er;
     int i;
     short* vgamem;
// Diesmal ein 16Bit Modus
    er=vga_setmode(G800x600x64k);       
// er<>0 bedeutet Fehler

// Zeiger auf Bildschirmspeicher hohlen
 vgamem= (short *) graph_mem;

// Bildschirm Blau füllen
 for (i=0;i<800*600;i++)
  {
// Bildschimspeicheraddress i 63 (Blau)