LinuxFocus November 1998: Eenvoudige Graphics: Een Beginnerscurus voor SVGAlib Home Map Index Zoek Nieuws Archieven Links Over LF
[Top Bar]
[Bottom Bar]
[Foto van de Auteur]
Jay Link

Schrijf naar de auteur

Eenvoudige Graphics: Een Beginnerscursus voor SVGAlib

[Illustratie]

Ben je op zoek naar een eenvoudig grafisch pakkent voor je Linux systeem? Zoek dan niet verder. Met SVGAlib maak je makkelijk grafische applicaties en vermijd je de rompslomp van het X Window System. Met zelfs maar de meest elementaire kennis van programmeren in C kan je SVGAlib gebruiken.


Slechtst bekeken met Internet Explorer (probeer Netscape 4.5 het is beter)

Wat is SVGAlib?

SVGAlib is een low-level grafische bibliotheek (library) voor Linux. Het is een uitbreiding van de programmeertaal C, die geen ondersteuning biedt voor graphics.

En toch zijn er veel grafische programma's in C geschreven!

Inderdaad, maar ze maken allemaal gebruik van externe bibliotheek-functies. C zelf kan enkel om met tekst. Dat komt doordat grafische functies afhankelijk zijn van het systeem en niet omzetbaar zijn. Grafische routines die geschreven zijn voor een bepaald besturingssysteem werken niet op een ander, tenzij ze volledig herschreven worden. Grafische DOS-programma's b.v. zijn dus volledig nutteloos onder Linux

Om grafische code te schrijven in C onder Linux, is het nodig om een externe set van functies te gebruiken die voor Linux geschreven zijn. SVGAlib is zo'n set

SVGAlib is gewoon een binaire C bibliotheek die gebruikt wordt door C programma's

Hoe verschilt SVGAlib van het X Window Systeem?

Het X Window Systeem (XFree86) is eigenlijk een server. De server moet eerst gestart worden voor andere programma's hem kunnen gebruiken. Bovendien is de X server een veeleisend programma en verhindert het gebruik van virtuele consoles (Alt 1-6).

SVGAlib heeft zo'n voorbereiding niet nodig. SVGAlib wordt niet "uitgevoerd" zoals X Windows. SVGAlib is gewoon een binaire C bibliotheek die wordt gebruikt door C programma's, net zoals alle andere libraries in /lib en /usr/lib. Als SVGAlib goed geïnstalleerd is, merkt de gemiddelde gebruiker zelfs niets van het bestaan ervan. Tot slot beïnvloedt SVGAlib ook uw virtuele consoles niet, waardoor u nog steeds meerdere applicaties tegelijk kan uitvoeren zoals altijd. U kan gewone tekst hebben op de ene terminal en graphics op de andere.

Nadelen

Er zijn veel meer applicaties beschikbaar voor X Windows dan voor SVGAlib, doordat X systeem-onafhankelijk (cross-platform) is: het werkt op verschillende Unix-en. Enkel Linux gebruikt SVGAlib. Ook kunnen slecht geschreven SVGAlib applicaties de console in de war brengen, zodat de computer moet herstart worden. Het te snel wisselen tussen consoles die SVGAlib gebruiken kan bovendien een 'monitor corruption' veroorzaken, waardoor u ook moet herstarten.

Toch is het een mythe dat SVGAlib niet veilig is. De programma's die SVGAlib gebruiken moeten 'ge-setuid' worden als root, maar dat privilege wordt meteen na de installatie opgeheven. Er is niets om u zorgen over te maken.

De snelheid en de gebruiksvriendelijkheid van SVGAlib maken het aantrekkelijk in veel situaties. Vooral als je wil experimenteren met graphics.

Voorbeelden

Om SVGAlib te gebruiken moet je het aanmelden in het C programma. Voeg gewoon #include <vga.h> toe. Hier is een van de eenvoudigste SVGAlib programma's dat er is: Download

#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);
}

Dit zal een enkele rode pixel op uw scherm tekenen. Na vijf seconden zal het uw console terug in tekst modus schakelen, en stoppen.

Merk het eerste commando op, vga_init(). Dit heft de root status op en initialiseert de SVGAlib bibliotheek. De tweede regel, vga_setmode(5) , zet het scherm in mode 5, namelijk 320x200x256. Dit betekent dat het scherm een rooster wordt van 320 pixels breed, 200 hoog, en met ondersteuning van 256 kleuren. Hetzelfde kan bereikt worden met vga_setmode(G320x200x256). Het volgende commando, vga_setcolor(4) , maakt van rood de huidige kleur. Elke waarde van 0 tot 255 is mogelijk. Met andere commando's zijn meerder kleuren beschikbaar, maar voor dit voorbeeld beperken we ons tot deze basiskleuren. Nu tekenen we de pixel op het coördinaat 10, 10 . Dit is 11 plaatsen rechts van de linker rand van het scherm, en 11 plaatsen naar beneden. Het is 11 en niet 10 omdat het rooster begint bij 0. Coördinaat 0,0 is in de linker bovenhoek. vga_setmode(0) zet het scherm terug in tekst modus. Hiervoor kan ook vga_setmode(text) gebruikt worden. Het is aan te raden om dit altijd te doen aan het eind van een programma. Anders maak je het voor de gebruikers onnodig ingewikkelder.

