XIIUWGRAF

Une classe Loglan predefinie
pour la gestion de graphismes en multifenêtrage
sous XWindows.

Auteurs et realisateurs:

Eric BECOURT & Jerôme LARRIEU

LITA Pau 1993


Table de matières ou tresc


1: Différences essentielles entre XIIUWGRAF et IIUWGRAPH

Ce paragraphe a pour objet de donner certaines particularités de XIIUWGRAF, ceci afin de comprendre son fonctionnement général.

Tout d'abord il est important de signaler qu'à la différence de IIUWGRAPH, XIIUWGRAF est un programme à part entièc;re (plus exactement un processus crée par l'interprêteur LOGLAN).C'est pour cela qu'il est déconseillé (sauf cas de force majeure) de faire CONTROL-C pour terminer un programme : en effet, ceci a pour effet de terminer l'exécution de l'interprêteur sans terminer XIIUWGRAF (création d'un processus zombie). Pour terminer une session graphique, il faudra donc automatiquement taper dans le programme en LOGLAN la commande GROFF car elle va terminer l'exécution de XIIUWGRAF.

Certaines commandes de IIUWGRAPH n'ont pas été implémentées (par exemple HIDECURSOR, SHOWCURSOR, PALLET, ...), soit parce qu'elles seraient d'un intérêt trèc;s faible dans la gestion de XWindows, soit parce qu'elles seraient difficilement réalisables, soit parce que les programmeurs ont été atteints de fainéantise chronique.

Enfin, dans vos programmes il faudra impérativement que vos unités gérant le graphisme héritent de la classe IIUWGRAPH sous peine d'erreurs à la compilation .

ATTENTION: appelez Xint au lieu de int

: vers Tableau de Matieres

2: Ouvrir et fermer une fenêtre avec XIIUWGRAF

XIIUWGRAF permet à l'utilisateur d'ouvrir jusqu'à seize fenêtres à l'écran. Ces fenêtres sont sélectionnables dans le programme en LOGLAN par la commande GRON décrite plus loin.

2.1: La procédure HPAGE .

unit HPAGE: procedure(numerofenetre,x,y: INTEGER);

Cette procédure a pour rôle de donner la position à laquelle sera affichée la fenêtre dans l'écran, de donner la taille de cette fenêtre et de l'effacer quand le besoin s'en fait sentir. Cette procédure devra être appelée deux fois pour ouvrir une fenêtre.

HPAGE reçoit trois paramêtres : le premier est le numéro de la fenêtre (un entier compris entre 0 et 15), les deux suivants sont soit les coordonnées de la fenêtre à l'écran, soit la taille de cette fenêtre. Un troisièc;me appel de HPAGE avec l'un des deux derniers paramêtres nuls aura pour effet de l'effacer.

Exemple :

	      CALL HPAGE(0, posx, posy);

CALL HPAGE(0, longueur, hauteur);

Le coin en haut à gauche de la fenêtre 0 sera aux coordonnées (posx,posy) et la fenêtre aura une taille de longueur X hauteur.

CALL HPAGE(0, 0, valeur)

ou CALL HPAGE(0, valeur, 0)

ou CALL HPAGE(0, 0, 0)

La fenêtre 0 est effacée.

: vers Tableau de Matieres

2.2: La procédure GRON .

unit GRON: procedure(numerofenetre: INTEGER);

La procédure GRON affiche la fenêtre de numéro numerofenetre à l'écran. Ensuite pour sélectionner la fenêtre dans laquelle on veut travailler, on refait un deuxièc;me appel de cette commande.

Exemple :

    		             CALL HPAGE(0,0,0);

CALL HPAGE(1,150,0);

CALL HPAGE(0,100,100);

CALL HPAGE(1,200,150);

CALL GRON(0); (* Affichage de la fenêtre 0 *)

CALL GRON(1); (* Affichage de la fenêtre 1 *)

...

CALL GRON(0); (* Sélection de la fenêtre 1 *)

...

: vers Tableau de Matieres

2.3 : La procédure GROFF .

unit GROFF: procedure;

L'appel à cette commande a pour conséquence l'effaçage de toutes les fenêtres et la fin d'exécution du processus XIIUWGRAF.

: vers Tableau de Matieres

3: Description . des différentes commandes graphiques

3.1: Procédure COLOR .

unit COLOR: procedure(couleur: INTEGER);

Permet de déterminer la couleur d'avant plan (0 pour noir et une valeur supérieure ou égale à 1 pour blanc). Cette commande a une action locale à la fenêtre sélectionnée par GRON.

: vers Tableau de Matieres

3.2: Procédure BORDER .

unit BORDER: procedure(couleur: INTEGER);

Commande qui sélectionne la couleur de fond.

: vers Tableau de Matieres

3.3: Procédure MOVE .

unit MOVE: procedure(posx, posy: INTEGER);

posx et posy deviennent les coordonnées courantes dans la fenêtre. Comme COLOR, MOVE n'agit que sur la fenêtre sélectionnée.

: vers Tableau de Matieres

3.4: Procédure CLS .

unit CLS: procedure;

Efface la fenêtre en blanc par défaut ou de la couleur spécifiée par la commande BORDER.

: vers Tableau de Matieres

: Procédure POINT .

unit POINT: procedure(x,y: INTEGER);

Affiche un point aux coordonnées (x,y) de la couleur spécifiée par la commande COLOR ou noir par défaut. La position courante dans la fenêtre devient (x,y).

: vers Tableau de Matieres

: Procédure DRAW .

unit DRAW: procedure(x,y: INTEGER);

Affiche une ligne qui part de la position courante dans la fenêtre vers la position (x,y). La position courante dans la fenêtre devient (x,y). Elle est affichée avec la couleur courante (sélectionnée avec COLOR) et avec le style de tracé courant (sélectionnée par la commande STYLE décrite plus loin);

: vers Tableau de Matieres

: Procédure CIRB .

unit CIRB: procedure(posx,posy,rayon:INTEGER,alpha,beta:REAL,cbord,style,p,q:INTEGER);

Si style a pour valeur 0, CIRB affiche un arc de centre (posx,posy), de rayon rayon. alpha et beta sont les angles de départ et d'arrivée de l'arc en question. Si alpha=beta alors un cercle (ou une ellipse) est dessiné. Si p=q alors on obtient un cercle, si p> q une ellipse allongée dans le sens vertical est obtenue, sinon si p> q on a pour résultat une ellipse allongée dans le sens horizontal. Cet affichage est fait avec la couleur d'avant plan courante et le style de tracé courant.

Si style vaut 1, CIRB affiche un arc rempli ressemblant à une portion de camenbert avec la couleur d'avant plan courante.

Si style vaut 2, l'intérieur de l'arc délimité par sa courbure et la corde joignant ses deux extrêmités est rempli avec la couleur d'avant plan courante.

Si l'on choisi pour style une valeur < 0 ou > 3, la valeur 0 est prise.

: vers Tableau de Matieres

: Procédure HFILL .

unit HFILL: procedure(y: INTEGER);

Trace une ligne horizontale de la position courante (posx,posy) vers les coordonnées (posx,y) avec la couleur d'avant plan courante et le style de tracé courant. La position courante dans la fenêtre devient (posx,y).

: vers Tableau de Matieres

: Procédure VFILL .

unit VFILL: procedure(y: INTEGER);

Trace une ligne verticale de la position courante (posx,posy) vers les coordonnées (x,posy) avec la couleur d'avant plan courante et le style de tracé courant. La position courante dans la fenêtre devient (x,posy).

: vers Tableau de Matieres

: Fonction INXPOS .

unit INXPOS: function: INTEGER;

Retourne la position courante sur l'axe des abscisses de la fenêtre courante.

: vers Tableau de Matieres

: Fonction INYPOS .

unit INYPOS: function: INTEGER;

Retourne la position courante sur l'axe des ordonnées de la fenêtre courante.

: vers Tableau de Matieres

: Commandes de saisie . et de restitution d'une partie d'une fenêtre.

: Fonction GETMAP .

unit GETMAP: function(x,y: INTEGER): arrayof  INTEGER;

Sauve dans le tableau tab une partie rectanguraire de la fenêtre courante, le coin en haut à gauche étant la position courante dans la fenêtre et le coin en bas à droite étant la position (x,y).

Le tableau devrait avoir une taille minimum de: 4 + (nbrelignes * (3 + nbrecol div 8)) octets

En sachant qu'en LOGLAN un entier tient sur 4 octets(en UNIX seulement), il ne vous reste plus qu' à faire votre cuisine.

: vers Tableau de Matieres

: Procédure PUTMAP .

unit PUTMAP: procedure(tab: arrayof INTEGER);

Affiche la portion d'image sauvée dans tab à la position courante dans la fenêtre. Ce qu'il y avait à cette même position avant l'affichage est totalement effaçé.

: vers Tableau de Matieres

: Procédure ORMAP .

unit ORMAP: procedure(tab: arrayof INTEGER);

Lors de l'affichage, une opération OR est faite avec la portion d'image sauvée dans tab et celle à la position courante dans la fenèc;tre: l'image est donc affichée en "transparence".

: vers Tableau de Matieres

: Procédure XORMAP .

unit XORMAP: procedure(tab: arrayof INTEGER);

Même chose qu' avec ORMAP à la différence qu'une opération XOR est faite avec l'image sauvée dans tab et celle à la position courante dans la fenêtre.

