Atom Nieuws 2000 nr 2
../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif
pagina 11

Graphics.h

door Roland Leurs

Wie wel eens geprogrammeerd heeft op de Atom-in-PC en dan overstapt naar het Linuxplatform, merkt dat er toch nog wat ontbreekt. Onder Linux programmeert men hoofdzakelijk in de taal C. Verder zijn de grafische mogelijkheden beperkt. Hoewel, er is een library, SVGALIB, die de programmeur toegang geeft tot de grafische kaart. En daarmee komen ook onder Linux de grafische mogelijkheden ter beschikking.

Voor deze SVGALIB heb ik een aantal routines geschreven die sterk lijken op de grafische commando's van het Atom-in-PC terminal programma. Voor mij wordt het betrekkelijk eenvoudig om programma's over te zetten van Atom-in-PC naar Linux.

void block(int mode, int xlo, int ylo, int xrb, int yrb)

Deze functie tekent een rechthoek in grafische mode. De parameter 'mode' geeft aan of de rechthoek geheel ingekleurd moet worden: mode=0 kleurt de rechthoek niet in, mode<>0 kleurt de rechthoek wel in. De overige vier parameters zijn de x- en y coördinaten van de linker benedenhoek en de rechter bovenhoek.

void circle(int mode, int x, int y, int r)

Tekent een cirkel met het middelpunt (x,y) en straal r. Indien mode=0 zal de cirkel niet ingekleurd worden; mode<>0 zal de cirkel vullen. Bij het tekenen van de cirkel wordt rekening gehouden met een grafisch venster en verschoven oorsprong. Speciale vul-effecten kunnen bereikt worden door het gebruik van setlinestyle().

void drawline(int x1, int y1, int x2, int y2)

Trekt een lijn van (x1,y1) naar (x2,y2) waarbij rekening gehouden wordt met een grafisch venster en verschoven oorsprong.

void grmod(int mouse)

Zet de VGA kaart in 640 x 480 x 16 kleuren mode. Reset de grafische venster en de oorsprong, voert de vgalib-functies vga_init(), vga_mode(4) en vga_clear() uit. Deze functie is de initialisatie functie voor de VGA toolkit. Voor sommige Linuxversies is het noodzakelijk om in deze functie ook de muis te initialiseren; dit kan door de parameter MOUSE op te geven; indien de muis niet gebruikt wordt geeft u NOMOUSE als parameter.

void gwindow(int xlo, int ylo, int xrb, int yrb)

Deze functie stelt een grafisch venster in waarbinnen getekend mag worden. Buiten dit venster worden geen pixels geplot. Het venster ligt relatief ten opzichte van een eventueel verschoven oorsprong. De vier parameters vormen de linker onderhoek en rechter bovenhoek van het venster.

Het grafisch venster heeft alleen effect op grafische functies van deze toolkit; svga-lib functies werken hier niet mee.

void gwinoff(void)

Maakt de werking van gwindow weer ongedaan zodat alle pixels op het scherm geplot kunnen worden. Hierbij wordt rekening gehouden met een grafische oorsprong.

void gwrite(char *s, int x, int y, int hsize, int vsize)

Schrijft een string in grafische mode. De string wordt aangegeven in *s, x en y zijn de positie op het scherm waar de tekst geschreven wordt; hsize en vsize zijn de horizontale en vertikale schaalfactor om grotere tekens op het scherm te plaatsen.

Alvorens deze functie te gebruiken dient een font geladen te zijn met de loadfont functie. Pixels die niet gezet worden door een karakter blijven ongewijzigd; de karakters zijn als het ware transparant.

void init_keyboard(void)

