Adaptoarele grafice sunt prevăzute cu o zonă de memorie în care se păstrează date specifice gestiunii ecranului. Această zonă de memorie poartă denumirea de memorie video.
În mod grafic, ecranul se consideră format, după cum am precizat, din puncte luminoase numite pixeli. Poziţia pe ecran a unui pixel se defineşte printr-un sistem de coordonate (x,y) cu x coloana şi y linia în care este afişat pixelul.
În cazul adaptoarelor color, unui pixel îi corespunde o culoare. Culoarea pixelilor se păstrează pe biţi în memoria video. Memoria video necesară pentru a păstra starea ecranului setat în mod grafic, se numeşte pagină video. Adaptoarele pot conţine mai multe pagini video. Gestiunea culorilor este dependentă de tipul de adaptor grafic existent la microprocesor.
Numărul maxim de culori pentru adaptoarele EGA este de 64 (numerotate de la 0 la 63). Cele 64 de culori nu pot fi afişate simultan pe ecran. În cazul adaptorului EGA se pot afişa simultan 16 culori. Mulţimea culorilor care pot fi afişate simultan pe ecran se numeşte paletă. Culorile din componenţa unei palete pot fi modificate de utilizator prin intermediul funcţiilor standard. La iniţializarea modului grafic se setează o paletă implicită.
Pentru adaptorul EGA există un tablou de 64 de culori (cu coduri între 0 şi 63) din care se selectează cele 16 culori pentru paletă. Există şi constante simbolice foarte sugestive cu numele culorilor în engleză. Funcţiile de gestiune a culorilor pot avea ca parametri nu numai codurille culorilor ci şi aceste constante simbolice.
Culoarea fondului este întotdeauna cea corespunzătoare indicelui 0 din paletă. Culoarea pentru desenare este cea corespunzătoare indicelui 15.
Culoarea de fond poate fi modificată cu ajutorul funcţiei setbkcolor care are prototipul:
void far setbkcolor (int culoare);
unde:
-
culoare = index în tabloul care defineşte paleta.
Exemplu: setbkcolor (BLUE); setează culoarea de fond pe albastru.
Pentru a cunoaşte culoarea de fond curentă se poate apela funcţia getbkcolor de prototip:
int far getbkcolor (void);
Ea returnează indexul în tabloul care defineşte paleta pentru culoarea de fond.
Culoarea pentru desenare poate fi modificată folosind funcţia setcolor de prototip:
void far setcolor(int culoare);
unde:
-
culoare = index în tabloul care defineşte paleta.
Exemplu: setcolor (YELLOW); setează culoarea pentru desenare în galben.
Culoarea pentru desenare se poate determina apelând funcţia getcolor de prototip:
int far getcolor (void);
Ea returnează indexul în tabloul care defineşte paleta relativ la culoarea pentru desenare.
Paleta curentă poate fi modificată cu funcţiile setpalette şi setallpalette. Prima funcţie se foloseşte pentru a modifica o culoare din paleta curentă şi are prototipul:
void far setpalette (int index, int cod);
unde:
-
index este un întreg din {0,. . . , 15} şi reprezintă indexul în tabloul care defineşte paleta pentru culoarea care se modică;
-
cod este un întreg din intervalul {0, 1,. . . , 63} şi reprezintă codul culorii care o înlocuieşte în paletă pe cea veche.
Exemplu: setpalette (DARKGRAY, 45); modifică culoarea corespunzătoare
indicelui DARKGRAY (adică 8) prin
culoarea de cod 45.
Funcţia setallpalette permite modificarea simultană a mai multor culori din compunerea paletei şi are prototipul:
void far setallpalette (struct palettetype far *paleta);
unde:
-
palettetype este un tip definit în fişierul graphics.h astfel
struct palettetype
{ unsigned char size;
unsigned char colors [MAXCOLOR+1];
};
cu - size dimensiunea paletei
-
colors tablou ale cărui elemente au ca valori codurile componente ale paletei care se defineşte.
Modificarea paletei curente cu ajutorul funcţiilor setpalette şi setallpalette conduce la schimbarea corespunzătoare a culorilor afişate pe ecran în momentul apelului funcţiilor respective.
Pentru a determina codurile culorilor componente ale paletei curente se va folosi funcţia getpalette de prototip:
void far getpalette (struct palettetype far *paleta);
Paleta implicită poate fi determinată folosind funcţia getdefaultpalette de prototip:
struct palettetype *far getdefaultpalette(void);
Numărul culorilor dintr-o paletă poate fi obţinut apelând funcţia getmaxcolor de prototip:
int far getmaxcolor (void);
Funcţia returnează numărul maxim de culori diminuat cu 1. Deci în cazul adaptorului EGA funcţia returnează valoarea 15.
O altă funcţie care determină dimensiunea paletei este funcţia getpalettesize cu prototipul:
int far getpalettesize (void);
Funcţia returnează numărul culorilor componente ale paletei. În cazul adaptorului EGA funcţia returnează valoarea 16.
Exemplu:
Programul următor afişează codurile culorilor pentru paleta implicită:
#include
#include
#include
#include
void main (void)
{ int gd = DETECT, gm, i;
struct palettetype far *pal = (void *) 0;
initgraph (&gd, &gm, “C:\\BORLANDC\\BGI”);
pal = getdefaultpalette ();
for (i=0; i<16; i++)
{ printf (“colors[%d]=%d\n”, i, pal -> colors[i]);
getch ();
}
closegraph();
}
În mod grafic ecranul se compune din n*m pixeli. Pixelul din stânga-sus are coordonatele (0,0), iar pixelul din dreapta-jos are coordonatele (n-1,m-1).
În BGI există mai multe funcţii care permit utilizatorului să obţină informaţii despre:
-
coordonata maximă pe orizontală;
-
coordonata maximă pe verticală;
-
poziţia curentă (pixelul curent);
-
etc.
int far getmaxx (void); returnează abscisa maximă;
int far getmaxy (void); returnează ordonata maximă;
int far getx (void); returnează poziţia pe orizontală (abscisa) pixelului curent;
int far gety (void); returnează poziţia pe verticală (ordonata) pixelului curent.
Exemplu:
#include
#include
#include
#include
void main (void)
{ int gd = DETECT, gm, cul_fond, cul_desen, curent_x,curent_y, maxx, maxy;
initgraph (&gd, &gm, “C:\\BORLANDC\\BGI”);
cul_fond = getbkcolor();
cul_desen = getcolor();
maxx = getmaxx();
maxy = getmaxy();
curent_x = getx();
curent_y = gety();
closegraph();
printf (“culoarea fondului = %d\n”, cul_fond);
printf (“culoare desenare = %d\n”, cul_desen);
printf (“abscisa maxima = %d\n”, maxx);
printf (“ordonata maxima = %d\n”, maxy);
printf (“abscisa curenta = %d\n”, curent_x);
printf (“ordonata curenta = %d\n”, curent_y);
printf (“acionai o tasta pentru terminare”);
getch();
}
Dostları ilə paylaş: |