Prima Homepage
Ravi Homepage
Le langage scml et la doc Ravi
Le module modxdraw
Installation Ravi sur Ensibull - PIA99
ImaLab

[PREV][SUIV]

Le module modxdraw

Le module modxdraw fournit une interface simple (pour ne pas dire simplissime) avec X11. Sur Ensibull, ce module est permanent.

Exemple d'utilisation:


 (draw_createwindow "toto" 500 600 10 100 (new_window))
 (draw_line 10 10 100 60 3)  ;; couleur initiale - noir
 (draw_flush)	;; vider buffer - le dessin apparait completement

(draw_filledrect 110 70 220 140) (draw_ellipse 200 250 20 20 4.0 100 1) (draw_text 310 420 "Ceci est un exemple") ;; police 6x11 (draw_line 310 422 424 422 1) (draw_rect 305 405 430 425 2) (draw_flush)

(draw_clearwindow) (draw_set_color 0) ;; pour le blanc

Si on veut travailler avec plusieurs fenêtres, il faut appeler draw_createwindow plusieurs fois, en gardant le résultat. Avec draw_changewindow on peut modifier la fenêtre courante dans laquelle travaillent toutes les fonctions du module.


  (define fen1 (draw_createwindow "toto" 500 600 10 100 (new_window)))
  (define fen2 (draw_createwindow "titi" 400 500 100 100 (new_window)))
  ;; fen2 est la fenêtre courante
  ...
  (draw_changewindow fen1)  ; on passe à fen1
  etc.
========================================

Les fonctions définies en Scheme sont le reflêt exact des prototypes C ci-après. Voir plus loin pour une expliquation des paramètres.


int new_window (void);
int draw_createwindow (char *, int, int, int, int, int);
int draw_changewindow (int);
int draw_clearwindow (void);
int draw_closewindow (void);
int draw_pixel (int, int);
int draw_line (int, int, int, int, int);
int draw_cross (int, int, int, int);
int draw_rect (int, int, int, int, int);
int draw_circle (int, int, int, int);
int draw_ellipse (int, int, int, int, double, int, int);
int draw_int (int, int, int);
int draw_text (int, int, char *);
int draw_filledrect (int, int, int, int);
int draw_erasepixel (int, int);
int draw_eraseline (int, int, int, int, int);
int draw_eraserect (int, int, int, int, int);
int draw_eraseellipse (int, int, int, int, double, int, int);
int draw_bary (BARY *, int, int);
void draw_set_color (int);
int draw_modenormal (void);
int draw_modexor (void);
int draw_modeor (void);
void draw_flush (void);
void draw_xsync (void);
ScVal draw_cursor_coord (void);

NB: fichiers Ravi. Le module modxdraw est généré à partir de $RAVIREP/Modules/Src/modxdraw.ph Il utilise des bibliothèques généré à partir de $RAVIHOME/LibSrc, cf. le répertoire $RAVIHOME/LibSrc/Xgraphics2.

Le module modxdraw est une adaptation pour Ravi d'un module utilisé depuis fort longtemps au Lifia; son histoire remonte à Emmanuel Arbogast. Les commentaires ci-après donnent toutes les informations nécessaires pour l'emploi sous Scheme. Il s'agit du fichier $RAVIHOME/LibSrc/Xgraphics2/Include/xdraw.h


/**********************************************************************/
/*                       File xdraw.h                                 */
/**********************************************************************/
/* libxgraphics.a is a library developped for quickly displaying simple
 * monochrome graphics under  X Windows.
 * It was developped by Emmanuel Arbogast, as an extension on a
 * package called tgif (Trivial Graphic Interface Functions).
 *
 * This file provided for non ANSI C compiler, such as SUN cc.	  
 *
 * Changelog:
 *	12/7/90: first installed on helios (LIFIA).
**************************************************************************/

#include <vision/ary.h>

/*************************************************************************/ /* Definitions */ /*************************************************************************/ #define FALSE 0 #define TRUE !FALSE #define UNUSED FALSE

#define WHITE 0 #define BLACK 1 #define RED 2 #define GREEN 3 #define BLUE 4 #define YELLOW 5 #define MAGENTA 6 #define CYAN 7

#define NB_TGIF_COLORS 8

#ifndef boolean #define boolean int #endif

/* +--------------------------------------+ | +--------------------------> x | | | | | | | | | | | | (repere fenetre par defaut) | | | | | | | |\/ y | +--------------------------------------+ */

typedef struct { int x; int y; } Point2D;

/*************************************************************************/ /* Fonctions externes */ /*************************************************************************/

/* Prochain index de fenetre utilisable */ extern int new_window();

/* Creation d'une fenetre graphique */ extern int draw_createwindow (/* char *titlestr, // Titre de la fenetre int width, // largeur fenetre en pixel int height, // hauteur fenetre en pixel int x, // coordonnee pixel en x int y, // coordonnee pixel en x int index // numero de la fenetre */);

/* Change de fenetre courante */ extern boolean draw_changewindow (/* int WantedWinIndex */); /* numero de la nouvelle fenetre courante */