: vers Tableau de Matieres

: Procédure STYLE .

unit STYLE: procedure(styl: INTEGER);

Définit le style de tracé dans la fenêtre courante.

Si style vaut 0, le tracé sera fait avec la couleur de fond.

Si style vaut 1, le tracé sera fait avec la couleur d'avant plan.

Si style vaut 2,3,4 ou 5, le tracé sera fait avec les motif suivant :

2 : ******...******...******

3 : ****......****......****

4 : **...**...**...**

5 : **.........**.........**

où * : couleur d'avant plan

. : couleur de fond

: vers Tableau de Matieres

: Fonction INPIX .

unit INPIX: function(x,y: INTEGER);

Cette fonction met la postion courante dans la fenêtre à (x,y) et renvoie la couleur du point de la fenêtre à cette position(0 pour noir et 1 pour blanc).

: vers Tableau de Matieres

: Commandes de saisie et d'affichage de caractèc;res .

: Fonction INKEY .

unit INKEY: function: INTEGER;

Retourne le code ascii de la touche tapée au clavier ou la valeur 0 sinon. L'appui sur les touches spéciales (comme SHIFT, les touche F1, F2, ..., CONTROL, ...) renvoient des valeurs négatives. Vous verrez bien par vous-même quelles sont ces valeurs en faisant un petit programme test.

: vers Tableau de Matieres

: Procédure HASCII .

unit HASCII: procedure(code_char: INTEGER);

Affiche le caractèc;re de code ascii code_char avec le coin en haut à gauche du caractèc;re à la position courante (posx,posy) dans la fenêtre. La position courante devient (posx+largeur,posy).

Si code_char=0, une partie rectangulaire de largeur*hauteur est affichée avec la couleur de fond de la fenêtre courante et position courante dans la fenêtre reste inchangée.

En général la fonte par défaut qui est utilisée sous XWindows a une hauteur de dix points et une largeur de six points.

: vers Tableau de Matieres

: Procédure OUTSTRING .

unit OUTSTRING: procedure(tab: arrayof  CHAR);

Affiche la chaine de caractèc;re tab à la position courante (posx,posy) de la fenêtre. La position courante devient (posx+largeur*longueur_chaine,posy) où largeur est la largeur de la fonte utilisée.

: vers Tableau de Matieres

: Procédure PUSHXY .

unit PUSHXY: procedure;

Sauvegarde le contexte graphique dans une pile, c'est à dire la position courante dans la fenêtre,les couleurs de fond et d'avant plan et le style de tracé sélectionné pour cette fenêtre.

Chaque Fenêtre est dotée de sa pile de sauvegarde qui lui est propre et chaque pile a une profondeur maximale de 16.

: vers Tableau de Matieres

: Procédure POPXY .

unit POPXY: procedure;

Restore dans la fenêtre courante le contexte graphique situé en haut de la pile de sauvegarde et ce contexte est enlevé de la pile.

: vers Tableau de Matieres

: Description des commandes de gestion de la souris .

: Procédure STATUS .

unit STATUS: procedure(h, v: INTEGER, l, r, c: BOOLEAN);

Cette procédure renvoie la position courante (h,v) du pointeur de la souris ainsi que l'état des boutons de la souris. l,r,c sont respectivement les boutons gauche, droit et du centre de la souris.

Ces valeurs booléennes ont la valeur TRUE si le bouton correspondant est appuyé.

: vers Tableau de Matieres

: Procédure GETPRESS .

unit GETPRESS: procedure(b: INTEGER; OUTPUT h,v,p : INTEGER, l,r,c : BOOLEAN);

Cette procédure renvoie le nombre p de fois où le bouton sélectionné a été appuyé depuis le dernier appel à cette commande, ainsi que la position (h,v) du curseur la dernièc;re fois que le bouton considéré a été appuyé.

Le paramêtre b permet de sélectionner le bouton à tester :

- 0 : bouton gauche

- 1 : bouton droit

- 2 : bouton du milieu

En sus, la procédure renvoie l'état courant des trois boutons l,r,c.

: vers Tableau de Matieres

: Procédure GETRELEASE .

unit GETRELEASE: procedure(b: INTEGER; OUTPUT h,v,p : INTEGER, l,r,c : BOOLEAN);

Cette procédure a la même fonction que GETPRESS à la différence qu'elle teste le nombre de relâchementss du bouton sélectionné et non l'appui.

: vers Tableau de Matieres

: Procédure GETMOVEMENT .

unit GETMOVEMENT: procedure(h,v: INTEGER);

Cette procédure renvoie le mouvement relatif (h,v) du curseur de la souris depuis son dernier appel.

: vers Tableau de Matieres


: GMyAS à Pau, le 25 Octobre 1993