Lorsqu'on allume un PC, son écran fonctionne en mode texte. Cela signifie qu'on peut le considérer comme un tableau de 25 lignes et de 80 colonnes, chaque case pouvant contenir un caractère. Si le PC est muni d'une carte graphique et de l'écran correspondant celui-ci pourra fonctionner en mode graphique. Il pourra alors être considéré comme un tableau de points (ou pixels). Le nombre de points par ligne et par colonne étant beaucoup plus important que le nombre de caractères du mode texte, on pourra obtenir des images et des dessins à l'écran.
L'unité Graph de Turbo Pascal contient des procédures, fonctions, constantes et variables concernant la gestion de l'écran en mode graphique.
Elle permet :
L'unité Graph permet d'utiliser les modes graphiques suivants :
Pour gérer tous ces modes graphiques, Turbo Pascal utilise des pilotes graphiques qui sont contenus dans des fichiers indépendants d'extension BGI. Un programme Turbo Pascal utilisant l'unité Graph ne pourra fonctionner que s'il a accès au fichier BGI qui lui est nécessaire. Il s'agit en général de CGA.BGI et de EGAVGA.BGI.
C'est la procédure InitGraph qui permet d'installer un mode graphique.
Syntaxe :
InitGraph(Var Pilote,Mode:Integer;Chemin:String);
En donnant la valeur Detect (constante égale à 0) on charge Turbo Pascal de tester la configuration matérielle et de choisir le meilleur mode graphique possible. Sinon, on peut utiliser les constantes prédéfinies suivantes :
Pilotes graphiques CGA = 1; EGA = 3; HercMono = 7; VGA = 9; Modes graphiques EGAHi = 1; { 640x350 16 couleurs 2 pages } EGAMonoHi = 3; { 640x350 noir et blanc 2 pages } HercMonoHi = 0; { 720x348 noir et blanc 2 pages } VGAHi = 2; { 640x480 16 couleurs 1 page }
La procédure InitGraph peut échouer pour diverses raisons : configuration matérielle insuffisante pour le mode demandé, fichiers BGI introuvables, mémoire insuffisante, ... La fonction GraphResult qui renvoie un code d'erreur permet de savoir si le passage en mode graphique a pu être réalisé correctement. On pourra utiliser les constantes prédéfinies suivantes :
grOk = 0; { pas d'erreur } grFileNotFound = -3; { fichier absent }
De toute façon, un résultat différent de grOk (=0) indique que le programme ne peut pas continuer.
Lorsqu'un mode graphique est installé, le retour en mode en mode texte peut s'effectuer à l'aide des deux procédures suivantes :
Lorsque le mode graphique est installé, il est possible d'accéder à chaque point de l'écran et de lui donner une couleur. L'accès aux points se fait par l'intermédiaire de 2 coordonnées dans le système défini par les données suivantes :
Les valeurs maximales de x et de y dépendent du mode graphique choisi, elles peuvent être obtenues grâce aux fonctions GetMaxX et GetMaxY.
PutPixel(x,y:Integer;Col:Word);
Cette procédure affiche un point de couleur Col aux coordonnées (x,y). En mode 16 couleurs, Col peut prendre l'une des valeurs suivantes déclarées comme constantes :
Black = 0; Blue = 1; Green = 2; Cyan = 3; Red = 4; Magenta = 5; Brown = 6; LightGray = 7; DarkGray = 8; LightBlue = 9; LightGreen = 10; LightCyan = 11; LightRed = 12; LightMagenta = 13; Yellow = 14; White = 15;
Function GetPixel(x,y:Integer) : Word;
Cette fonction renvoie le numéro de la couleur actuelle du point de coordonnées (x,y).
Le fond de l'écran a une couleur unique qui est le noir après l'appel de InitGraph.
Lorsqu'on dessine un segment, différents paramètres peuvent intervenir :
Ces paramètres sont définis de façon implicite dans des variables gérées par l'unité Graph. Plusieurs procédures permettent de les modifier selon les besoins.
SetLineStyle(Style,Motif,Epaisseur:Word);
Elle définit le style, le motif et l'épaisseur du trait.
Le style est défini par l'une des constantes suivantes :
SolidLn = 0; { trait plein } DottedLn = 1; { Trait pointillé } CenterLn = 2; { Trait mixte } DashedLn = 3; { Trait tireté } UserBitLn = 4; { Style défini par l'utilisateur }
Le motif est un masque définissant un style personnel de trait. Il n'est pris en compte que si Style est égal à UserBitLn.
L'épaisseur peut prendre les deux valeurs NormWidth = 1 et ThickWidth = 3.
SetWriteMode(Mode:Integer);
Elle permet de choisir entre plusieurs modes de tracés :
Après l'appel de InitGraph, la couleur par défaut est le blanc, le style est trait plein, l'épaisseur est 1 et le mode de tracé est CopyPut.
L'unité Graph gère un point courant qui permet de diminuer le nombre de paramètres pour certaines procédures. Après InitGraph, ce point est en (0,0). On peut obtenir les coordonnées du point courant en utilisant les fonctions GetX et GetY qui renvoient des entiers de type Integer.
On peut modifier la position du point courant en utilisant la procédure MoveTo(x,y) où x et y sont des entiers de type Integer indiquant la position choisie ou la procédure MoveRel(DepX,DepY) où DepX et DepY sont des entiers de type Integer indiquant un déplacement relatif.
Note : le point courant est invisible; sa position peut être modifiée par certaines procédures.
Les fonctions d'affichage de texte utilisent un certain nombre de paramètres implicites comme la direction, la taille, la police, le mode de justification. Deux procédures permettent de les définir. La couleur d'affichage est celle définie par la procédure SetColor déjà rencontrée.
SetTextJustify(Horiz,Verti:Word);
Cette procédure définit le type de justification horizontale et verticale. Les paramètres Horiz et Verti prendront leurs valeurs parmi les constantes suivantes :
LeftText = 0; { texte aligné à gauche } CenterText = 1; { texte centré } RightText = 2; { texte aligné à droite } BottomText = 0; { texte aligné vers le bas } TopText = 2; { texte aligné vers le haut }
Les valeurs par défaut sont LeftText et BottomText.
SetTextStyle(Police,Direction,Taille:Word);
Cette procédure définit la police, la direction et la taille des caractères utilisés.
Police peut prendre les valeurs définies par les constantes suivantes :
DefaultFont = 0; { caractères en matrices 8x8 } TriplexFont = 1; SmallFont = 2; SansSerifFont = 3; GothicFont = 4;
Direction peut prendre les valeurs :
HorizDir = 0; { de gauche à droite } VertDir = 1; { de haut en bas } Le paramètre Taille doit être compris entre 1 et 10.
Les valeurs par défaut sont DefaultFont, HorizDir et 1.
Le remplissage de surfaces peut se faire suivant plusieurs styles.
La procédure SetFillStyle(Motif,Col:Word) permet de définir le style (Motif) et la couleur (Col) utilisés par les procédures de remplissage.
Motif prendra sa valeur dans les constantes prédéfinies suivantes.
EmptyFill=0; {couleur du fond} SolidFill=1; {teinte unie} LineFill=2; { --- } LtSlashFill=3; { /// } SlashFill=4; { /// épais } BkSlashFill=5; { \\\ épais } LtBkSlashFill=6; { \\\ } HatchFill=7; {hachures fines} XHatchFill=8; {hachures épaisses} InterleaveFill=9; {lignes entrelacées} WideDotFill=10; {trame de points aérée} CloseDotFill=11; {trame de points serrée} UserFill = 12; { motif défini par l'utilisateur }
L'unité Graph fournit 2 procédures et une fonction permettant de sauver et de restituer des parties d'écran.
ImageSize(x1,y1,x2,y2:Integer):Word; cette fonction renvoie la taille en octets nécessaire à la sauvegarde de la partie d'écran limitée par le rectangle défini par (x1,y1) et (x2,y2).
Note : cette taille ne doit pas dépasser 64 Ko ce qui correspond en mode VGAHi à un peu plus d'un quart d'écran.
GetImage(x1,y1,x2,y2:Integer; Image:Pointer); cette procédure copie la partie d'écran définie par le rectangle (x1,y1) et (x2,y2) dans une zone mémoire désignée par le pointeur Image.
Note : il appartient au programmeur de réserver la mémoire nécessaire.
PutImage(x,y:Integer;Image:Pointer;Oper:Word); cette procédure permet d'afficher à la position (x,y) de l'écran une image préalablement sauvée en mémoire dans la zone indiquée par le pointeur Image. Le paramètre Oper permet de préciser comment l'affichage de l'image tiendra compte du fond. On pourra utiliser les constantes suivantes :
NormalPut = 0; { MOV } CopyPut = 0; { MOV } XORPut = 1; { XOR } OrPut = 2; { OR } AndPut = 3; { AND } NotPut = 4; { NOT }
Cette étude ne se veut pas exhaustive, de nombreuses procédures et fonctions de l'unité Graph n'ont pas été évoquées comme par exemple la gestion des fenêtres graphiques, des palettes de couleurs, des pages écran...
Le programme BGIDEMO.PAS fourni avec Turbo Pascal donne une idée de l'ensemble des possibilités de l'unité Graph.
Les cartes VGA permettent d'utiliser un mode graphique à 256 couleurs de résolution 320 sur 200. L'unité Graph ne permet pas d'utiliser ce mode. Le programmeur devra créer d'autres moyens permettant de le gérer.