/* Effacement complet de la fenetre courante */ extern boolean draw_clearwindow ();

/* Fermeture definitive de la fenetre courante */ extern boolean draw_closewindow ();

/* Affiche un pixel */ extern boolean draw_pixel (/* int x, // coordonnee pixel en x du point int y */); /* coordonnee pixel en y du point */

/* Affiche une ligne pleine entre deux points */ extern boolean draw_line (/* int x1, // coordonnee pixel en x du point 1 int y1, // coordonnee pixel en y du point 1 int x2, // coordonnee pixel en x du point 2 int y2, // coordonnee pixel en y du point 2 int thickness // epaisseur de la ligne */);

/* Affiche une croix */ extern boolean draw_cross (/* int x, // coordonnee pixel en x du centre int y, // coordonnee pixel en y du centre int length, // longueur du trait int thickness */); /* epaisseur des lignes */

/* Affiche le contour d'un rectangle */ extern boolean draw_rect (/* int x1, // coordonnee pixel en x du coin haut-gauche int y1, // coordonnee pixel en y du coin haut-gauche int x2, // coordonnee pixel en x du coin bas-droit int y2, // coordonnee pixel en y du coin bas-droit int thickness */); /* epaisseur des traits */

/* Affiche le contour d'un cercle */ extern boolean draw_circle (/* int x, // coordonnee pixel en x du centre int y, // coordonnee pixel en y du centre int rayon, // Rayon du cercle int thickness */); /* epaisseur du trait */

/* Affiche le contour d'une ellipse */ extern boolean draw_ellipse (/* int x, // coordonnee pixel en x du centre int y, // coordonnee pixel en y du centre int a, // Taille en pixel du grand axe int b, // Taille en pixel du petit axe double theta, // Angle en radian entre l'axe des x et le grand axe int N, // nombre de segments pour l'approximation int thickness */); /* Epaisseur du trait */

/* Affiche un entier */ extern boolean draw_int(/* int x1, // coordonnee pixel en x int x2, // coordonnee pixel en x int num // numero a afficher */);

/* Affiche du texte */ extern boolean draw_text (/* int x, // coordonnee pixel en x du coin bas-gauche du texte int y, // coordonnee pixel en y du coin bas-gauche du texte char* TextToWrite */); /* Texte a afficher */

/* Affiche un rectangle plein */ extern boolean draw_filledrect (/* int x1, // coordonnee pixel en x du coin haut-gauche int y1, // coordonnee pixel en y du coin haut-gauche int x2, // coordonnee pixel en x du coin bas-droit int y2 // coordonnee pixel en y du coin bas-droit */);

/* Efface un pixel precedemment trace */ extern boolean draw_erasepixel(/* int x, // coordonnee pixel en x du point int y // coordonnee pixel y du point */);

/* Efface une ligne precedemment tracee */ extern boolean draw_eraseline (/*int x1, // coordonnee pixel en x du point 1 int y1, // coordonnee pixel en y du point 1 int x2, // coordonnee pixel en x du point 2 int y2, // coordonnee pixel en y du point 2 int thickness // epaisseur de la ligne */);

/* Efface le contour d'un rectangle precedemment trace */ extern boolean draw_eraserect (/*int x1, // coordonnee pixel en x du coin haut-gauche int y1, // coordonnee pixel en y du coin haut-gauche int x2, // coordonnee pixel en x du coin bas-droit int y2, // coordonnee pixel en y du coin bas-droit int thickness */); /* epaisseur des traits */

/* Efface une ellipse precedemment tracee */ extern boolean draw_eraseellipse (/*int x, // coordonnee pixel en x du centre int y, // coordonnee pixel en y du centre int a, // Taille en pixel du grand axe int b, // Taille en pixel du petit axe double theta, // Angle en radian entre axe des x et le grand axe int N, // nombre de segments pour l'approximation int thickness // Epaisseur du trait */);

/* Recupere les coordonnees souris au prochain click d'un des boutons */ /* Le Point2D* retourne a ete alloue dynamiquement, et doit etre detruit par les soins de l'utilisateur */ extern Point2D* get_cursor_coord();

/* Affiche une image de unsigned char */ extern boolean draw_bary (/* BARY* bary, // Image a afficher int x, // Coordonnee x du point // haut-gauche ou afficher int y // Coordonnee y du point // haut-gauche ou afficher */);

/**********************************************************************/ /* Changement de modes graphiques: normal, ou, ou_exclusif et couleur */ /**********************************************************************/

/* Changement de couleur du contexte graphique courant */ extern void draw_set_color(/*int color*/);

/* Passage en mode normal (trace par mise a 1 des pixels) */ extern boolean draw_modenormal();

/* Passage en mode ou exclusif (ou excusif avec le pixel deja sur ecran) */ /* Un affichage double en mode xor restaure le contexte d'avant => nop */ extern boolean draw_modexor ();

/* Passage en mode ou (ou avec le pixel deja sur ecran) */ extern boolean draw_modeor ();

#endif