Initialiseert het toetsenbord in non-canonical mode (d.w.z. wacht niet op een afsluitende <enter> en verkleint de inputbuffer tot 1 byte. Hiermee kan d.met een getchar() aanroep één enkele toetsaanslag gelezen worden.

int kbhit(void)

Nadat het toetsenbord met init_keyboard in non-canonical mode is ingesteld kan met deze functie gecontroleerd worden of er een teken in de toetsenbord-buffer staat. De functie retourneert '0' als er geen teken in de buffer staat. Het teken kan met een getchar() aanroep gelezen worden.

int loadfont(char *f)

Het font dat opgeven wordt in de string 'f' wordt in het interne fontgeheugen geladen. De functie retourneert een van de volgende codes:

0 - Font is geladen

1 - Font bestand niet gevonden of kan niet geopend worden

2 - Font geheugen kan niet gereserveerd worden.

void origin(int x, int y)

Met origin() kan de grafische oorsprong verplaatst worden naar een willekeurige positie op het beeldscherm. Alle graphische functies, met uitzondering van gwrite (en de daarvan gebruik makende functies zoals printdec en scroll), werken vanaf deze ingestelde oorsprong. Default ligt deze oorsprong in het punt (0,0); dit is de linker bovenhoek van het scherm.

De verschoven oorsprong heeft alleen effect op grafische functies van deze toolkit; svga-lib functies werken hier niet mee.

int paint(int x, iny, int border, int nr)

Met deze functie kleurt u ingesloten vlakken met een patroon of één enkele kleur. Het inkleuren begint vanaf de opgegeven x- en y-positie. Het ingesloten vlak wordt aangegeven met de 'border' parameter.

Indien een patroon opgegeven wordt dient het patroon nummer te liggen tussen 0 en MAXPATTERN (gedefinieerd in graphics.h). Voor het kleuren in een vaste kleur geeft u het patroonnummer -1 op.

Deze functie geeft de onderstaande waarden terug:

0 - Geen fout opgetreden

1 - Patroonnummer is groter dan MAXPATTERN

2 - Er zijn geen patronen gedefinieerd

int paintdef(int nr, char *pattern)

Met deze functie kunt u de patronen voor paint() definieren. Een patroon is 256 bytes groot en bestaat uit 16 rijen van 16 pixels. Elk pixel wordt middels één byte weergegeven; dit byte bevat het kleurnummer van het patroon. De parameter 'nr' geeft het patroonnummer aan (ligt tussen 0 en MAXPATTERN) en '*pattern' wijst naar een array met de patroon informatie.

De functie retourneert de volgende waarden:

0 - Geen fout opgetreden, patroon is gedefinieerd

1 - Patroonnummer groter dan MAXPATTERN

2 - Geheugen voor patroonopslag kan niet gereserveerd worden

void plotpix(int x, int y)

Plot het punt (x,y) waarbij rekening gehouden wordt met een grafisch venster en verschoven oorsprong.

void printdec(int v, int n, int x, int y, int hsize, int vsize)

Schrijft het getal 'v' in grafische mode in decimale digits. De parameter 'n' geeft aan hoeveel digits afgedrukt moeten worden. Voorloop nullen worden niet afgedrukt. De parameters x en y geven de positie op het scherm aan; hsize en vsize geven de karaktergrootte op. Deze functie maakt gebruik van de gwrite functie.

Let op: de pixels die niet gezet worden door een digit worden niet gewist. Als deze functie gebruikt wordt voor een teller (bijv. score of tijd) dient eerst de oude scherminhoud gewist te worden.

void restore_keyboard(void)

Herstelt het toetsenbord naar de normale werking nadat dit met init_keyboard in non-canonical mode gezet is. Deze functie moet altijd aangeroepen worden alvorens het programma te eindigen.

void scroll(char *s, int scrolllen, char c, int x, int y, int hsize, int vsize, int col, int bgcol)

Laat een bericht over het scherm scrollen. De tekst wordt aangewezen met *s. De parameter 'scrollen' geeft aan hoeveel tekens de scrollengte is. De lengte van de string mag korter of langer zijn dan de scrollende tekst. De parameters x en y geven de positie op het scherm aan; hsize en vsize geven de karaktergrootte op. 'col' geeft de voorgrondkleur weer en 'bgcol' geeft de achtergrondkleur op (om de scrollende tekst te wissen). Deze functie maakt gebruik van de functie gwrite; daarnaast moet het toetsenbord in non-canonical mode staan (zie init_keyboard).

void setlinestyle(int style)

Hiermee kan de verschijningsvorm van lijnen bepaald worden. Zo zijn o.a. stippellijnen en speciale effecten te verwezenlijken. De stijl is een 16-bits integer waarbij voor elk '1' bit een pixel gezet wordt en voor elk '0' bit een pixel niet gezet wordt (bestaande pixels worden dus niet gewist!). Opheffen van een stijl kan door de parameter 0xFFFF op te geven. De stijl heeft alleen effect op grafische functies van deze toolkit; svga-lib functies werken hier niet mee.

Een aantal stijlen zijn als macro gedefinieerd:

SOLID_LINE getrokken lijn

DOTTED_LINE Stippellijn bestaande uit puntjes

CENTER_LINE Hartlijn

DASHED_LINE Stippellijn bestaande uit streepjes

void triangle(int mode, int x1, int y2, int x2, int y2, int x3, int y3)

Deze functie tekent een driehoek tussen de punten (x1, y1),(x2,y2) en (x3,y3). Deze driehoek wordt ingekleurd indien 'mode' ongelijk aan 0 is, bij 'mode' gelijk aan 0 zullen alleen de randlijnen getekend worden.

void txmod(void)

Herstelt de tekstmode door het uitvoeren van de vgalib-functie vga_mode(TEXT).

Twee programma's die ik al omgezet heb zijn Triples en Memory. Deze twee spellen zijn eerder al voor de Atom-in-PC geschreven. Nu dus ook beschikbaar onder Linux. Ter zijner tijd wil ik ook nog een DOS-versie schrijven (dit zal enkele minimale aanpassingen vergen van de Linuxversies).

Voor Memory maak ik gebruik van een tweede set functies, de sprites. Ook de sprites heb ik op soortgelijke wijze als bij de Atom-in-PC gemaakt. Hierover leest u meer in het volgende nummer van Atom Nieuws.

../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif