Sunteți pe pagina 1din 33

UNIT-ul GRAPH 1

Unit-ul GRAPH

1. Generalităţi
În unit-ul GRAPH sunt declarate şi definite tipuri de date, constante, variabile,
proceduri şi funcţii. Programatorul trebuie să cunoască aceste entităţi ca nume şi semnificaţie,
pentru a le putea utiliza în cunoştinţă de cauză în diferite programe care folosesc ecranul în
modul grafic, mod în care sunt afişate, în general, imagini grafice formate din puncte
independente numite pixeli. De multe ori imaginea construită de rutinele grafice trebuie să
conţină : cuvinte, numere, simboluri, formule, titluri, explicatii, etc.; într-un cuvânt texte.
Spre deosebire de unit-ul CRT, care lucrează în modul text şi care oferă un număr
restrâns de opţiuni în ceea ce priveşte caracterele afişate (se poate alege doar culoarea fondului
şi culoarea caracterelor şi, într-o măsură foarte limitată, dimensiunile caracterelor) unit-ul
GRAPH oferă mult mai multe opţiuni referitoare la modul în care şirurile de caractere sunt
afişate pe ecran. Pe lângă setul de caractere utilizate în modul text, numite şi caractere rastu, se
mai pot utiliza şi:
• caractere mărite de trei ori, care se găsesc în fişierul TRIP.CHR;
• caractere mici şi filiforme, care se găsesc în fişierul LITT.CHR;
• caractere stas ca la desen tehnic, care se găsesc în fişierul SANS.CHR;
• caractere gotice, care se găsesc în fişierul GOTH.CHR.
Caracterele din aceste fişiere se mai numesc şi caracrere vectoriale. Toate caracterele
pot fi mărite de un anumit număr de ori, iar pentru cele din fişierele *.CHR se poate stabili
independent înălţimea şi lăţimea caracterelor. Caracterele rastu nu arată bine când sunt mărite
pe când caracterele vectoriale îşi păstrează bine forma în urma măririi. Folosirea ecranului în
modul grafic, oferă posibilitatea de a stabili culoarea şi luminozitatea fiecărui pixel independent
de culoarea şi luminozitatea celorlalţi pixeli. Din punct de vedere al unit-ului GRAPH, ecranul
este privit ca un sistem de referinţă rectangular, cu originea în colţul stânga-sus, care are
coordonatele (0,0). Valoarea lui x (abscisa) creşte spre dreapta iar, valoarea lui y (ordonata)
creşte în jos. Numărul de puncte de pe o linie, respectiv coloană depinde de placheta grafică
folosită precum şi de modul grafic utilizat. Placheta grafică sau interfaţa video după cum i
se mai spune, este o componentă fizică a calculatorului, în sarcina căreia cade gestionarea
memoriei ecran şi controlul monitorului video, cu ajutorul unui soft specializat elaborat de
firmă, soft al cărui cod obiect este depus în fişierele *.BGI (Borland Graphics Interface).
Numărul de puncte dintr-o linie, respectiv coloană, poate fi aflat prin program cu ajutorul
funcţiilor GETMAXX şi GETMAXY, fapt pentru care coordonatele celor patru colţuri ale
ecanului sunt :
(0,0) (n,0)
unde : n := GETMAXX; iar m := GETMAXY;
Numărul totol de puncte de pe ecran este
( n +1) × ( m +1). Cu cât acest produs este mai
mare cu atât mai bine : spunem, de exemplu, că un
monitor de 640 × 350 pixeli are o rezoluţie mai
(0,m) (n,m) bună decât un monitor de 640 × 200 pixeli.

În sistemele de calcul compatibile IBM PC, pentru conectarea terminalului video se


utilizează câteva tipuri de interfeţe care diferă atât prin peformanţe cât şi prin mecanismul
efectiv de afişare. Din motive de compatibilitate, chiar şi cele mai noi interfeţe suportă placa
UNIT-ul GRAPH 2

CGA (Color Graphics Adapter) corespunzătoare interfeţei IBM tradiţionale, fapt pentru care
indiferent de tipul plăcii grafice cu care este dotat calculatorul dumneavoastra puteţi face
referire la această interfaţă. Deoarece producătorii calculatoarelor personale din marea familie a
compatibilelor IBM PC nu au ajuns niciodată la un consens în ceea ce priveşte monitoarele
video şi mai ales interfeţele video folosite, vom prezenta în cele ce urmează un tabel cu plăcile
grafice şi modurile grafice admise de fiecare placă, acceptate de TURBO PASCAL. Tabelul va
conţine şi informaţii referitoare la: rezoluţie, numărul de culori ce se pot utiliza simultan,
numărul de pagini, numărul de biţi alocat pentru un pixel şi informaţii referioare la paleta de
culori.

Placa grafică Modurile grafice Rezoluţia Număr Număr Număr Paleta


(driver-ul admise col. x lin. de de biti/ de
grafic) culori pagini pixel culori
CGAC0 320 x 200 4 1 2 C0
CGAC1 320 x 200 4 1 2 C1
CGA CGAC2 320 x 200 4 1 2 C2
CGAC3 320 x 200 4 1 2 C3
CGAHI 640 x 200 2 1 1 n+c
MCGAC0 320 x 200 4 1 2 C0
MCGAC1 320 x 200 4 1 2 C1
MCGA MCGAC2 320 x 200 4 1 2 C2
MCGAC3 320 x 200 4 1 2 C3
MCGAMED 320 x 200 4 1 2 n+c
MCGAHI 320 x 200 4 1 2 n+c
EGA EGALO 640 x 200 16 4 4
EGAHI 640 x 350 16 2 4
EGA64LO 640 x 200 16 4 4
EGA64 EGA64HI 640 x 350 16 2 4
EGAMONO EGAMONOHI 640 x 350 4 1 2
IBM8514 IBM8514LO 640 x 480 256 1 8
IBM8514HI 1024 x 768 256 1 8
HERCMON HERCMONOHI 720 x 348 2 1/2 1
O
ATT400C0 320 x 200 4 1 2 C0
ATT400C1 320 x 200 4 1 2 C1
ATT400C2 320 x 200 4 1 2 C2
ATT400 ATT400C3 320 x 200 4 1 2 C3
ATT400MED 640 x 200 2 1 1 n+c
ATT400HI 640 x 480 2 1 1 n+c
VGALO 640 x 200 16 4 4
VGA VGAMED 640 x 350 16 2 4
VGAHI 640 x 480 16 1 4
PC3270 PC3270HI 720 x 350 2 1 1
Observaţii. 1.În tabelul precedent notaţia n+c semnifică culoarea negru pentru fond
plus o culoare pentru imagine.
2. Pointerul (cursorul grafic) curent, folosit la desenare este asemănator cursorului
din modul text, cu deosebirea că acesta nu se vede pe ecran. În modul grafic se pot defini
ferestre care vor tăia desenul din afara lor, însă această tăiere nu se referă la cursorul actual.
3. Driverul care va fi folosit la execuţia unui program este impus de placa grafică cu
care este înzestrat calculatorul; în general fiecare placă grafică are un driver specific după cum
UNIT-ul GRAPH 3

urmează:

Driver-ul Placa grafică


CGA.BGI CGA sau MCGA Facem totuşi precizarea că placa EGA
EGAVGA.BGI EGA sau VGA (Enhanced Graphics Array) poate fi folosită şi
IBM8514.BGI IBM8514 cu driver de CGA iar, placa VGA (Video
HERC.BGI HERCULES Graphics Array) poate fi folosită şi cu drivere
ATT.BGI AT& T de CGA şi EGA .
PC3270.BGI PC3270
4. Există patru palete de culori, fiecare paletă conţinând trei culori ( 1..3 ) şi o a patra
culoate ( 0 ) care este aceeaşi cu culoarea fondului. Acestea sunt prezentate în tabelul următor:

Cod culoare → 0 1 2 3
Cod paletă ↓
C0 culoare fond verde deschis roşu deschis galben
C1 culoare fond albastru deschis luminos violet alb
luminos
C2 culoare fond verde roşu maro
C3 culoare fond albastru deschis violet gri luminos

5. Pentru compilarea şi executarea programelor grafice sunt necesare următorele


fişiere:
• unit-ul standard TURBO.TPL, fără de care nu se poate lucra în TURBO
PASCAL;
• unit-ul GRAPH.TPU, care conţine aşa după cum am precizat la început,
declaraţii şi
definiţii de tipuri de date, de constante, de variabile, de proceduri şi functii;
• fişierul *.BGI, corespunzător plăcii grafice folosite, dacă le aveţi pe tote, e
foarte bine;
• fişierele *.CHR,care conţin setul de caractere.
Precizăm că utilizatorul are posibilitatea de a-şi instala atât un driver propriu cât şi un set propriu
de caractere. În continuare vor fi prezentate în ordine tipurile de date, constantele, variabilele şi
subprogramele (funcţii şi proceduri) din unit-ul GRAPH.

2.Definiţiile de tipuri de date din unit-ul GRAPH

TYPE
LINESETTINGSTYPE = RECORD {atributele liniei }
LINESTIL : WORD; { stilul liniei }
PATTERN : WORD; { modelul liniei }
THICKNESS : WORD; { grosimea liniei }
END;
{Valori implicite : ( SOLIDLN,$FF,NORMWIDTH ) }
UNIT-ul GRAPH 4

TYPE POINTTYPE = RECORD { coordonatele punctului }


X : INTEGER; { abscisa }
Y : INTEGER; { ordonata }
END;

ARCCOORDSTYPE = RECORD {atributele arcului }


X,Y : INTEGER; { centrul arcului}
XSTART,YSTART : INTEGER; {începutul arcului}
XEND,YEND : INTEGER; { sfârşitul arcului}
END;

VIEWPORTTYPE = RECORD {atributele ferestrei grafice}


X1,Y1 : INTEGER; {coord. colţului stânga-sus}
X2,Y2 : INTEGER; {coord. colţului dreapta-jos}
CLIP : BOOLEAN; {taiere activă sau pasivă}
END;
{ Valori implicite : (0,0,GETMAXX,GETMAXY,TRUE) }

TEXTSETTINGSTYPE = RECORD {atributele textului}