Om deze code te compileren, gebruik je de gewone gcc compiler. De SVGAlib moet ook gelinkt worden met de compiler met de -lvga optie. Tot slot beveel ik aan om -O3 te gebruiken, het beste niveau van optimalisatie. De opdracht ziet er dan als volgt uit:

gcc -O3 -o sample sample.c -lvga

Om het bruikbaar te maken voor andere gebruikers dan de root, typ:

chmod u+s

Om uit te voeren, typ gewoon:

sample     <of hoe je het ook genoemd hebt

De volledige set van SVGAlib commando's staat beschreven in de SVGAlib man page. We bekijken ze niet allemaal, want voor het volgende programma maken we gebruik van een snellere set van SVGAlib functies: vgagl.

Typ "man vgagl", en je zult zien dat vgagl een "snelle, framebuffer-niveau grafische bibliotheek gebaseerd SVGAlib" is. Eigenlijk geeft het u toegang tot ingewikkelde grafische functies, zoals de mogelijkheid om met één commando vormen te tekenen.

Hieronder staat een programma dat vgagl gebruikt. Het zou een blauwe verlooptint (gradient) moeten weergeven, net zoals de achtergrond van sommige installatieprogramma's. Het begint lichtblauw aan de bovenkant van het scherm en wordt steeds donkerder naar beneden toe. Een verschil met het eerste programma is dat het tekenen gebeurt op een onzichtbaar "virtueel" scherm. Wanneer alle lijnen getekend zijn, wordt de afgewerkte afbeelding in één beweging gekopieerd naar het echte scherm. Dit voorkomt flikkeringen van het beeld, en doet uw programma er meer professioneel uitzien. Bekijk het virtuele scherm als een "backstage", een plaats waar 'decorstukken' in elkaar worden gezet tussen de 'bedrijven' door.

Om te compileren, typ:

gcc -O3 -o gradient gradient.c -lvgagl -lvga

Merk op dat -lvgagl vóór -lvga staat. Het is verplicht om vgagl eerst aan te roepen. Vergeet chmod u+s niet!

Hier is de code: 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);
}
	  

Merk op dat we #include <vgagl.h> moeten toevoegen.

We beginnen de code met de grafische context in te stellen:

GraphicsContext *physicalscreen
GraphicsContext *virtualscreen

Dan declareren we de variabelen en gebruiken we vga_setmode() om de scherm modus te kiezen, hier 5 zoals voorheen.

We moeten zowel het zichtbare "fysieke" scherm als het onzichtbare "virtuele" scherm initialiseren. Daarna slaan we de twee contexten op in variabelen:

gl_setcontextvga(5)
gl_setcontextvgavirtual(5)
physicalscreen = gl_allocatecontext()
gl_getcontext(physicalscreen)
virtualscreen = gl_allocatecontext()
gl_getcontext(virtualscreen)

Nu maken we duidelijk dat we met het virtuele scherm gaan werken: gl_setcontext(virtualscreen).

gl_setpalettecolor() geeft 64 blauwtinten. We tekenen 3 lijnen per tint, voor een totaal van 192 lijnen. De overige acht lijnen zijn toch al zwart, dus die laten we zo.

Wanneer het beeld klaar is, kopiëren we de inhoud van het huidige (virtuele) scherm naar het fysieke scherm met gl_copyscreen(physicalscreen).

Deze keer laten we de gebruiker bepalen hoe lang het beeld zichtbaar blijft. getchar() wacht op invoer van de gebruiker. Nadat eender welke toets aangeslagen is, maken we het scherm leeg met gl_clearscreen(0) en keren we met vga_setmode(0) terug naar tekst.

De volledige set van functies van SVGAlib kan bekeken worden door "man svgalib" en "man vgagl" te typen. Iedere functie heeft zijn eigen man page. Na het lezen van deze introductie ben je in staat om vrij eenvoudig nieuwe commando's in je eigen programma's op te nemen. En er zijn ook nog de demo programma's die bij SVGAlib zitten waar je van kan leren.

Als een bepaalde distributie niet volledig is, kan je de laatste versie van SVGAlib vinden op sunsite.unc.edu in pub/Linux/libs/graphics of op tsx-11.mit.edu in pub/linux/sources/libs . Op het moment van schrijven is de huidige versie 1.3.0.

Tot slot: de Slackware distributie, nochtans een goede, heeft de neiging om SVGAlib in de verkeerde directories te installeren. Het downloaden en installeren van een nieuwe SVGAlib distributie van de vermelde adressen lost dat probleem op.


Oorspronkelijk in het Engels.
Vertaald door Floris Lambrechts


Deze website wordt onderhouden door Miguel Angel Sepulveda
© Jay Link 1998
LinuxFocus 1998