/******************************************
*
* Cedric Pradalier 2001
* mail : http://cedric.pradalier.free.fr/mail.html
*
*****************************************/
/* Creation d'une librairie pour faciliter les acces aux fenetres graphiques
Compilation avec :
graphic_contextc -lX11 -lsocket <nom_fichier>
-lsocket : particularite du Sun apparement
Cedric Pradalier : Fevrier 99
*/
#ifndef GRAPH_H
#define GRAPH_H
#include "X11/Xlib.h"
#include <stdio.h>
#include "X11/Xutil.h"
class XWin
{
// public type for line styles, see [SG]etLineStyle and [SG]etLineWidth
// Solid draws solid lines, dash draws dashed lines. Amazing !
public:
typedef enum {LSolid,LDash} LineStyle;
/*************************************************\
Variables globales : definition de l'environnement
\*************************************************/
private:
/*Couleur courante de premier plan et de fond */
long Current_FGColor, Current_BGColor;
int Current_LineWidth;
LineStyle Current_LineStyle;
/*Definition de la communication serveur */
Display *display;
/*Definition de la fenetre courante */
Window win;
/*Table de couleur courante */
Colormap clm;
/*Definition du contexte graphique courant */
GC graphic_context;
/*Pour des animations plus jolies*/
Pixmap DrawingScreen;
/*Sauvegarde du fond */
Pixmap Screen_Save;
/*Image pour la sauvegarde */
XImage Screen_Mem;
/*Definition des polices utilisees */
XFontStruct *fd;
/*Position courante de la fenetre */
int winX, winY, winHeight, winWidth;
/* Donées super private */
XGCValues gcv;
bool Graph_Opened;
char BitDepth;
public:
// Fonctions d'acces aux données membres
int GetXPos () const
{
return winX;
}
int GetYPos () const
{
return winY;
}
int GetHeight () const
{
return winHeight;
}
int GetWidth () const
{
return winWidth;
}
/*************************************************\
Fonctions graphiques
\*************************************************/
private:
char OpenGraph (int x, int y, int width, int height, char *fgcolor,
char *bgcolor, bool create_colmap, char *title);
/*
+ Ouvre une fenetre graphique, cense etre situee en (x,y)
de largeur width et de hauteur helght.
+ fgcolor et bgcolor sont les couleurs de dessins et de fond
et repondent aux memes contraintes que nom dans SetColor
La Fenetre doit etre fermee avec CloseGraph.
*/
char OpenGraphBW (int x, int y, int width, int height, char *title);
/*
Ouvre une fenetre graphique comme openGraph().
La couleur de fond est : blanc
La couleur de dessin est : noir
*/
void CloseGraph ();
/*
Ferme la fenetre graphique
Tout appel posterieur a une des primitives suivantes
risques de provoquer une erreur systeme.
*/
public:
XWin ();
XWin (int width, int height, char *title);
XWin (int x, int y, int width, int height, char *title);
XWin (int width, int height, char *title,
char * foreground,char * background);
XWin (int x,int y,int width, int height, char *title,
char * foreground,char * background);
~XWin ();
/* Set and get the current line style, see above */
void SetLineStyle(LineStyle ls);
LineStyle GetLineStyle(){return Current_LineStyle;}
/* Set and get the current line width, must be greater than 1 */
void SetLineWidth(int width);
int GetLineWidth() {return Current_LineWidth;}
long RGBGetColor (int red, int green, int blue);
/*
Determine la couleur représentée par (r,g,b)
*/
long GetColor (char *nom);
/*
Determine la couleur représentée par nom
*/
void SetColor (char *nom);
/* Defini la couleur de dessin
nom est une chaine
si nom commence par # (Ex, #FF0EA7) , la fonction s'attend
a l'expression des composantes rouge,vert,bleu de la couleur
en hexadecimal : #RRGGBB
sinon, nom est recherche dans la table des noms courants accessible
par la commande UNIX : showrgb | m
Ex "aquamarine4"
Si l'allocation de la couleur a echouee, la couleur choisie est le blanc.
*/
void SetBkColor (char *nom);
/* Defini la couleur de fond
Meme comportement que SetColor
*/
void SetColorByIndex (int i);
/*
Definit la couleur d'affichage a partir de la couleur de la position
i de la palette courante;
*/
void RGBSetColor (int red, int green, int blue);
/*
Definit la couleur d'affichage a partir de la couleur (r,g,b)
*/
void RGBSetBkColor (int red, int green, int blue);
/*
Definit la couleur de fond a partir de la couleur (r,g,b)
*/
void StoreColor (int red, int green, int short blue, int position);
/* stocke la couleur de coordonnes R,G,B red,green,blue dans la table
de couleur courante a la position position
Attention ces valeurs sont comprises entre 0 et 65535 donc pour avoir
un gris moyen il faut (128 * 256 , 128 * 256 , 128 * 256)
*/
void SaveImage (int x, int y, int width, int height, char *nom);
/*
+ Sauvegarde la partie graphique de l'image comprise
dans le rectangle dont le coin en haut a gauche a pour
coordonnee (x,y) de largeur width et de hauteur height
dans le fichier nomme nom (attention la sauvegarde est au format
tga : il vaut mieux que le nom finisse par ".tga"
+ Danger : toute l'image doit existe dans le graphique :
Les coordonnees doivent etre valide
*/
void DisplayDrawingScreen();
/*
* Affiche le buffer de dessin
* */
void Redraw ();
/*
Redessine la fenetre courante
*/
void Flush ();
/* attend la fin de l'affichage */
void ClearEvents ();
/* attend la fin de l'affichage et vide tous les evenments de la queue */
/************************************************\
* Toute les fonctions suivantes sont des fonctions de
* dessin les point sont designes par leurs coordonnees
* (x,y) ou (x1,y1)... Les coordonnes sont des nombres
* positifs comptes a partir du point en haut a gauche.
* Le dessin est fait dans la couleur courante dans
* le buffer de dessin. Rien n'est visible avant
* un appel a DisplayDrawingScreen
\************************************************/
void PutPixel (int x, int y);
/*
Dessine un point
*/
void DrawLine (int x1, int y1, int x2, int y2);
/*
Dessine une ligne
*/
void DrawRectangle (int x, int y, int width, int height);
/*
Dessine un rectangle
(x,y) est le point en haut a gauche
width et height sont les hauteurs et largeurs du rectangle.
*/
void DrawArc (int x, int y, int a, int b, int debut, int fin);
/*
Dessine l'ellipse centre en (x,y)
de demi-grand-axe a et de demi-petit-axe b
entre les angles debut et fin en degres.
*/
void DrawCircle (int x, int y, int r);
/*
Dessine un cercle de rayon r
centre en (x,y)
*/
void DrawString (int x, int y, char *s);
/*
Affiche la chaine s en (x,y) en la supperposant au dessin original
*/
void DrawImageString (int x, int y, char *s);
/*
Affiche la chaine s en (x,y) en effacant le dessin original
*/
void FillRectangle (int x, int y, int width, int height);
/*
Rempli un rectangle (cf DrawRectangle)
*/
void FillArc (int x, int y, int a, int b, int debut, int fin);
/*
Rempli un arc d'ellipse
x,y : coordonées du centre
a,b : demi-grand axe et demi-petit axe
debut,fin : angles de debut et fin de l'arc
*/
void FillCircle (int x, int y, int r);
/*
Rempli un cercle
x,y : coordonées du centre
r : rayon
*/
void ClearGraph ();
/*
Efface la fenetre courante
*/
/****** Def dans XUtil *******
typedef struct {
short x,y;
} XPoint;
*****************************/
void FillPolygon (XPoint * points, int npoints, int shape, int mode);
/*
Rempli le Polygone defini par les points A1,A2,..An de type XPoint
Avec A1 different de An. Exemple : voirFillTriangle
+ npoints vaut n
+ shape vaut Convex, Noconvex ou Complex selon l'algorithme de
remplissage a utilise
+ mode vaut CoordModeOrigin ou CoordModeRelative selon que les
coordonnees des points sont definies a partirdu point precedent
ou par une origine absolue
*/
/*
Dessine un triangle (x1,y1),...
*/
void DrawTriangle (int x1, int y1, int x2, int y2, int x3, int y3);
/*
Comme DrawTriangle en remplissant
*/
void FillTriangle (int x1, int y1, int x2, int y2, int x3, int y3);
/*
Attend un click Droit,Gauche,Milieu de la souris
*/
void WaitRClick ();
void WaitLClick ();
void WaitMClick ();
/*
Attend un Click du bouton Gauche ou Milieu ou Droit
Ex : WaitClick(1,0,1) attend un click gauche ou droit mais
pas milieu
*/
char WaitClick (int L, int M, int R);
/*
Test s'il y a eu un click dans la fenetre :
Click du bouton Gauche ou Milieu ou Droit
Ex : MouseClick(1,0,1) test un click gauche ou droit mais
pas milieu
il faut l'executer une premiere fois avant de tester, pour
initialiser le masque d'evenement
*/
char MouseClick (int L, int M, int R);
};
#endif