FONT : WORD; {numărul setului de caractere}
DIRECTION : WORD; {direcţia scrierii}
CHARSIZE : WORD; {dimensiunea
caracterelor}
HORIZ : WORD; {alinierea orizontală}
VERT : WORD; {alinierea verticală}
END;
{Valori implicite:
(DEFAULTFONT,HORIZDIR,1,LEFTTEXT,BOTTOMTEXT)}

PALETTETYPE = RECORD {atributele paletei de culori}


SIZE : BYTE; { numărul culorilor din paletă}
COLORS : ARRAY[0..MAXCOLORS] OF SHORTINT;
{codurile culorilor din paletă}
END;
{ Valori implicite : (16,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) - în cazul
modurilor grafice CGAC0,CGAC1,CGAC2,CGAC3 şi corespondentelor
lor pentru plăcile grafice MCGA şi ATT400, iar pentru plăcile EGA,
VGA şi IBM8514 avem :(16,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63)}

FILLSETTINGSTYPE = RECORD {atributele haşurării}


PATTERN : WORD; {număr model haşurare}
COLOR : WORD; {culoarea de haşurare}
END;
{ Valori implicite : (SOLIDFILL,GETMAXCOLOR) }

FILLPATTERNTYPE = ARRAY[1..8] OF BYTE; {modelul de haşurare}


UNIT-ul GRAPH 5

3. Definiţiile de constante din unit-ul GRAPH

{ Coduri de eroare }
CONST
GROK = 0; {Nu există eroare grafică}
GRNOINITGRAPH = - 1; {Grafica *.BGI neinstalată cu INITGRAPH }
GRNOTDETECTED = - 2; {Placa grafică nu a fost detectată}
GRFILENOTFUND = - 3; {Nu s-a găsit fişierul *.BGI corespunzător}
GRINVALIDDRIVER = - 4; {Fişierul nu conţine un driver valid}
GRNOLOADMEM = - 5; {Memorie insuficientă pentru a încărca driverul.
Procedura INITGRAPH consumă memorie dinamică,
deci măriţi dimensiunea zonei destinată alocării
dinamice.}
GRNOSCANMEM = - 6; {Memorie insuficientă pentru umplerea unei figuri prin
procedura FILLPOLY sau prin altele înrudite cu ea}
GRNOFLOODMEM = - 7; {Memorie insuficientă pentru umplerea unei figuri prin
proceduta FLOODFILL}
GRFONTNOTFOUND = - 8; {Nu s-a găsit un fişier cu caractere *.CHR}
GRNOFONTMEM = - 9; {Memorie insuficientă pentru încarcarea unui set de
caractere;soluţia : ca la -5}
GRINVALIDMODE = - 10; {Mod grafic invalid pentru driverul ales}
GRERROR = - 11; {Eroare grafică; nu precizează mai mult}
GRIOERROR = - 12; {Eroare de I/E detectată de rutinele grafice}
GRINVALIDFONT = - 13; {Fişierul cu setul de caractere, este invalid}
GRINVALIDFONTNUM = - 14; {Numărul setului de caractere este invalid}
GRINVALIDDEVICENUM = - 15; {Numărul driverului este invalid}

{ Drivere grafice }
CONST
DETECT = 0; {Driverul grafic cu cea mai mare rezoluţie corespuzător plachetei
grafice
cu care este dotat calculatorul}
CGA = 1; MCGA = 2; EGA = 3; EGA64 = 4; EGAMONO = 5;
IBM8514 = 6; HERCMONO = 7; ATT400 = 8; VGA = 9; PC3270 = 10;
CURENTDRIVER = -128;

{ Moduri grafice }
CONST
CGAC0 = 0; CGAC1 = 1; CGAC2 = 2; CGAC3 = 3; CGAHI = 4;
MCGAC0 = 0; MCGAC1 = 1; MCGAC2 = 2; MCGAC3 = 3; MCGAMED = 4;
MCGAHI = 5; EGALO = 0; EGAHI = 1; EGA64LO = 0; EGA64HI = 1;
EGAMONOHI = 3; IBM8514LO = 0; IBM8514HI = 1; HERCMONOHI = 0;
ATT400C0 = 0; ATT400C1 = 1; ATT400C2 = 2; ATT400C3 = 3;
ATT400MED = 4; ATT400HI = 5; VGALO = 0; VGAMED = 1;
VGAHI = 2; PC3270HI = 0;
UNIT-ul GRAPH 6

{ Culori normale }
CONST
BLACK = 0; RED = 4; DARKGRAY = 8; LIGHTRED = 12;
BLUE = 1; MAGENTA = 5; LIGHTBLUE = 9; LIGHTMAGENTA = 13;
GREEN = 2; BROWN = 6; LIGHTGREEN = 10; YELOOW = 14;
CYAN = 3; LIGHTGRAY = 7; LIGHTCYAN = 11; WHITE = 15;

{ Culori EGA }
CONST
EGABLACK = 0; EGARED =4; EGADARKGRAY =56;
EGALIGHTRED = 60; EGABLUE =1; EGAMAGENTA =5;
EGALIGHTBLUE =57; EGALIGHTMAGENTA=61; EGAGREEN =2;
EGABROWN =20; EGALIGHTGREEN =58; EGAYELLOW = 62;
EGACYAN = 3; EGALIGHTGRAY =7; EGALIGHTCYAN =59;
EGAWHITE = 63;

{ Cod culoare maximă }


CONST
MAXCOLORS = 15;

{ Stilul liniei }
CONST
SOLIDLN = 0; { Linie continuă de forma ______________}
DOTTEDLN = 1; { Linie întreruptă de forma _ _ _ _ _ _ _ _ _}
CENTERLN = 2; { Linie întreruptă de forma __ _ __ _ __ _ __}
DASHEDLN = 3; { Linie întreruptă de forma ___ ___ ___ ___ }
USERBITLN = 4; { Stil de linie definit de utilizator }

{ Grosimea liniei }
CONST
NORMWIDTH = 1; { Grosime normală } THICKWIDTH = 3; { Linie groasă }

{ Tăiere grafică }
CONST
CLIPON = TRUE; { Activează tăierea; exteriorul este invizibil}
CLIPOFF = FALSE; { Tăierea este pasivă; exteriorul este vizibil }

{ Desenare plafon }
CONST
TOPON = TRUE; { Se desenează plafonul unui paralelipiped }
TOPOFF = FALSE; { Nu se desenează plafonul şi prin urmare, deasupra nu se poate
aşeza un alt paralelipiped }
UNIT-ul GRAPH 7

{ Tipuri de caractere }
CONST
DEFAULTFONT = 0; { Caracterele implicite - caractere rastu }
TRIPLEXFONT = 1; { Caracterele din fişierul TRIP.CHR }
SMALLFONT = 2; { Caracterele din fişierul LITT.CHR }
SANSSERIFFONT = 3; { Caracterele din fişierul SANS.CHR }
GOTHICFONT = 4; { Caracterele din fişierul GOTH.CHR }
{ Direcţia de scriere }
CONST
HORIZDIR = 0; { Scriere pe orizontală de la stânga la dreapta }
VERTDIR = 1; { Scriere pe verticală de sus în jos }
{ Dimensiune caracter utilizator }
CONST
USERCHARSIZE = 0; { nu se poate folosi pentru stilul DEFAULTFONT }

{ Alinierea textului pe orizontală şi pe vrticală }


CONST
LEFTTEXT = 0; { Aliniere la stânga pe orizontală }
CENTERTEXT = 1; { Poziţionare la centru pe orizontală }
RIGHTTEXT = 2; { Aliniere la dreapta pe orizontală }
BOTTOMTEXT = 0; { Aliniere jos pe verticală }
CENTERTEXT = 1; { Aliniere la centru pe verticală }
TOPTEXT = 2; { Aliniere sus pe verticală }

4. Declaraţiile de variabile din unit-ul GRAPH

