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.
|