Page d'accueil Description du projet
/******************************************
 *
 *   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