Professional Documents
Culture Documents
6.1. Introducere
Pentru un calculator personal (PC) exist dou moduri diferite de afiare a informaiilor pe un ecran: mod text (caractere alfabetice, numerice, de punctuaie i speciale) i mod grafic. Toate dispozitivele de afiare, numite monitoare sau display-uri utilizeaz tehnica de compunere a imaginilor text sau grafice prin aprinderea pe ecran cu intensiti i culori diferite a unor zone de dimensiuni foarte reduse, aproape punctiforme, numite pixeli, organizate ntr-o reea de puncte. Densitatea acestei reele de puncte ale ecranului, numit rezoluie, constituie o caracteristic important a echipamentului, considerat cu att mai bun cu ct rezoluia este mai mare. Alte caracteristici care le difereniaz sunt: numrul de culori, viteza de afiare, numrul de puncte alocate zonei de afiare a unui caracter, etc. Interfaarea monitoarelor cu unitatea central este realizat prin intermediul unor dispozitive numite adaptoare, cum ar fi: CGA (Color Grafics Adapter), EGA (Extended Grafics Adapter), VGA (Video Grafics Adapter).
MCGA
pagini 1 1 1 1 1 1 1 1
ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 MCGAC3 MCGAMED MCGAHI EGA EGALO EGAHI EGA64 EGA64LO EGA64HI EGA-MONO EGAMONOHI EGAMONOHI HERC HERCMONOHI ATT400 ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400MED ATT400HI VGA VGALO VGAMED VGAHI PC3270 PC3270HI IBM8514 IBM8514HI IBM8514LO 3 4 5 0 1 0 1 3 3 0 0 1 2 3 4 5 0 1 2 0 1 0 320 x 200 640 x 200 640 x 480 640 x 200 640 x 350 640 x 200 640 x 350 640 x 350 640 x 350 720 x 348 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 640 x 400 640 x 200 640 x 350 640 x 480 720 x 350 1024 x 760 640 x 480 C3 2 culori 2 culori 16 culori 16 culori 16 culori 4 culori 2 culori 2 culori 2 culori C0 C1 C2 C3 2 culori 2 culori 16 culori 16 culori 16 culori 2 culori 256 culori 256 culori 1 1 1 4 2 1 1 1 2 2 1 1 1 1 1 1 2 2 1 1
unde
B = mod afiare (0 = continu, 1 = intermitent); FFF = codul culorii utilizate pentru fundal; CCCC = codul culorii utilizate pentru afiarea caracterului. n afar de caracterele ASCII obinuite: litere, cifre, semne de punctuaie, pentru afiarea pe ecran se pot utiliza i caractere speciale din setul ASCII extins. Caracterele care fac parte din acest set i nu fac parte din cel clasic sunt cele semigrafice, cu care se pot face diferite desene, caractere din alfabetul grecesc i caractere cu specific matematic. Pentru a indica poziia curent, pe ecran se afieaz un cursor de form dreptunghiular, a crui dimensiune n cadrul unui caracter poate fi controlat prin program.
ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 Pentru a memora coninutul ecranului se utilizeaz o zon de memorie special n afara spaiului de memorie utilizat pentru programe, denumit memorie ecran. Numrul maxim de puncte ce pot fi afiate i numrul de culori utilizate pentru aceasta, n modul grafic determin dimensiunea memoriei ecran. Pentru o interfa clasic memoria utilizat pentru ecran are adresa de segment 0xB800. Deoarece pe ecran exst mult mai multe puncte dect caractere, n memoria ecran pot fi memorate informaiile corespunztoare mai multor imagini de ecran text. De exemplu, pentru un ecran text n rezoluie mare sunt necesari 80 x 25 x 2 = 4000 octei. n cazul unei interfee standard, memoria ecran are 16 koctei, n aceast memorie se pot pstra informaiile pentru patru ecrane de tip text. Dintre aceste ecrane la un moment dat este activ (selectat) unul singur. Adresa ocupat n memoria ecran de ctre informaia corespunztoare unui caracter este: adr_car = (linie * 80 + coloana) * 2 + nr_ecran * 4096 Rezoluiile tipice ale ecranelor video n mod text sunt: - CGA: 25 de rnduri a 80 sau 40 de coloane de caractere n matrici de 8x8 pixeli, 16 culori; - EGA: 25 sau 43 de rnduri a 80 de coloane de caractere n matrici de 7x16 pixeli, 16 culori; - VGA: 25 sau 50 de rnduri a 80 de coloane de caractere n matrici de 9x16 puncte, 16 culori.
Declaraie: void far detectgraph(int far *graphdriver, int far *graphmode); Parametru Semnificatie *graphdriver intreg care specific driver-ul grafic utilizat (constant din enum. graphics_drivers) *graphmode specific modul grafic initial (valoare din enum graphics_modes) Observaie: detectgraph detecteaz adaptorul grafic al sistemului i alege modul care ofer cea mai mare rezolutie pentru adaptor.
initgraph : iniializeaz sistemul grafic
Declaraie: void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver); Parametru *graphdriver *graphmode pathtodriver Semnificatie intreg care specific driver-ul grafic utilizat (constant din enum. graphics_drivers) specific modul grafic initial (valoare din enum graphics_modes) specific calea ctre directorul n care initgraph caut driver-ele grafice (*.BGI) mai nti (dac nu sunt acolo, initgraph caut n directorul curent); dac pathtodriver este nul, fiierele driver trebuie s fie n directorul curent
Observaii: Pentru a utiliza sistemul grafic, trebuie mai nti apelat initgraph.
3
initgraph iniializeaz sistemul grafic ncrcnd driver-ul grafic de pe disc (sau validnd un driver nregistrat) trecnd astfel sistemul n mod grafic. initgraph reseteaz toate setrile grafice (culoare, palet, poziie curent, etc.) la valoarea lor implicit i reseteaz graphresult la 0. Dup apelul initgraph, *graphdriver este setat la driver-ul grafic curent, iar *graphmode este setat la modul grafic curent. Se poate cere initgraph s utilizeze un driver i mod grafic particular, sau s autodetecteze adaptorul video ataat curent. Dac se cere initgraph s autodetecteze (*graphdriver = DETECT), el apeleaz detectgraph pentru a selecta driver-ul i modul grafic la cea mai mare rezoluie disponibil pentru driver-ul detectat.
graphics_drivers : enumerare constant valoare DETECT 0 (cere autodetecie) CGA 1 MCGA 2 EGA 3 closegraph : nchide sistemul grafic constant valoare EGA64 4 EGAMONO 5 IBM8514 6 HERCMONO 7 constant ATT400 VGA PC3270 valoare 8 9 10
Declaraie: void far closegraph(void); Observaie: closegraph elibereaz toat memoria alocat pentru sistemul grafic, apoi reface ecranul n modul anterior apelului initgraph.
setviewport : Set-eaz fereastra grafic curent
Declaratie: void far setviewport(int left, int top, int right, int bottom, int clip); Observaii: (left,top) este colul din stnga-sus, iar (right,bottom) este colul din dreapta-jos al ferestrei. Poziia curent (CP) este mutat n (0,0) al noii ferestre
setactivepage : Set-eaz pagina activ setvisualpage : Set-eaz pagina vizibil
Declaraii:
getcolor : returneaz culoarea curent pentru desenare setcolor : set-eaz culoarea curent pentru desenare
Declaraii:
getbkcolor : returneaz culoarea curent pentru fond setbkcolor : set-eaz culoarea curent pentru fond
4
Declaraii:
CGA_COLORS : enumerare Nume palet 1 CGA0 CGA_LIGHTGREEN CGA1 CGA_LIGHTCYAN CGA2 CGA_GREEN CGA3 CGA_CYAN CGA_LIGHTGRAY EGA_ COLORS : enumerare Constant EGA_BLACK EGA_BLUE EGA_GREEN EGA_CYAN EGA_RED EGA_MAGENTA EGA_LIGHTGRAY EGA_BROWN 0 1 2 3 4 5 7 20 Constant asociat 2 CGA_LIGHTRED CGA_LIGHTMAGENTA CGA_RED CGA_MAGENTA 3 CGA_YELLOW CGA_WHITE CGA_BROWN
Valoare
Constant 56
Valoare 57 58 59 60 61 62 63
Declaratie:
Declaraie: unsigned far imagesize(int left, int top, int right, int bottom);
getimage : salveaz o imagine dintr-o regiune specificat n memorie putimage : pune o imagine pe ecran
Declaraii:
void far getimage(int left, int top, int right, int bottom, void far *bitmap); void far putimage(int left, int top, void far *bitmap, int op);
Observaii: putimage repune o imagine anterior salvat cu getimage pe ecran, cu colul din stnga sus n (left,top). getimage copiaz o imagine de pe ecran n memorie. Parametru bitmap
op
Semnificatie adresa unei zone din memorie n care este salvat imaginea; primele dou cuvinte ale zonei sunt utilizate pentru limea i nlimea dreptunghiului specific un operator de combinare care controleaz modul de calcul al culorii pentru fiecare pixel destinaie pe ecran, bazndu-se pe pixel-ul aflat deja pe ecran i sursa corespunztoare din memorie
putimage_ops: putimage_ops enumerare, d numele operatorilor de combinare pentru putimage. Constant Valoare Funcie COPY_PUT 0 Copiaz imaginea surs pe ecran XOR_PUT 1 OR eXclusiv ntre imaginea surs i cea aflat deja pe ecran OR_PUT 2 OR ntre imaginea surs i cea aflat deja pe ecran AND_PUT 3 AND ntre imaginea surs i cea aflat deja pe ecran NOT_PUT 4 Copiaz inversul imaginii surs pe ecran getmaxx : returneaz coordonata x (ordonata) maxim a ecranului getmaxy : returneaz coordonata y (abscisa) maxim a ecranului int far getmaxx(void); int far getmaxy(void); getx : returneaz poziia curent a coordonatei x gety : returneaz poziia curent a coordonatei y
Declaraii:
Declaraii:
moverel : mut poziia curent (CP) la o distan relativ moveto : mut CP n (x, y)
Declaraii:
void far moverel(int dx, int dy); void far moveto(int x, int y);
getpixel : obine culoarea unui pixel specificat (x,y) putpixel : deseneaz un pixel ntr-un punct specificat (x,y)
Declaraii:
unsigned far getpixel(int x, int y); void far putpixel(int x, int y, int color);
ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 linerel : deseneaz o linie la distan relativ fa de poziia curent (CP) lineto : deseneaz o linie din CP la (x,y) void far line(int x1, int y1, int x2, int y2); void far linerel(int dx, int dy); void far lineto(int x, int y); Observaii: line deseneaz o linie de la (x1, y1) la (x2, y2) utiliznd culoarea, stilul liniei, i grosimea curente fr a modifica poziia punctului curent (CP). linerel deseneaz o linie de la CP la un punct care este la o distan relativ (dx, dy) fa de CP, apoi avanseaz CP cu (dx, dy). lineto deseneaz o linie de la CP la (x, y), apoi mut CP n (x, y). rectangle : deseneaz un dreptunghi (n mod grafic)
Declaraii:
Declaraie: void far rectangle(int left, int top, int right, int bottom); Observaii: rectangle deseneaz un dreptunghi cu culoarea, stilul liniei, i grosimea curente. (left,top) este colul din stnga-sus al dreptunghiului, iar (right,bottom) este colul din dreapta-jos al dreptunghiului.
arc : deseneaz un arc de cerc circle : deseneaz un cerc pieslice : deseneaz i umple un sector de cerc
Declaraii:
void far arc(int x, int y, int stangle, int endangle, int radius); void far circle(int x, int y, int radius); void far pieslice(int x, int y, int stangle, int endangle, int radius);
Semnificatie Centrul cercului Unghiul iniial n grade Unghiul final n grade Raza cercului
outtext : afieaz un ir de caractere ntr-o fereastr video outtextxy : afieaz un ir de caractere ntr-o locaie specificat (x,y)
Declaraii:
void far outtext(char far *textstring); void far outtextxy(int x, int y, char far *textstring);
6.4.3. Configurarea modului text textattr : set-eaz atributele textului pentru ferestre de text textbackground : selecteaz o nou culoare a fondului textului textcolor : selecteaz o nou culoare a caracterului
void textattr(int newattr); void textbackground(int newcolor); void textcolor(int newcolor); Semnificatie Informaiile culorilor codate textcolor(CYAN + BLINK);
COLORS: COLORS enumerare Constant Valoare Utilizat ca fond Constant Valoare Utilizat ca fond BLACK 0 Da DARKGRAY 8 Nu BLUE 1 Da LIGHTBLUE 9 Nu GREEN 2 Da LIGHTGREEN 10 Nu CYAN 3 Da LIGHTCYAN 11 Nu RED 4 Da LIGHTRED 12 Nu MAGENTA 5 Da LIGHTMAGENTA 13 Nu BROWN 6 Da YELLOW 14 Nu LIGHTGRAY 7 Da WHITE 15 Nu BLINK 128 Nu *** *** Pentru a afia caractere intermitent n mod text, trebuie adunat BLINK la culoarea fondului. 6.4.4. Utilizarea modului text window : Definete fereastra activ n mod text
Declaraie: void window(int left, int top, int right, int bottom);
wherex : returneaz poziia curent pe orizontal a cursorului n fereastra text curent wherey : returneaz poziia curent pe vertical a cursorului n fereastra text curent
Declaraii:
Declaraii:
int gettext(int left, int top, int right, int bottom, void*destin); int puttext(int left, int top, int right, int bottom, void*source);
Observaii: gettext memoreaz coninutul ecranului din dreptunghiul definit de (left, top) i (right, bottom) n zona de memorie *destin. puttext scrie coninutul zonei de memorie *source pe ecran.
ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 gettextinfo : Obine informaiile modului text Declaraie: void gettextinfo(struct text_info *r); struct text_info { unsigned char winleft; /* coordonata din stnga a ferestrei */ unsigned char wintop; /* coordonata de sus a ferestrei */ unsigned char winright; /* coordonata din dreapta a ferestrei */ unsigned char winbottom; /* coordonata de jos a ferestrei */ unsigned char attribute; /* atributele textului */ unsigned char normattr; /* atributele normale */ unsigned char currmode; /* modul video curent: BW40, BW80, C40, C80, or C4350 */ unsigned char screenheight; /* nlimea textului */ unsigned char screenwidth; /* limea textului */ unsigned char curx; /* coordonata x n fereastra curent */ unsigned char cury; /* coordonata z n fereastra curent */ };
/* numele diferitelor placi video suportate */ char *dname[] = { "autodetectat", "CGA", "MCGA", "EGA", "64K EGA", "EGA monocrom", "IBM 8514", "Hercules monocrom", "AT&T 6300 PC", "VGA", "IBM 3270 PC" void main(void) { /* returneaza informatia privind hardware-ul detectat */ int gdriver, gmode, errorcode; /* detecteaza hardware-ul grafic disponibil */ detectgraph(&gdriver, &gmode); /* citeste rezultatul apelului detectgraph */ errorcode = graphresult(); if (errorcode != grOk) /* a aparut o eroare */ { printf("Eroare grafica : %s\n", grapherrormsg(errorcode)); printf(":"); getch(); exit(1); /* terminat cu cod de eroare */ } /* afiseaza informatia detectata */ clrscr(); printf("Aveti o placa video %s.\n", dname[gdriver]); printf("Apasati orice tasta pentru oprire:"); getch(); } {GETIMAGE.C - Salveaza si reface continutul ecranului grafic} #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <alloc.h> int maxx, maxy;
};
10
void main(void) { /* selecteaza un driver si un mode care suporta pagini multiple */ int gdriver = EGA, gmode = EGAHI, errorcode; int x, y, ht; initgraph(&gdriver, &gmode, "c:\\bc31\\bgi\\"); errorcode = graphresult(); if (errorcode != grOk) { printf("Eroare grafica: %s\n", grapherrormsg(errorcode)); printf("Apasa orice tasta pentru oprire:");
11
%2d\r\n",ti.winleft); %2d\r\n",ti.wintop); %2d\r\n",ti.winright); %2d\r\n",ti.winbottom); %2d\r\n",ti.attribute); %2d\r\n",ti.currmode); %2d\r\n",ti.screenheight); %2d\r\n",ti.screenwidth); %2d\r\n",ti.curx); %2d\r\n",ti.cury);
12
13