{ Stilurile
Numele :detipul
haşurare a unei figuri } S e m n i f i c a ţ i a
CONST
GRAPHGETMEMPTR : POINTER; Adresa memoriei pentru grafică
EMPTYFILL = 0; { colorează cu culoarea de fond}
GRAPHFREEMEMPTR : POINTER; Adresa memoriei grafice libere.
SOLIDFILL = 1; { nuanţă uniformă temperată}
LINEFILL = 2; { linii orizontale groase}
LTSLASHFILL = 3; { model /// subţire}
SLASHFILL = 4; { model /// gros}
BKSLASHFILL = 5; { model \\\ gros }
LTBKSLASHFILL = 6; { model \\\ subţire}
HATCHFILL = 7; { model pătratele orizontale}
XHATCHFILL = 8; { model pătratele oblice}
INTERLEAVEFILL = 9; { model cu puncte dese }
WIDEDOTFILL =10; { model punctat rar}
CLOSEDOTFILL =11; {model punctat intermediar}
USERFILL =12; { model definit de utilizator}

{ Modul de desenare }
CONST
COPYPUT = 0; { desenare normală}
XORPUT = 1; { sau exclusiv - cu desenul existent }
ORPUT = 2; { sau - cu desenul existent }
ANDPUT = 3; { şi - cu desenul existent }
NOTPUT = 4; { not - cu desenul existent}
UNIT-ul GRAPH 8

5. Subprogramele din unit-ul GRAPH

Unit-ul GRAPH pune la dispoziţia utilizatorului în jur de 80 de subprograme, orientate


spre:
• iniţializarea sistemului grafic şi tratarea erorilor grafice;
• desenarea punctelor şi a liniilor;
• desenarea poligoanelor şi haşurarea unor zone închise;
• pagini, ferestre, salvari si restaurari de imagini;
• desenarea conicelor, arcelor şi sectoarelor;
• folosirea culorilor;
• editarea textelor.

5.1. Subprograme pentru iniţializarea sistemului grafic şi tratarea erorilor

Setul de proceduri şi funcţii din unit-ul GRAPH, folosite pentru iniţializarea sistemului
grafic şi tratarea erorilor grafice este prezentat în tabelul următor :

Numele / sintaxa Tipul Efectul


Verifică hardware-ul şi detectează driverul grafic dg ce
se poate folosi precum şi modul grafic mg cu cea mai
DETECTGRAPH(dg,mg); proc. mare rezoluţie a acestui driver. Dacă nu se detectează
VAR dg,mg:INTEGER driverul grafic, parametrul dg şi funcţia
GRAPHRESULT vor avea valoarea -2. După revenirea
din procedură trebuie apelată procedura INITGRAPH.
Iniţializează sistemul grafic prin precizarea driverului
grafic dg şi a modului grafic mg. Parametrul c conţine
calea spre directorul în care se află fişierul
*.BGI corespunzător plăcii grafice existente (de
INITGRAPH(dg,mg,c); exemplu : 'B:\FISIERE\BGI'); dacă fişierul în cauză se
c: STRING; proc. află în directorul curent, valoarea parametrului c poate
VAR dg,mg:INTEGER; fi şirul vid ’’.Valorile parametrilor dg şi mg pot fi
furnizate de procedura DETECTGRAPH, pot fi
iniţializate cu constantele predefinite din unit-ul
GRAPH sau cu valorile numerice corespunzătoare
acestora. Driverul IBM8514 nu este autodetectabil.
GETDRIVERNAME :SRTING; funcţie Returnează numele driverului grafic actual.
GETGRAPHMODE: funcţie Returnează codul modului grafic actual care poate fi
INTEGER; după caz, din domeniul 0..5.
Numele / sintaxa Tipul Efectul
GETMODENAME(mg): funcţie Returnează numele modului grafic actual, al cărui cod
INTEGER este specificat prin argumentul mg.
mg : WORD;
GETMAXMODE: funcţie Returnează numărul maxim de moduri grafice
INTEGER folosibile, corespunzătoare driverului actual.
GETMODERANGE(dg , min,max); Determină valoarea cea mai mică min şi valoarea cea
dg:INTEGER; proc. mai mare max a codurilor modurilor grafice ce se pot
VAR min,max:INTEGER; utiliza pe driverul curent care are codul dg.
Poziţionează cursorul curent în colţul stânga-sus, care
GRAPHDEFAULTS; proc. are coordonatele (0,0), iar variabilele sistemului grafic
se iniţializează cu valorile implicite.
UNIT-ul GRAPH 9

GETMAXX:INTEGER funcţie Furnizează numărul maxim de puncte de pe orizontală,


folosit de driverul curent
GETMAXY:INTEGER funcţie Furnizează numărul maxim de puncte de pe verticală,
folosit de driverul curent.
GETX:INTEGER funcţie Returnează abscisa x a cursorului actual.
GETY:INTEGER funcţie Returnează ordonata y a cursorului actual.
Permite schimbarea dimensiunii tamponului grafic
folosit pentru haşurarea unui poligon cu mai mult de
SETGRAPHBUFSIZE(d); proc. 655 de vârfuri. Dimensiunea implicită este 4 Ko, iar
d:WORD; argumentul d precizează noua dimensiune exprimată
în număr de octeţi.
CLOSEGRAPH; proc. Închide modul grafic şi face să apară ecranul existent
înaintea iniţializării acestuia.
Restabileşte modul text existent înaintea modului
grafic. Zona de memorie ocupată de modul grafic nu se
RESTORECRTMODE; proc. eliberează. Cele două moduri se pot utiliza alternant,
folosind procedurile RESTORECRTMODE şi
SETGRAPHMODE.
SETGRAPHMODE(mg); proc. Şterge ecranul şi recuplează modul grafic mg al plăcii
mg:INTEGER; actuale.
Instalează un driver grafic propriu. Parametrul nume,
reprezintă numele fişierului, care este de fapt driverul
utilizatorului, iar a este adresa funcţiei de detectare
INSTALLUSERDRIVER(nume,a): funcţie opţională; dacă nu există funcţia de detectare,
WORD;
nume:STRING; agumentul a trebuie să conţină valoarea NIL. Funcţia
a:POINTER; INSTALLUSERDRIVER returnează un cod care
reprezintă numărul driverului utilizator instalat sau
valoarea GRERROR = -11,dacă tabela driverelor este
plină.
Instalează un set propriu de caractere. Parametrul
INSTALLUSERFONT(fiscar) : funcţie fiscar este numele fişierului fizic care conţine setul de
INTEGER;
caractere. Funcţia returnează codul corespunzator
fiscar:STRING; setului instalat. Dacă tabela cu tipurile de caractere este
plină, functia returnează valoarea zero

Numele / sintaxa Tipul Efectul


REGISTERBGIDRIVER(adr funcţie Returnează un cod ce reprezintă numărul driverului
):INTEGER încărcat la adresa de memorie adr sau un cod negativ
adr:POINTER; de eroare.
REGISTERBGIFONT(adr): funcţie Returnează un cod ce reprezintă numărul setului de
INTEGER caractere încărcat la adresa de memorie adr sau un cod
adr:POINTER; de eroare.
Returnează un cod de eroare care raportează starea
ultimei operaţii grafice efectuate. Codul poate fi zero
în cazul în care nu există erore sau o valoare negativă
GRAPHRESULT: funcţie în caz de erore. Codurile predefinite returnate de
INTEGER funcţie sunt cele prezentate în pragraful referitor la
declaraţiile de constante din unit-ul GRAPH. Valoarea
furnizată de GRAPHRESULT trebuie salvată într-o
variabilă temporară , în vederea testării ei ulterioare,
deoarece după apel funcţia va fi reiniţializtă cu zero.
UNIT-ul GRAPH 10

GRAPHERRORMSG(kod funcţie Returnează textul mesajului de eroare corespunzător


): STRING codului de eroare furnizat de GRAPHRESULT şi
kod: INTEGER; transmis prin parametrul kod.

Precizare:Următoarele subprograme încarcă valorile returnate de GRAPHRESULT :

BAR FLOODFILL SETALLPALETTE SETPALETTE


BAR3D IMAGESIZE SETFILLPATTERN SETTEXTJUSTIFY
CLEARVIEWPORT INITGRAPH SETFILLSTYLE SETTEXTSTYLE
DETECTGRAPH PIESLICE SETGRAPHBUFSIZE SETVIEWPORT
DRAWPOLY REGISTERBGIDRIVER SETGRAPHMODE
FILLPOLY REGISTERBGIFONT SETLINESTYLE

Exemplu: Introducând acest program pe calculatorul dumneavostră puteţi afla toate


facilităţile pe care vi le poate oferi în modul grafic, referitoare la: drivere, moduri grafice,
rezoluţie şi totodată puteţi afla şi ce nu vă poate oferi.

PROGRAM modgraf;
USES GRAPH,PRINTER;
TYPE vector_placi = ARRAY[1..10] OF INTEGER;
CONST dg : vector_placi = (1,2,3,4,5,6,7,8,9,10);
VAR i,j,k,min,max : INTEGER;
pc : PALETTETYPE;
BEGIN
FOR i := 1 TO 10 DO
BEGIN
WRITELN(LST,'Pentru driverul grafic cu codul ',i,' avem');
j := 0;
INITGRAPH(dg[i],j,'');
j:= graphresult;
UNIT-ul GRAPH 11

IF j <> 0 THEN
BEGIN
WRITE(LST,'Eroare grafica de tipul :');
WRITELN(LST,GRAPHERRORMSG(j));
END
ELSE
BEGIN
WRITELN(LST,'Driverul grafic incarcat este: ',GETDRIVERNAME);
GETMODERANGE(dg[i],min,max);
WRITELN(LST,'Pe acest driver se pot utiliza modurile :');
FOR j := min TO max DO
BEGIN
INITGRAPH(dg[i],j,'');
WRITE(LST,' - ',GETMODENAME(j));
WRITE(LST,' cu codul ',GETGRAPHMODE,'si');
WRITE(LST,GETMAXCOLOR + 1,' culori.');
GRAPHDEFAULTS;
WRITE(LST,'Coordonatele colturilor sint (',GETX,',');
WRITELN(LST,GETY,') - (',GETMAXX,',',GETMAXY,')');
CLOSEGRAPH;
WRITELN(LST,' ');
END;
END;
END;
END.

5.2. Subprograme pentru desenarea punctelor şi desenarea liniilor

Setul de subprograme prezentate în acest subcapitol, oferă utilizatorului posibilitatea de


a desena pe ecran linii de diferite stiluri, modele şi grosimi, de a desena puncte sau de a muta
cursorul grafic în anumite poziţii de pe ecran. Aceste subprograme sunt:
Numele / sintaxa Tipul Efectul
Stabileşte modul de desenare a unei linii pe ecran.
Parametrul md poate fi una din constantele predefinite
COPYPUT sau XORPUT sau poate fi un număr
SETWRITEMODE(md); întreg din domeniul 0..1. Dacă md va fi 0 punctele
proc. liniei sunt mutate pe ecran, iar dacă va fi 1 se va face
md:INTEGER; operaţia XOR (sau exclusiv) între punctele liniei şi
punctele actuale de pe ecran.Astfel, două instrucţiuni
consecutive cu XORPUT vor şterge linia şi pe ecran
rămâne imaginea veche.
Returnează atributele liniei (stil,model grosime).Dacă
GETLINESETTINGS(al); nu s-a utilizat procedura SETLINESTYLE valorile
proc. returnate sunt cele implicite iar în cazul în care a fost
VAR al:LINESETTINGSTYPE; utilizată această procedură, valorile returnate sunt cele
stabilite prin ea. Rezultatele se găsesc în record-ul al.
Numele / sintaxa Tipul Efectul
Stabileşte atributele unei linii ( stil, model, grosime)
precizate prin s, m, g.Parametrul s pecizează stilul şi
poate fi o constantă predefinită prin care se pecizează
stilul liniei sau un număr din domeniul 0..4, parametrul
UNIT-ul GRAPH 12

m trebuie să ia valoarea 0 dacă s este din domeniul


SETLINESTYLE(s,m,g); 0..3 iar dacă stilul este definit de utiliza tor, m trebuie
proc. să fie un număr hexazecimal pe 16 biţi care descrie
s,m,g:INTEGER; modul de prezentare al liniei ( 1 = semnul luminos, 0 =
fără semn); de exemplu: $0AAA. Grosimea liniei se
precizează prin parametrul g care poate fi una din
constantele predefinite care indică grosimea liniei sau
un element din mulţimea [1,3].
Desenează o linie între punctele de coordonate (x1,y1)-
LINE(x1,y1,x2,y2); (x2,y2). Culoarea liniei se poate stabili cu procedura
proc. SETCOLOR, iar atributele liniei pot fi stabilite cu
x1,y1,x2,y2:INTEGER; procedura SETLINESTYLE. După desenarea liniei,
cursorul grafic se mută în colţul din stânga-sus al
ecranului.
LINETO(x,y); proc. Desenează o linie de la poziţia actuală a cursorului
x,y:INTEGER; grafic până la punctul (x,y).Culoarea şi atributele liniei
se stabilesc cu SETCOLOR şi SETLINESTYLE
LINEREL(dx,dy); proc. Desenează o linie de la poziţia actuală a cursorului
dx,dy:INTEGER; grafic, notată (x1,y1), până la punctul (x2,y2), unde
x2=x1+dx; y2=y1+dy. Culoarea şi atributele liniei se
stabilesc cu SETCOLOR şi SETLINESTYLE.
Desenează punctul de coordonate (x,y) şi îl colorează
PUTPIXEL(x,y,c); cu culoarea c. Parametrul c poate lua valori cuprinse
x,y:INTEGER; proc. între 0 şi valoarea returnată de funcţia
c:WORD; GETMAXCOLOR (numărul maxim de culori
utilizabile). Acest parametru poate fi specificat şi
printr-o constantă predefinită, care precizează culoarea.
Mută cursorul grafic în punctul de coordonate (x,y).
]MOVETO(x,y); proc Dacă este definită o fereastră cu SETVIEWPORT
x,y:INTEGER; valorile parametrilor x şi y se adună la coordonatele
colţului stânga-sus al ferestrei.
MOVEREL(dx,dy); proc. Mută cursorul grafic din poziţia curentă notată (x1,y1)
dx,dy:INTEGER; în punctul (x2,y2) unde : x2=x1+dx; y2=y1+dy.
GETPIXEL(x,y):WORD; funcţie Furnizează codul culorii cu care este colorat punctul de
x,y:INTEGER; coordonate (x,y).

Problema 1. _ _

Se consideră functia f :[−2π, 2π] →[− 2 , 2 ] definită prin relaţia:


f ( x ) = sin x + cos x .
Se cere să se reprezinte graficul acestei funcţii, într-un sistem de axe rectangulare,a cărui
origine să fie în centrul ecranului de rezoluţie 640x480.

Rezolvare.
Reamintim că, dată fiind o funcţie f : D →E , graficul acesteia se defineşte ca fiind
mulţimea: G f = { ( x , y ) / x ∈D, y = f ( x )} , fapt pentru care, rezolvarea problemei anterioare
se reduce la a desena pe ecranul grafic o mulţime finită de puncte, a căror imagine de ansamblu
ar contura destul de bine graficul funcţiei f. În vederea realizării unui desen cât mai corect,
trebuie să ţinem cont de următoarele:
- pe ecran pot fi desenate doar puncte ale căror coordonate sunt numere întregi
pozitive, iar punctele care definesc graficul funcţiei f au atât coordonate pozitive cât şi
coordonate negative, care sunt în general numere reale, iar pentru a le putea desena în spaţiul
UNIT-ul GRAPH 13

fizic al ecranului, trebuie să efectuăm o translaţie a originii în centrul ecranului, care are
coordonatele (319,239);
- valorile întregi din domeniul [−2π, 2π] , pe care le poate lua argumentul x sunt
elementele mulţimii {-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6}, iar valorile întregi pe care le poate lua
functia: y=f(x), sunt elementele mulţimii {-1,0,1} şi, ceea ce este mai interesant, aceste valori
nu corespund unor argumente întregi, fapt pentru care luarea în considerare doar a argumentelor
întregi nu este o soluţie, cum, de altfel, nici considerarea a numai trei valori pentru funcţia f nu
dă nici un rezultat. Din această cauză vom impune ca x-ul să parcurgă domeniul dat cu pasul
0.01 şi vom calcula valoarea lui y=f(x), iar pentru a putea evidenţia punctul de coordonate
(x,y) pe ecranul grafic, vom considera unitatea de măsură ca fiind formată, de exemplu, din 30
de pixeli şi prin urmare vom desena punctul de coordonate ( x p , y p ) unde:
 x p = 319 + [30 ⋅ x ]

 y p = 239 − [30 ⋅ y ]

PROGRAM grafic_functie;
USES GRAPH;
VAR dg,mg,xp,yp,xo,yo:INTEGER;
x,y:REAL;i,j:integer;
FUNCTION f(x:REAL):REAL;
BEGIN
f:=SIN(x)+COS(x);
END;
{ PROGRAMUL PRINCIPAL }
BEGIN
dg:=9; mg:=2;
INITGRAPH(dg,mg,'');
LINE(2,2,GETMAXX-2,2); LINE(2,2,2,GETMAXY-2);
LINE(GETMAXX-2,2,GETMAXX-2,GETMAXY-2);
LINE(2,GETMAXY-2,GETMAXX-2,GETMAXY-2);
xo:=GETMAXX DIV 2; yo:=GETMAXY DIV 2;
LINE(xo,20,xo,460); LINE(20,yo,620,yo);
MOVETO(xo,20); LINEREL(-5,5);LINEREL(10,0);LINEREL(-5,-5);
MOVETO(620,yo);LINEREL(-5,-5);LINEREL(0,10);LINEREL(5,-5);
OUTTEXTXY(xo-10,10,'f(x)'); OUTTEXTXY(xo+5,yo+5,'O');
OUTTEXTXY(625,yo-5,'x');

x:=-2*PI;
WHILE x<=2*PI DO
BEGIN
y:=f(x);
xp:=xo+ROUND(40*x);
yp:=yo-ROUND(40*y);
PUTPIXEL(xp,yp,15);
x:=x+0.001;
END;
READLN;
END.
UNIT-ul GRAPH 14

Observaţie. Într-un mod cu totul analog se poate reprezenta graficul oricărei funcţii, cu
precizarea că în funcţie de necesităţi se poate alege o altă unitate de măsură, iar dacă domeniul
de definiţie sau domeniul de valori se exprimă prin numere destul de mari se poate face în
prealabil o taransformare de variabilă şi eventual o transformare de funcţie printr-o contracţie
astfel încât repreyentarea grafică să se poată face în spaţiul fizic al ecranului.

Problema 2. Pe ecranul grafic de rezoluţie 640x480 să se deseneze dreptunghiul de


dimensiuni maxime, în colţul din stânga-sus al acestui dreptunghi să se afişeze atributele
implicite utilizate la desenarea unei linii , iar apoi să se stabilească noi atribute, definind un stil
de linie al utilizatorului prin $FFFF. În continuare să se deseneze rombul de dimensiuni maxime
înscris în dreptunghi şi diagonalele acestuia după care să se schimbe din nou atributele liniei şi
să se deseneze cu linii groase pătratul de latură maximă înscris în romb, iar în interiorul acestui
pătrat să se deseneze prin puncte un cerc cu diametrul egal cu latura pătratului.
UNIT-ul GRAPH 15

PROGRAM linii_puncte;
USES GRAPH;
VAR dg,mg,l,x1,y1 : INTEGER;
x2,y2 : LONGINT;
al : LINESETTINGSTYPE;
x : REAL;
BEGIN
dg := 9; mg := 2;
INITGRAPH(dg,mg,'');
SETWRITEMODE(0);
LINE(0,0,GETMAXX,0); LINE(0,0,0,GETMAXY);
LINE(0,GETMAXY,GETMAXX,GETMAXY);
LINE(GETMAXX,0,GETMAXX,GETMAXY);
GETLINESETTINGS(al);
WRITELN('Atributele implicite pentru linie sint;');
WRITELN(' - stilul = ',al.LINESTYLE);
WRITELN(' - modelul = ',al.PATTERN );
WRITELN(' - grosimea = ',al.THICKNESS);
SETLINESTYLE(4,$FFFF,1);
x1 := GETMAXX DIV 2;
y1 := GETMAXY DIV 2;
LINE(0,y1,GETMAXX,y1); MOVETO(GETMAXX,y1);
LINEREL(-x1,-y1); LINEREL(-x1,y1);
LINEREL(x1,y1); LINEREL(x1,-y1);
MOVEREL(-x1,-y1); LINETO(x1,GETMAXY);
x2 := x1; y2 := y1;
l := x2*y2 DIV (x2+y2); { l este jumatate din latura patratului }
SETLINESTYLE(0,0,3); SETWRITEMODE(1);
LINE(x1-l,y1-l,x1-l,y1+l); MOVETO(x1-l,y1+l);
LINETO(x1+l,y1+l); LINEREL(0,-2*l);
LINEREL(-2*l,0);
x := 0;
WHILE x <= 2*PI DO
BEGIN
x2 := ROUND(l*COS(x));
y2 := ROUND(l*SIN(x));
PUTPIXEL(x1+x2,y1-y2,MAXCOLORS);
x := x + 0.001;
END;
{end while}
END.
UNIT-ul GRAPH 16

5.3. Subprograme pentru desenarea poligoanelor şi haşurarea unor zone închise

În acest subcapitol vor fi trecute în revistă procedurile din unit-ul GRAPH, cu


ajutorul cărora putem stabili un stil de haşurare (predefinit sau definit de utilizator), putem
desena dreptunghiuri, paralelipipede, linii poligonale sau putem să haşurăm anumite zone
închise. Procedurile disponibile sunt:
Numele / sintaxa Tipul Efectul
Stabileşte stilul de haşurare a unei figuri şi culoarea de
haşurare. Parametrul s precizează stilul de haşurare şi
poate fi una din constantele predefinite care indică
SETFILLSTYLE(s,c); proc. stilul de haşurare sau o valoare din domeniul 0..12.
s,c:WORD; Valoarea implicită de haşurare este SOLIDFILL=1.
Parametrul c indică culoarea cu care se haşurează;
poate lua valori cuprinse între 0 şi valoarea returnată
de funcţia GETMAXCOLOR.Valoarea implicită este
GETMAXCOLOR.
Stabileşte stilul de haşurare a unei figuri şi culoarea de
SETFILLPATTERN(s,c); proc. haşurare. Parametrul s de tip FILLPATTERNTYPE
s:FILLPATTERNTYPE; defineşte un stil propriu de haşurare folosind un tabel
c:WORD; de 8 octeţi. Culoarea haşurării se precizează prin
parametrul c.
Furnizează în record-ul sc, de tip predefinit
GETFILLSETTINGS(sc); proc. FILLSETTINGSTYPE informaţii referi toare la stilul
sc:FILLSETTINGSTYPE; şi culoarea haşurării, informaţii ce au fost stabilite
anterior cu una din procedurile SETFILLSTYLE sau
SETFILLPATTERN.

Numele / sintaxa Tipul Efectul


Furnizează în variabila s, de tipul predefinit
UNIT-ul GRAPH 17

GETFILLPATTERN(s); FILLPATTERNTYPE informaţii referitoare la ultimul


VAR proc. stil de haşurare stabilit de utilizator cu procedura
s:FILLPATTERNTYPE; SETFILLPATTERN. Dacă nu a fost apelată procedura
SETFILLPATTERN cei 8 octeţi din s vor avea fiecare
valorea $FF.
Desenează un dreptunghi cu culoarea şi stilul actual;
RECTANGLE(x1,y1,x2, y2); proc. x1,y1 reprezintă coordonatele colţului stânga-sus, iar
x1,y1,x2,y2:INTEGER; x2,y2 reprezinta coordonatele colţului dreapta-jos ale
dreptunghiului.
Desenează un dreptungi şi îl haşurează cu culoarea şi
BAR(x1,y1,x2,y2); proc. modelul stabilit prin procedura SETFILLSTYLE sau
x1,y1,x2,y2:INTEGER; SETFILLPATTERN. Parametrii x1,y1,x2,y2 au aceeaşi
semnificaţie ca la procedura RECTANGLE.
Desenează un paralelipiped dreptunghic şi îl haşurează
BAR3D(x1,y1,x2,y2,a,kod); cu culoarea şi modelul actual. Paramerii x1,y1
x1,y1,x2,y2:INTEGER; reprezintă coordonatele colţului stânga-sus de pe faţa
a:WORD; proc. corpului, x2,y2 reprezintă coordonatele colţului
kod:BOOLEAN; dreapta-jos, a reprezintă adâncimea corpului, iar prin
kod se precizează dacă deasupra paralelipipedului se
poate aşeza un alt paralelipiped (kod = TRUE ) sau este
interzisă o astfel de aşezare (kod = FALSE).
Desenează o linie poligonală. Parametrul n reprezintă
numărul vârfurilor, iar variabila puncte este un tablou
DRAWPOLY(n,puncte); ale cărui elemente sunt de tip predefinit POINTTYPE
n:WORD; proc. şi conţine coordonatele vârfurilor. În cazul în care se
VAR doreşte obţinerea unui poligon închis cu n vârfuri
puncte:POINTTYPE; trebuie ca variabila puncte să fie un tablou cu (n+1)
elemente, în care coordonatele ultimului punct coincid
cu coordonatele primului punct.
Desenează şi haşurează un poligon. Semnificaţia
FILLPOLY(n,puncte); parametrilor este aceeaşi ca şi în cazul procedurii
n:WORD; proc. DRAWPOLY. Conturul poligonului este format din
VAR linii al căror stil se stabileşte cu SETLINESTYLE, iar
puncte:POINTTYPE; culoarea şi modelul de haşurare sunt cele stabilite cu
SETFILLPATTERN sau SETFILLSTYLE.
Haşurează cu modelul actual o zona închisă (poligon,
FLOODFILL(x,y,c); proc. cerc,etc). Parametrii x,y reprezintă coordonatele unui
x,y:INTEGER; punct interior zonei închise, iar parametrul c reprezintă
c:WORD; culoarea de haşurare.
UNIT-ul GRAPH 18

Exemplu: Următorul program pune în evidenţă cele 12 stiluri predefinite de haşurare a


unei figuri şi defineşte un al 13-lea stil format din linii verticale. El constitue un exemplu
edificator referitor la utilizarea procedurilor destinate desenării poligoanelor şi haşurărilor.
UNIT-ul GRAPH 19

PROGRAM poligoane_hasurari;
USES GRAPH;
TYPE puncte = ARRAY[1..7] OF POINTTYPE;
VAR dg,mg,i,j,dy : INTEGER;
hexagon : puncte;
p : POINTTYPE;
CONST stil : FILLPATTERNTYPE = ($88,$88,$88,$88,$88,$88,$88,$88);
PROCEDURE coordonate(VAR hexagon:puncte);
BEGIN
p.X := 49*j - 24; p.Y := 71*i -15; p.X := p.X + 22;
MOVE(p,hexagon[1],4); MOVE(p,hexagon[7],4);
p.X := p.X - 44; MOVE(p,hexagon[4],4);
dy := ROUND(22*SIN(PI/3)); p.Y := p.Y + dy;
p.X := p.X + 33; MOVE(p,hexagon[2],4);
p.X := p.X - 22; MOVE(p,hexagon[3],4);
p.Y := p.Y - 2 * dy; MOVE(p,hexagon[5],4);
p.X := p.X + 22; MOVE(p,hexagon[6],4);
END;
PROCEDURE desene;
BEGIN
FOR i := 1 TO 6 DO
CASE i OF
1 : RECTANGLE(49*j-37,71*i-39,49*j-12,71*i+8);
2 : BAR(49*j-37,71*i-39,49*j-12,71*i+8);
3 : BAR3D(49*j-37,71*i-32,49*j-15,71*i+13,10,TRUE);
4 : BEGIN
coordonate(hexagon); DRAWPOLY(7,hexagon);
END;
5 : BEGIN
coordonate(hexagon); FILLPOLY(7,hexagon);
END;
6 : BEGIN
coordonate(hexagon); DRAWPOLY(7,hexagon);
FLOODFILL(49*j-24,71*i-15,15);
END;
END;
END;
BEGIN
dg := 9; mg := 2; INITGRAPH(dg,mg,'');
SETLINESTYLE(0,0,1); LINE(0,0,637,0);
FOR i := 1 TO 7 DO
LINE(0,20+71*(i-1),637,20+71*(i-1));
FOR j := 1 TO 14 DO
BEGIN
SETTEXTSTYLE(2,0,3);
IF j <= 10 THEN
OUTTEXTXY(49*(j-1)+5,5,'STIL - '+ CHR(47+j))
ELSE
OUTTEXTXY(49*(j-1)+5,5,'STIL - '+ CHR(49) + CHR(47+j MOD 10));
LINE(49*(j-1),0,49*(j-1),446);
END;
FOR j := 1 TO 12 DO
BEGIN
SETFILLSTYLE(j-1,15); desene;
END;
j := 13; SETFILLPATTERN(stil,15); desene;
SETTEXTSTYLE(1,0,2);
OUTTEXTXY(150,450,'Poligoane si stiluri de hasurare.');
END.
UNIT-ul GRAPH 20

5.4. Pagini, ferestre, salvări şi restaurări de imagini

Sistemele de calcul care admit plăcile grafice: EGA, EGA64, HERCMONO şi VGA
oferă posibilitatea de a utiliza mai multe pagini de memorie ecran, şi implicit facilităţi mult
mai elegante în realizarea aplicaţiilor complexe, gen animaţie. Tot odată există posibilitatea
de a construi unele imagini în anumite zone dreptunghiulare de pe ecran şi de a le salva în
memorie la anumite adrese sau de a suprapune peste o zonă de ecran imaginea salvată într-o
anumită zonă de memorie, efectuând între cele două imagini una din operaţiile precizate prin
constantele predefinite ce definesc modul de desenare. Precizăm că se pot salva imagini a
căror dimensiune este mai mică de 64 Ko. Numărul de biţi alocat pentru un pixel este egal cu
logaritmul în baza 2 din numărul de culori utilizate într-un mod grafic, fapt pentru care
dimensiunea unei zone de memorie în care se salvează o imagine este egală cu
ROUND(n*m*b/8), unde n şi m sunt dimensiunile zonei, exprimate în număr de pixeli, iar b
reprezintă numărul de biţi/pixel. Procedurile disponibile care pot fi utilizate în scopurile
precizate mai sus, sunt următoarele:
Numele / sintaxa Tipul Efectul
Deschide o nouă pagină pentru ecranul grafic.
SETACTIVEPAGE(np); Proc. Parametrul np reprezintă numărul paginii în care se
np:WORD; va construi imaginea grafică; numerotarea paginilor
începe de la zero.
SETVISUALPAGE(np); Proc. Afişează pe ecran pagina np, în care a a fost
np:WORD; construită o imagine.

Numele / sintaxa Tipul Efectul


UNIT-ul GRAPH 21

CLEARDEVICE; Proc. Şterge ecranul grafic actual ( ultima pagină creată) şi


poziţonează cursorul grafic în poziţia (0,0).
Defineşte o fereastră grafică pe ecran, fereastră care în
particular poate să coincidă cu întregul ecran. Toate
procedurile de desenare/scriere vor opera în interiorul
ferestrei, până în momentul în care se defineşte o nouă
fereastră. Coordonatele colţului stâga-sus sunt (0,0),iar
fereastra poate fi privită ca un ecran de dimensiuni mai
SETVIEWPORT(x1,y1,x proc. mici. Coordonatele punctelor din interiorul ferestrei se
2,y2,kod); numesc coordonate relative.Parametrii x1,y1 reprezintă
x1,y1,x2,y2:INTEGER; coordonatele absolute ale colţului stinga-sus, iar x2,y2
kod:BOOLEAN; sunt coordonatele absolute ale colţului dreapta-jos.
Prin parametrul kod se precizează dacă punctele de pe
ecran situate în afara ferestrei sunt vizibile (FALSE)
sau nu sunt vizibile (TRUE). Acest parametru poate fi
şi una din constantele predefinite CLIPON sau
CLIPOFF.
Şterge fereastra grafică actuală şi mută cursorul grafic
CLEARVIEWPORT; proc. în colţul stânga-sus al ferestrei, colţ de coordonate
relative (0,0).
IMAGESIZE(x1,y1,x2, func. Returnează numarul de octeţi necesari salvării
y2):WORD; imaginii din dreptunghiul cu colţurile : stânga-sus de
coordonate x1,y1 şi dreapta-jos de coordonate x2,y2.
Salvează imaginea din zona dreptunghiulară definită
prin colţul stânga-sus de coordonate x1,y1 şi colţul
GETIMAGE(x1,y1,x2,y2 proc. dreapta-jos de coordonate x2,y2. Imaginea va fi
, a^); salvată în memorie la adresa a. Dimensiunea zonei în
x1,y1,x2,y2:INTEGER; care se face salvarea trebuie să fie cu 4 mai mare
a:POINTER; decât valoarea obţinută cu IMAGESIZE deorece
primele două cuvinte ale zonei conţin laţimea şi
lungimea zonei dreptunghiulare. Rezervarea de spaţiu
la adresa a se face cu procedura GETMEM din unit-ul
SYSTEM.
Suprapune regiunea salvată la adresa a peste ecran.
Imaginea salvată la adresa a va fi restabilită pe ecran
tot într-o zonă dreptungiulară cu aceleaşi dimensiuni,
PUTIMAGE(x,y,a^,opb); proc. dar eventual într-o altă poziţie, precizată prin
x,y:INTEGER; a coordonatele colţului stânga-sus date de x,y.Parametrul
:POINTER; opb reprezintă codul operaţiei binare ce se va executa
opb:BOOLEAN; între punctele regiunii care se suprapune şi punctele
ecranului. Acest parametru poate lua valori din
domeniul 0..4 sau poate fi o constantă predefinită care
indică modul de desenare.

Exemplu: Următorul program constituie un exemplu edificator în ceea ce priveşte utilizarea


procedurilor referitoare la pagini, ferestre, salvări şi restaurări de imagini. Cu ajutorul lui se
consrtuieşte pe ecranul grafic scheletul unei case, formată din patru elemente vizibile:
• peretele din faţă, construit într-o fereastră, în cadrul procedurii pagina0 şi
salvat la adresa a1;
• peretele lateral, construit într-o zonă dreptunghiulară de ecran cu procedura
pagina1
şi salvat la adresa a2;
UNIT-ul GRAPH 22

• plasa din faţă, construită într-o zona dreptunghiulară de ecran cu procedura


pagina2
şi salvată la adresa a3;
• plasa laterală, construită într-o fereastră cu procedura pagina3 şi salvată la
adresa a4;
Fiecare element este construit într-o pagină distinctă, care este apoi vizualizată.
Procedura construieste are rolul de a îmbina elementele realizate anterior astfel încât pe ecran
să obţinem scheletul casei. Precizăm faptul că, deoarece putem utiliza 4 pagini, adică 4 ecrane,
construcţia se va realiza în ultima pagină activă, adică în pagina a 3-a. Acest lucru este reliefat
şi în program cu ajutorul ultimului ciclu FOR.
PROCEDURE pagina3;
PROGRAM
BEGIN pagini_ferestre_salvari_restaurari;
USES GRAPH;
SETVIEWPORT(400,0,600,100,TRUE);
VAR a1,a2,a3,a4 : POINTER;
LINE(0,0,169,49); LINE(169,49,99,99);
d1,d2,d3,d4 : WORD;
OUTTEXTXY(100,15,'Pagina - 3');
d4dg,mg,i : INTEGER;
:= IMAGESIZE(0,0,169,99)+4;
GETMEM(a4,d4); GETIMAGE(0,0,199,99,a4^);
PROCEDURE pagina0;
END;
BEGIN
SETVIEWPORT(100,100,500,199,TRUE);
PROCEDURE construieste;
LINE(0,0,0,79);
BEGIN LINE(0,79,399,79);
LINE(399,79,399,0);
PUTIMAGE(100,100,a1^,0); RECTANGLE(160,9,220,79);
PUTIMAGE(500,50,a2^,0);
RECTANGLE(29,19,69,49);
PUTIMAGE(0,0,a3^,2); RECTANGLE(259,19,299,49);
PUTIMAGE(400,0,a4^,2);
RECTANGLE(99,9,159,79); RECTANGLE(300,19,359,49);
END;
OUTTEXTXY(160,85,'Pagina
{ PROGRAMUL PRINCIPAL - 0'); }
d1 := IMAGESIZE(0,0,499,198)+4;
BEGIN
GETMEM(a1,d1);
dg GETIMAGE(0,0,499,198,a1^);
:= VGA; mg := VGALO; INITGRAPH(dg,mg,'');
END;
SETLINESTYLE(0,0,3);
FOR i := 0 TO 3 DO
PROCEDURE
BEGIN pagina1;
BEGIN
SETACTIVEPAGE(i);
LINE(500,179,550,150);LINE(550,150,550,65);
CASE i OF
OUTTEXTXY(545,160,'Pagina
0 : BEGIN - 1');
d2 := IMAGESIZE(500,50,GETMAXX,GETMAXY)+4;
pagina0; SETVIEWPORT(0,0,GETMAXX,GETMAXY,TRUE);
GETMEM(a2,d2);GETIMAGE(500,50,639,199,a2^);
END;
END;1 : pagina1;
2 : pagina2;
PROCEDURE
3 : BEGIN pagina2;
BEGIN SETLINESTYLE(0,0,3); pagina3;
LINE(80,100,500,100); LINE(200,0,400,0);
SETVIEWPORT(0,0,GETMAXX,GETMAXY,TRUE);
LINE(80,100,200,0);
END; LINE(500,100,400,0);
CIRCLE(300,50,20);
END; OUTTEXTXY(40,20,'Pagina - 2');
d3 SETVISUALPAGE(i);
:= IMAGESIZE(0,0,500,100)+4;
READLN;
GETMEM(a3,d3);
END; GETIMAGE(0,0,500,100,a3^);
END;
construieste;
FOR i := 0 TO 3 DO
BEGIN
SETVISUALPAGE(i); READLN;
END;
END.
UNIT-ul GRAPH 23

5.5. Conice, arce, sectoare

În unit-ul GRAPH avem la dispoziţie proceduri pentru a desena cercuri, elipse, arce
de cerc,arce de elipsă, sectoare de cerc şi sectoare de elipsă. Deoarece în marea majoritate a
cazurilor, forma figurilor desenate pe ecran trebuie controlată foarte precis, precizăm că pixelii
nu sunt pătraţi decât în cazuri particulare (cum ar fi modul grafic VGAHI), iar în general sunt
dreptunghiulari, unităţile de măsură pe cele două axe fiind diferite, dimensiunea pe OX este
mai mică decât dimensiunea pe OY.
În cele ce urmează vor fi trecute în revistă procedurile cu care pot fi desenate figurile
precizate mai sus precum şi două proceduri foarte utile pentru a controla fenomenele de
deformare, care devin neplăcute în unele situaţii.
Numele / sintaxa Tipul Efectul
Desenează un cerc cu centrul în punctul de coordonate
CIRCLE(x,y,r); x,y şi de rază r. Raza r este exprimată în număr de
x,y:INTEGER; proc. pixeli iar din punct de vedere fizic mărimea razei este
r:WORD; egală cu produsul r × dx , unde dx dimensiunea unui
pixel pe direcţia OX.
Desenează un arc din cercul cu centrul în punctul de
ARC(x,y,u1,u2,r); coordonate x,y şi rază r, arc cuprins între unghiurile de
x,y:INTEGER; proc. început şi sfârşit notate cu u1 respectiv u2. Valorile
u1,u2,r:WORD; unghiurilor trebuie exprimate în grade în sens direct
trigonometric. Dacă u1 este 0, iar u2 este 360 se va
desena un cerc.
UNIT-ul GRAPH 24

Desenează şi haşurează un sector din cercul cu centrul


PIESLICE(x,y,u1,u2,r); în punctul de coordonate x,y şi rază r,sector cuprins
x,y:INTEGER; proc. între unghiurile de început şi sfârşit notate cu u1
u1,u2,r:WORD; respectiv u2. Culoarea conturului este culoarea
actuală, iar modelul şi culoarea de haşurare se
stabilesc cu SETFILLSTYLE sau SETFILLPATTERN.

Numele / sintaxa Tipul Efectul


Desenează şi haşurează elipsa de semiaxe a şi b cu
FILLELLIPSE(x,y,a,b); centrul în punctul de coordonate x,y. Culoarea
x,y:INTEGER; proc. conturului este culoarea actuală, iar culoarea şi modul
a,b:WORD; de haşurare se stabilesc cu ajutorul procedurilor
SETFILLSTYLE sau SERFILLPATTERN.
ELLIPSE(x,y,u1,u2,a, b); proc. Desenează un arc din elipsa de semiaxe a şi b şi cu
x,y:INTEGER; centrul in punctul de coordonate x,y, arc cuprins între
u1,u2,a,b:WORD; unghiurile de început şi sfârşit notate cu u1, respectiv
u2.
Desenează şi haşurează un sector din elipsa de
SECTOR(x,y,u1,u2,a,b); semiaxe a şi b cu centrul in punctul de coordonate x,y,
x,y:INTEGER; proc. sector cuprins între unghiurile de început şi sfârşit,
u1,u2,a,b:WORD; notate cu u1, respectiv u2. Culoarea conturului este
culoarea actuală, iar culoarea şi modelul de haşurare se
stabilesc cu procedura SETFILLSTYLE sau cu
procedura SETFILLPATTERN.
GETARCCOORDS(arc); proc. Returnează în record-ul arc coordonatele centrului,
VAR coordonatele de început şi coordonatele de sfârşit ale
arc:ARCCOORDSTYPE; ultimului arc de cerc sau de elipsă desenat.
Returnează în variabilele px respectiv py două valori,
care variază în funcţie modul grafic utilizat şi care se
fosesc pentru a calcula raportul dimensional px/py.
Acest raport se poate utiliza astfel: dacă notam cu H
inălţimea unui pixel şi cu L lăţimea sa, raportul H/L
este egal cu py/px. Cum folosim această procedură ?
GETASPECTRATIO(px,py); proc. Să presupunem că avem de desenat două segmente OY
VAR px,py:WORD; vertical şi OX orizontal, în aşa fel încât raportul
OY/OX să fie k. Dacă lungimea segmentului OY pe
ecran are de n pixeli, atunci lungimea segmentului OX
exprimată în pixeli trebuie să fie m, unde:
m:= ROUND(py/px*n*k);. Reciproc, dacă se ştie că
lungimea segmentului OX este m atunci lungimea
segmentului OY trebuie să fie egală cu n, unde:
n:= ROUND(px/py*m*k);.
SETASPECTRATIO(px,py); proc. Schimbă raportul dimensional implicit, cu cel precizat
px,py:WORD; prin px respectiv py.

EXEMPLUL nr.1. Următorul program împarte ecranul grafic de rezoluţie 640 x 480 în şase
pătrate de 200 x 200 pixeli, iar apoi în fiecare pătrat desenează: un cerc, o elipsa, 12 arcuri de
cerc, 12 arcuri de elipsa,12 sectoare de cerc şi 12 sectoare de elipsă , fiecare sector fiind
haşurat cu un alt model, modelele fiind cele predefinite. Extremităţile ultimului arc de elipsă se
unesc cu centrul acesteia.
UNIT-ul GRAPH 25

PROGRAM conice_arcuri_sectoare;
USES GRAPH;
VAR dg,mg,i,j,k : INTEGER;
ar : ARCCOORDSTYPE;
PROCEDURE conice;
BEGIN
FOR j:= 1 TO 2 DO
IF j = 1 THEN CIRCLE(201*i-81,201*j-61,75)
ELSE FILLELLIPSE(201*i-81,201*j-61,75,50);
END;
PROCEDURE arcuri;
BEGIN
FOR j := 1 TO 2 DO
BEGIN
k := 0;
WHILE k <= 330 DO
BEGIN
IF j = 1 THEN ARC(201*i-81,201*j-61,k,k+20,75)
ELSE ELLIPSE(201*i-81,201*j-61,k,k+20,75,50);
k := k+30;
END;
END;
GETARCCOORDS(ar); LINE(ar.X,ar.Y,ar.XSTART,ar.YSTART);
LINE(ar.X,ar.Y,ar.XEND,ar.YEND);
END;
PROCEDURE sectoare;
BEGIN
FOR j := 1 TO 2 DO
BEGIN
k := 0;
WHILE k <= 330 DO
BEGIN
SETFILLSTYLE(k DIV 30,15);
IF j = 1 THEN PIESLICE(201*i-81,201*j-61,k,k+20,75)
ELSE SECTOR(201*i-81,201*j-61,k,k+20,75,50);
k := k+30;
END;
END;
END;
BEGIN
dg := 9; mg := 2; INITGRAPH(dg,mg,'');
FOR i := 1 TO 4 DO LINE(201*i - 182, 20,201*i - 182,441);
LINE(20,20,622,20);
FOR j := 1 TO 3 DO LINE(19,201*j-162,622,201*j-162);
FOR i := 1 TO 3 DO
CASE i OF
1 : conice;
2 : arcuri;
3 : sectoare;
END;
SETTEXTSTYLE(2,0,4); OUTTEXTXY(100,25,'CONICE');
OUTTEXTXY(300,25,'ARCURI'); OUTTEXTXY(500,25,'SECTOARE');
END.
UNIT-ul GRAPH 26

EXEMPLUL nr.2. Următorul program desenează pe ecranul grafic de rezoluţie 640x200


dreptunghiul de dimensiuni maxime care se poate afişa pe ecran, determină coordonatele
punctului situat în centrul ecranului ca fiind (x1,y1) şi apoi desenează 4 cercuri de rază y1
toate cercurule având centrul în punctul de coordonate (x1,y1) folosind procedurile CIRCLE,
cerc2, cerc3 şi iarăşi CIRCLE, cu precizarea că în acest caz raza este y1-10. După prezentarea
programului, vom interpreta desenul şi vom trage câteva concluzii edificatoare.

PROGRAM cerc_aspect;
USES GRAPH;
VAR x1,y1,x2,y2,dg,mg : INTEGER;
px,py,rx,ry : WORD;
x : REAL;
i,j:integer;

PROCEDURE cerc2;
BEGIN
x := 0;
WHILE x <= 2*PI DO
BEGIN
x2 := ROUND(y1*COS(x));
y2 := ROUND(y1*SIN(X));
PUTPIXEL(x1+x2,y1-y2,15);
x := x+0.01;
END;
{end while}
END;
PROCEDURE cerc3;
BEGIN

PROCEDURE cerc3;
BEGIN
GETASPECTRATIO(px,py);
ry := y1;
rx := ROUND(py/px*ry);
x := 0;
WHILE x <= 2*PI DO
BEGIN
x2 := ROUND(rx*COS(x));
y2 := ROUND(ry*SIN(x));
PUTPIXEL(x1+x2,y1-y2,15);
x := x+0.02;
END;
{end while}
END;

BEGIN
dg:=9; mg:=0;
INITGRAPH(dg,mg,'');
RECTANGLE(0,0,GETMAXX,GETMAXY);
x1 := GETMAXX DIV 2; y1 := GETMAXY DIV 2;
PUTPIXEL(x1,y1,15);
CIRCLE(x1,y1,y1);
cerc2;
cerc3;
CIRCLE(x1,y1,ROUND(y1*py/px)-10);
READLN;
END.
UNIT-ul GRAPH 27

Concluzii
1. Ar fi fost de aşteptat ca primul cerc desenat cu CIRCLE să fie tangent
dreptunghiului în punctele (x1,0) respectiv (x1,GETMAXY) şi de fapt nu am obţinut aşa ceva.
Care este explicaţia? Raza precizată în CIRCLE este, aşa după cum am precizat anterior, raza
pe direcţia OX şi deoarece dimensiunea unui pixel pe OX este mai mică decât dimensiunea pe
OY, raza pe OY a fost ajustată astfel încât să coincidă cu raza de pe OX ca mărime fizică şi nu
ca număr de pixeli.
2.Al doilea cerc, desenat prin puncte cu procedura cerc2 are aspectul unei elipse. În
acest caz raza pe OX coincide cu raza pe OY ca număr de pixeli şi sunt egale cu y1. Acest cerc
este într-adevăr tangent dreptunghiului în punctele indicate.
3.Procedura cerc3, desenează un cerc prin puncte, cerc care are raza pe OY egală cu
y1, iar raza pe OX se determină înmulţind raza de pe direcţia OY cu raportul dimensional py/px
obţinut din procedura SETASPECTRATIO. Cele două raze sunt egale ca mărimi fizice şi cercul
este tangent dreptunghiului.Cercul este desenat punctat rar.
4.Ultimul cerc a fost desenat cu procedura CIRCLE, şi pentru ca el să fie tangent
dreptunghiului a trbuit să înmulţim raza y1 cu raportul dimensional py/px. Acest cerc se
supapune peste cercul punctat rar şi desenat cu procedura cerc3.

5.6. Folosirea culorilor

Fiecare mod grafic are propriile lui reguli de identificare a culorilor, fapt pentru care
este foarte greu de găsit un numitor comun. Singura noţiune care se poate aplica tuturor
modurilor grafice este eceea de paletă. Insistăm asupra faptului ca numai ideea generală este
comună, realizarea concretă diferind de la un mod la altul. După cum am mai precizat anterior
fiecare mod grafic se caracterizează printr-un număr specific de biţi alocaţi pentru fiecare
pixel. Din numărul de biţi alocaţi unui pixel rezultă numărul de culori ce pot fi afişate simultan
pe ecran; de exemplu, în modul grafic VGAHI fiecare pixel are 4 biţi, deci pe ecran putem
avea cel mult 16 culori simultan (24 = 16). Ce este paleta ?. Valoarea binară asociata unui
UNIT-ul GRAPH 28

pixel nu determină direct culoarea acestuia, ci este folosită ca indice într-o tabelă de culori
numită paletă. În anumite moduri grafice, programatorul poate modifica total sau parţial
conţinutul unei palete. De exemplu, pentru paleta asociata modului grafic CGAC0 avem:
Valoarea binară Numărul intrării Culoarea
asociată unui pixel în paletă
00 0 fond (poate fi aleasă de progamator din 16 culori)
01 1 Verde deschis (nemodificabilă)
10 2 roşu deschis (nemodificabilă)
11 3 galben (nemodificabilă)
Luând ca şi criteriu de clasificare posibilităţile de utilizare a culorilor, modurile grafice
pot fi împărţite în:
- moduri grafice monocrome: pixelii pot fi stinşi (culoarea neagră) sau aprinşi. În cazul
modurilor CGAHI, MCGAMED, MCGAHI, ATT400MED şi ATT400HI se poate alege culoarea
pixelilor aprinşi, iar pentru modurile HERCMONOHI şi PC3270HI nu este posibil acest lucru;
- moduri grafice cu nuanţe fixe: se caracterizează prin aceea că utilizatorul nu poate
modifica nuanţele afişate pe ecran; modurile grafice cu nuanţe fixe sunt: CGAC0, CGAC1,
CGAC2, CGAC3, MCGAC0, MCGAC1, MCGAC2, MCGAC3, EGALO, EGAHI, EGA64LO,
EGA64HI, ATT400C0, ATT400C1, ATT400C2, ATT400C3. Precizăm faptul că pentru
modurile grafice care admit paletele de culori C0, C1, C2 şi C3 se poate modifica totuşi
culoarea fondului;
UNIT-ul GRAPH 29

- moduri grafice cu nuanţe alese prin program: fiecare dintre nuanţele paletei poate fi
aleasă prin program ca o combinaţie între culorile fundamentale roşu, verde şi albastru. Aceste
moduri, oferă cea mai mare libertate programatorului, numărul de culori afişabile fiind foarte
mare (262144 pentru driver-ul IBM8514) dar dintre acestea numai o mică parte pot fi afişate
simultan pe ecran, şi anume atâtea câte intrări are paleta. Modurile grafice la care nuanţele pot
fi alese prin program sunt: VGALO, VGAMED, VGAHI, IBM8515LO, IBM8514HI.
Componenţa tricromatică a celor 16 culori EGA este prezentată în tabelul:

Culoarea Codul Componenţa tricromatică


culorii roşu verde albastru
Negru 0 0 0 0
Albastru 1 0 0 31
Verde 2 0 31 0
albastru deschis 3 0 31 31
Roşu 4 31 0 0
Violet 5 31 0 31
Maro 20 31 15 0
gri luminos 7 31 31 31
gri închis 56 15 15 15
albastru luminos 57 0 0 63
verde luminos 58 0 63 0
albastru deschis luminos 59 0 63 63
roşu luminos 60 63 0 0
violet luminos 61 63 0 63
Galben 62 63 63 0
Alb 63 63 63 63
Observaţie. Există o procedură cu ajutorul căreia se pot modifica nuanţele culorilor,
astfel încât orice culoare poate fi adusă pas cu pas de la negru (compoziţia tricromatică 0,0,0)
la nuanţa dorită. În continuare vor fi prezentate subprogramele referitoare la folosirea
culorilor.
Numele / sintaxa Tipul Efectul
Încarcă în record-ul p paleta implicită, care a fost
GETDEFAULTPALETTE(p) proc. iniţializată de procedura INITGRAPH. Câmpul
; VAR p:PALETTETYPE; p.SIZE conţine numărul culorilor ce pot ce pot fi
utilizate. Câmpul p.COLORS[k] conţine codul
corespunzător culorii k.
Modifică intrarea i din paleta curentă. Parametrul c
SETPALETTE(i,c); proc. precizează codul noii culori şi poate fi un număr
i:WORD; sau o constantă predefinită. Schimbarea produsă în
c:SHOTRINT; paletă, se vede imediat pe ecran.
Oferă un plus de rafinament programelor care se
execută pe un calculator dotat cu placa grafică VGA
sau IBM8514 şi specifică, prin parametrii pr,pv şi
SETRGBPALETTE(c,pr, pv,pa); proc. pa proporţia de roşu, verde şi albastru care intră în
c,pr,pv,pa:INTEGER; componenţa culorii cu codul c. Cu această procedură
se poate amplifica impactul tehnicii de revelare
treptată a culorilor descrisă la SETALLPALETTE
Nu există şi o procedură complementară.
Numele / sintaxa Tipul Efectul
Se foloseşte pentru a defini o nouă paletă de culori.
Parametrul p conţine noile informaţii despre paletă
UNIT-ul GRAPH 30

(numărul de culori şi codurile corespunzătoare


culorilor). Acest parametru nu este verificat de
compilator; totuşi se recomandă folosirea unei
variabile de tip PALETTETYPE, atât pentru evitarea
greşelilor cât şi pentru claritatea programului.
Efectul procedurii SETALLPALETTE se vede
imediat pe ecran,toate culorile afişate schimbându-se
SETALLPALETTE(p); proc. conform noii palete; se pot programa astfel efecte
VAR p:PALETTETYPE; spectaculoase. Un astfel de efect care impresionează
prin prezentarea grafică se bazează pe următoarea
idee: la toate intrările în paletă se atribuie o unică
valoare ( de exemplu 0 ) şi apoi se apelează
SETALLPALETTE, după care prin program se
generează o imgine care rămâne perfect invizibilă
pe ecran. Pasul al treilea constă în relevarea treptată
a culorilor una câte una prin modificarea intrărilor
corespunzătoare în paletă.
GETPALETTE(pc); proc. Furnizează în variabila pc valorile din paleta curentă.
VAR pc:PAPETTETYPE; Scopul principal al acestei proceduri este de a oferi
un mijloc comod de restaurare a paletei la încheierea
unei proceduri care o modifică.
GETPALETTESIZE : func. Furnizează dimensiunea paletei actuale, exprimată în
INTEGER; număr de octeţi.
Intoarce cel mai mare indice de culoare, care poate fi
transmis ca parametru procedurii SETCOLOR;
reprezintă cel mai mare indice de intrare în paletă.
De exemplu, pentru modul grafic CGAHI va întoarce
GETMAXCOLOR:WORD; func. valoarea 1 deoarece se pot folosi numai două culori:
0 - fond întotdeauna negru; 1 – culoarea de desen.
Pentru modul VGAHI, functia GETMAXCOLOR
intoarce valoarea 15 deoarece paleta are 16 culori,
numerotate de la 0 la 15.
Stabileşte culoarea fondului ca fiind acea culoare
SETBKCOLOR(f); proc. din paletă ,ce se gaseşte în câmpul calificat cu
f:WORD; COLORS[f]. De exemplu, în modul VGAHI,
SETBKCOLOR[13]; stabileste un fond violet
luminos.
Stabileşte culoarea scrisului (a cernelei) ca fiind acea
culoare din paleta curentă care se găseşte în câmpul
calificat cu COLORS[c]. Precizăm că, culoarea
SETCOLOR(c); proc. fondului este culoarea din paleta curentă calificată
c:WORD; prin COLORS[0].De reţinut că, SETBKCOLOR
modifică intrarea 0 în paletă. Valorile implicite
pentru parametrii procedurilor SETBKCOLOR şi
SETCOLOR sunt 0 şi GETMAXCOLOR

Numele / sintaxa Tipul Efectul


Returnează valoarea parametrului transmis ultima
GETBKCOLOR:WORD; func. dată procedurii SETBKCOLOR sau valoarea 0
dacă nu a fost apelată această procedură, adică
curentă a fondului pe care se face desenul.
UNIT-ul GRAPH 31

Returnează valoarea parametrului transmis ultima


GETCOLOR:WORD; func. dată procedurii SETCOLR sau valoarea funcţiei
GETMAXCOLOR dacă nu a fost apelată această
procedură, adică culoarea de desen curentă.

EXEMPLU: Următorul program testează hardware-ul şi pentru plăcile grafice acceptate


precizează driver-ul grafic încărcat, modurile grafice ce se pot utiliza, iar pentru fiecare mod
afişează codul, numărul maxim de culori şi paleta implicită.

PROGRAM culori;
USES GRAPH,PRINTER;
TYPE vector_placi = ARRAY[1..10] OF INTEGER;
CONST dg : vector_placi = (1,2,3,4,5,6,7,8,9,10);
VAR i,j,k,min,max : INTEGER;
p : PALETTETYPE;
BEGIN
FOR i := 1 TO 10 DO
BEGIN
WRITELN(LST,'Pentru placa grafica cu codul ',i,' avem :');
j := 0; INITGRAPH(dg[i],j,''); j := GRAPHRESULT;
IF j <> 0 THEN
WRITELN(LST,' -eroare grafica de tipul :', GRAPHERRORMSG(j));
ELSE
BEGIN
WRITE(LST,'- driverul grafic incarcat este : ', GETDRIVERNAME);
GETMODERANGE(dg[i],min,max);
WRITELN(LST,'- se pot utiliza urmatoarele moduri :');
FOR j := min TO max DO
BEGIN
INITGRAPH(dg[i],j,'');
WRITE(LST,' - ',GETMODENAME(j));
WRITE(LST,' cu codul ',GETGRAPHMODE,' si ');
WRITELN(LST,GETMAXCOLOR + 1,' culori. ');
GETDEFAULTPALETTE(p);
WRITELN(LST,' - pleta implicita este :');
WRITE(LST, ' ( SIZE : ',p.SIZE,' ; COLORS : (');
FOR k:= 0 TO p.SIZE-2 DO WRITE(LST,p.COLORS[k],',');
WRITELN(LST,p.COLORS[p.SIZE-1],'))');WRITELN;
END;
END;
END;

5.7. Editarea textelor

Unit-ul GRAPH pune la dispoziţia programatorului un set de subprograme care pot fi


utilizate în vederea editării textelor pe ecran. Aceste subprograme permit selectarea unui anumit
set de caractere, dimensionarea şi alinierea caracterelor, precum şi stabilirea direcţiei de scriere.
Pot fi tipărite atât caracterele standard (rastu) cât şi caracterele vectoriale, care se găsesc în
fişierele *.CHR. Aceste fişiere trebuie să se găsescă pe disc în momentul executării unui
program care foloseşte caracterele depuse în ele. Subprogramele disponibile în unit-ul GRAPH
UNIT-ul GRAPH 32

folosite pentru editarea textelor sunt przentate în tabelul următor.

Numele / sintaxa Tipul Efectul


Precizează prin parametrul n numărul setului de
caractere utilizate la scriere, iar prin parametrii d şi
m direcţia de scriere şi dimensiunea caracterelor.
Parametrul n poate lua valori din domeniul 0..4 sau
poate fi exprimat prin una din constantele
SETTEXTSTYLE(n,d,m); Proc. predefinite referitoare la tipul de caractere.
Parametrul d poate fi 0 dacă scrierea se face pe
n,d,m: WORD; oriyontală sau 1 dacă scrierea se face pe verticală.
Valoarea lui d poate fi precizată şi prin una din
constantele predefinite referitoare la direcţia de
scriere. Parametrul m poate lua valoarea 1 în cazul
în care dacă se optează pentru dimensiunea
normală a caracterelor sau o valoare mai mare
decât 1, caz în care dimensiunea normală se
măreşte de m ori.
SETUSERCHARSIZE(mx , Proc. Modifică lăţimea şi înălţimea a caracterelor
dx , my , dy); vectoriale după cum urmează: lăţimea normală
este înmulţită cu valoarea raportului mx:dx, iar
mx,dx,my,dy:WORD; înălţimea normală este înmulţită cu valoarea
raprtului my:dy.
Stabileşte prin parametrii o şi v ,valorile de aliniere
a textului pe oriyontală şi pe verticală, valori ce
SETTEXTJUSTIFY(o,v); Proc. vor fi utilizate de procedurile de scriere propriu
o,v:WORD; zise. Aceşti parametri pot lua valori din
subdomeniul 0..2 sau pot fi exprimaţi prin una din
constantele predefinite referitoare la alinierea
textului. Implicit ei au valorile 0 respectiv 2.
Returnează în variabila art de tip predefinit
GETTEXTSETINGS(art); Proc. TEXTSETTINGSTYPE, informaţiile referitoare la:
art:TEXTSETTINGSTYPE; numărul setului de caractere, direcţia de scriere,
dimensiunea caracterelor, valoarea alinierii
orizontale şi valoarea alinierii verticale, informaţii
ce au fost stabilite cu procedurile
SETTEXTSTYLE şi SETTEXTJUSTIFY.
TEXTHEIGHT(s):WORD funţie Are ca valoare înălţimea şirului de caractere
s:STRING; specificat prin argumentul s, exprimată în număr de
pixeli.

Numele / sintaxa Tipul Efectul


TEXTWIDTH(s):WORD funţie Are ca valoare lăţimea şirului de caractere
s:STRING; specificat prin argumentul s, exprimată în număr de
pixeli.
Tipăreşte pe ecran şirul de caractere specificat prin
OUTTEXT(s); Proc. argumentul s începând de la poziţia curentă a
s:STRING; cursorului grafic. Atributele scrierii sunt cele
stabilite cu procedurile SETTEXTSTYLE,
SETUSERCHARSIZE şi SETTEXTJUSTIFY.
Tipăreşte pe ecran şirul de caractere specificat prin
OUTTEXTXY(x,y,s); Proc. argumentul s începând de la punctul de coordonate
UNIT-ul GRAPH 33

s:STRING; (x,y). Atributele scrierii pe ecran sunt, ca şi în cazul


x,y:INTEGER; precedent, cele stabilite cu procedurile
SETTEXTSTYLE, SETUSERCHARSIZE şi
SETTEXTJUSTIFY.

S-ar putea să vă placă și