Index: /trunk/SophyaPI/PI/pigraphgen.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraphgen.cc	(revision 172)
+++ /trunk/SophyaPI/PI/pigraphgen.cc	(revision 173)
@@ -36,4 +36,7 @@
 //	Constructeur pour les *PIGraphicWin*. Objet "PIGraphic" capable 
 //	de tracer dans un "PIWdg".
+// PIGraphic(PIGraphicBuffer* grb)
+//	Constructeur pour objet "PIGraphic" capable de tracer dans un 
+//	buffer graphique.
 //--
 //++
@@ -43,4 +46,6 @@
 // int  kind()
 //	Renvoie le type de l'objet "PIGraphic" .
+//	* PI_UnknownGraphics : Objet PIGraphic de type inconnue.
+//	* PI_GrBufferGraphics : Objet PIGraphic associé à un "GraphicBuffer"
 //	* PI_ScrWindowGraphics : Objet PIGraphic associé à une fenêtre sur l'écran (PIWdg)
 //	* PI_PSFileGraphics : Objet PIGraphic à un fichier PostScript (pour impression papier)
@@ -60,4 +65,5 @@
 {
 myWdg = NULL;
+myGrb = NULL;
 }
 
@@ -66,4 +72,12 @@
 {
 myWdg = wdg;
+myGrb = NULL;
+}
+
+/* --Methode-- */
+PIGraphicGen::PIGraphicGen(PIGraphicBuffer* grb)
+{
+myWdg = NULL;
+myGrb = grb;
 }
 
@@ -75,5 +89,5 @@
 int PIGraphicGen::kind() 
 {
-return PI_ScrWindowGraphics; 
+return PI_UnknownGraphics ;
 }
 
Index: /trunk/SophyaPI/PI/pigraphgen.h
===================================================================
--- /trunk/SophyaPI/PI/pigraphgen.h	(revision 172)
+++ /trunk/SophyaPI/PI/pigraphgen.h	(revision 173)
@@ -1,2 +1,3 @@
+// This may look like C code, but it is really -*- C++ -*-
 // Module PI : Peida Interactive     PIGraphic 
 // Primitives de trace graphiques    R. Ansari  97
@@ -60,6 +61,8 @@
 };
 
-enum PIGraphicsType { PI_ScrWindowGraphics = 0, PI_PSFileGraphics = 1, 
-                      PI_UCGraphics = 2, PI_3DGraphics = 3 };
+enum PIGraphicsType { PI_UnknownGraphics = 0, 
+                      PI_ScrWindowGraphics = 2, PI_GrBufferGraphics = 3, 
+                      PI_PSFileGraphics = 8, 
+                      PI_UCGraphics = 32, PI_3DGraphics = 36 };
 
 // Classe generique de trace graphique de base :
@@ -70,4 +73,5 @@
                      PIGraphicGen();
                      PIGraphicGen(PIWdg* wdg);
+                     PIGraphicGen(PIGraphicBuffer* grb);
   virtual           ~PIGraphicGen();
 
@@ -135,4 +139,5 @@
 // Pour Save/Restore des attributs graphiques 
   PIWdg* myWdg;
+  PIGraphicBuffer* myGrb;
 
   PIColors  sFCol, sBCol;
Index: /trunk/SophyaPI/PI/pigraphx.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraphx.cc	(revision 172)
+++ /trunk/SophyaPI/PI/pigraphx.cc	(revision 173)
@@ -33,5 +33,5 @@
 {
 
-Init();
+GlInit();
 
 if (MyWdg()) {
@@ -41,8 +41,33 @@
 else mDisp = PIXDisplay();       // Structure Display X associe
 
-mDefGC = XCreateGC (PIXDisplay(), XtWindow(PIXtTopWdg()), 0, NULL);
-
+XGCValues  xgv;
+xgv.function = GXcopy;
+xgv.plane_mask = ~0;
+mDefGC = XCreateGC (PIXDisplay(), XtWindow(PIXtTopWdg()), GCFunction | GCPlaneMask, &xgv);
+
+Init();
+}
+
+/* --Methode-- */
+PIGraphicX::PIGraphicX(PIGraphicBuffer* grb)
+: PIGraphicGen(grb)
+{
+GlInit();
+
+mDisp = PIXDisplay();       // Structure Display X associe
+mWId = grb->XGrBuffer();
+
+XGCValues  xgv;
+xgv.function = GXcopy;
+xgv.plane_mask = ~0;
+mDefGC = XCreateGC (mDisp, mWId, GCFunction | GCPlaneMask, &xgv);
+Init();
+}
+
+
+/* --Methode-- */
+void PIGraphicX::Init()
+{
 mGOm = PI_GOCopy;
-
 mFCol = mBCol = PI_Grey;
 SelForeground(PI_Black);
@@ -59,4 +84,13 @@
 PIGraphicX::~PIGraphicX()
 {
+XFreeGC(mDisp, mDefGC);
+}
+
+/* --Methode-- */
+int PIGraphicX::kind()
+{
+if (myWdg != NULL) return (PI_ScrWindowGraphics);
+else if (myGrb != NULL) return (PI_GrBufferGraphics);
+else return(PI_UnknownGraphics);
 }
 
@@ -647,5 +681,5 @@
 
 /* --Methode-- */
-void PIGraphicX::Init()
+void PIGraphicX::GlInit()
 {
 char buff[256];
Index: /trunk/SophyaPI/PI/pigraphx.h
===================================================================
--- /trunk/SophyaPI/PI/pigraphx.h	(revision 172)
+++ /trunk/SophyaPI/PI/pigraphx.h	(revision 173)
@@ -14,5 +14,8 @@
 public:
                      PIGraphicX(PIWdg* wdg);
+                     PIGraphicX(PIGraphicBuffer* grb);
   virtual           ~PIGraphicX();
+
+  virtual int        kind();
 
 //  Trace graphiques
@@ -77,4 +80,5 @@
 
 protected:
+  static void    GlInit();
   void           Init();
   void           SelectFont(int isz, int jat);
Index: /trunk/SophyaPI/PI/piwdggen.cc
===================================================================
--- /trunk/SophyaPI/PI/piwdggen.cc	(revision 172)
+++ /trunk/SophyaPI/PI/piwdggen.cc	(revision 173)
@@ -227,16 +227,26 @@
 //++
 // Titre	Gestion des Draw/Event Handler
-//	Des Draw ou des Event Handler peuvent etre ajoute a un Widget 
+//	Les objets de la classe "PIWdg" peuvent gérer des objets "PIEventHandler" 
+//	qui peuvent prendre en charge une partie du traitement des événements
+//	clavier-souris-écran.
 //--
 
 //++
 // void AddDrawHandler(PIEventHandler* drwh, bool ad=false)
-//	Ajout de 
+//	Ajout d'un objet gestionnaire d'événements, responsable du tracé du contenu de la fenêtre.
+//	La méthode "Draw(PIGraphic* g, ...)" sera appelé pour rafraîchir le contenu de la fenêtre.
 // void RemoveDrawHandler(PIEventHandler* drwh)
-//	Suppression de 
+//	Suppression d'un objet gestionnaire de tracé.
 // void AddEventHandler(PIEventHandler* evh, unsigned long evtmask, bool ad=false)
-//	Ajout de 
+//	Ajout d'un objet gestionnaire d'événements. La variable "evtmask" détermine pour
+//	quels types d'événements, la méthode "Process()" du gestionnaire est appelée.
+//|	PIEvent_Resize   (Non implementé en version X11 , 12/98)
+//|	PIEvent_Enter , PIEvent_Leave
+//|	PIEvent_ButxPress, PIEvent_ButxRelease (x=1,2,3)
+//|	PIEvent_PtrMove , PIEvent_PtrxMove (x=1,2,3)
+//|	PIEvent_Keyboard
+//
 // void RemoveEventHandler(PIEventHandler* evh)
-//	Suppression de 
+//	Suppression d'un gestionnaire d'événements.
 //--
 
Index: /trunk/SophyaPI/PI/piwdggen.h
===================================================================
--- /trunk/SophyaPI/PI/piwdggen.h	(revision 172)
+++ /trunk/SophyaPI/PI/piwdggen.h	(revision 173)
@@ -35,4 +35,5 @@
 class PIEventHandler;
 
+//  -------------------- Classe PIWdgGen -----------------------
 class PIWdgGen : public PIMsgHandler
 {
@@ -96,4 +97,7 @@
   virtual void           PasteSelection(unsigned int typ, void *pdata, unsigned int l)    = 0;
 
+//  Copie depuis un PIWdgGen
+  virtual void		 CopyFrom(PIWdgGen* wdg, int ox, int oy, int dx, int dy, int x, int y) = 0;
+
 //  Gestion des EventHandler
   virtual void		 AddDrawHandler(PIEventHandler* drwh, bool ad=false);
@@ -114,5 +118,15 @@
 };
 
-
+// ---- La classe PIGraphicBuffer doit se conformer a l'interface suivante
+// class PIGraphicBuffer {
+// public :
+//  			PIGraphicBuffer(int sx, int sy);
+//  virtual		~PIGraphicBuffer();
+//  virtual int         XSize();
+//  virtual int         YSize();
+//  virtual  void 	CopyFromWdg(PIWdg* wdg, int ox, int oy, int dx, int dy, int x, int y);
+//  virtual  void 	CopyToWdg(PIWdg* wdg, int ox, int oy, int dx, int dy, int x, int y);
+//  virtual  void 	CopyFrom(PIGraphicBuffer* grb, int ox, int oy, int dx, int dy, int x, int y);
+// };
   
 
Index: /trunk/SophyaPI/PI/piwdgx.cc
===================================================================
--- /trunk/SophyaPI/PI/piwdgx.cc	(revision 172)
+++ /trunk/SophyaPI/PI/piwdgx.cc	(revision 173)
@@ -25,4 +25,5 @@
 static SysDWdg  top = NULL;
 static Display * dpy = NULL;
+static GC defgc;
 // static char appname[64];
 static char appclass[64];
@@ -560,5 +561,19 @@
 top = XtVaAppInitialize(&appctx, appclass, NULL, 0, &n, ppc, (String*)(fallback_res), NULL);
 #endif
+if (top == NULL) {
+  fprintf(stderr, "PIWdgX::InitXt()/ Error XtVaAppInitialize() -> Exit \n");
+  exit(9);
+  }
 dpy = XtDisplay(top);
+if (dpy == NULL)  {
+  fprintf(stderr, "PIWdgX::InitXt()/ Error XtVaAppInitialize()/DisplayConnection -> Exit \n");
+  exit(9);
+  }
+
+/*  le GC pour les XCopyArea */
+XGCValues  xgv;
+xgv.function = GXcopy;
+xgv.plane_mask = ~0;
+defgc = XCreateGC (dpy, DefaultRootWindow(dpy), GCFunction | GCPlaneMask, &xgv); 
 
 // On va recuperer la fonte par defaut des composantes Motif
@@ -736,4 +751,12 @@
 #endif
 return;
+}
+
+//  Copie depuis un PIWdgGen
+void PIWdgX::CopyFrom(PIWdgGen* wdg, int ox, int oy, int dx, int dy, int x, int y)
+{
+PIWdgX* wx = (PIWdgX*)wdg;
+XCopyArea(XtDisplay(XtWdg()), XtWindow(wx->XtWdg()), XtWindow(XtWdg()), defgc, ox, oy, 
+          (unsigned int)dx, (unsigned int)dy, x, y);
 }
 
@@ -974,2 +997,54 @@
 return;
 }
+
+
+// -------- La classe PIGraphicBuffer ----------
+/* --Methode-- */
+PIGraphicBuffer::PIGraphicBuffer(int sx, int sy)
+{
+if (sx < 1) sx = 1;
+if (sy < 1) sy = 1;
+mSx = sx;  mSy = sy;
+Display * dsx = PIXDisplay();
+Window rw = DefaultRootWindow(dsx);
+xGrbuff = XCreatePixmap(dsx, rw, sx, sy, DefaultDepth(dsx, DefaultScreen(dsx)) );
+}
+/* --Methode-- */
+PIGraphicBuffer::~PIGraphicBuffer()
+{
+XFreePixmap(PIXDisplay(),xGrbuff); 
+}
+
+/* --Methode-- */
+int PIGraphicBuffer::XSize()
+{
+return(mSx);
+}
+
+/* --Methode-- */
+int PIGraphicBuffer::YSize()
+{
+return(mSx);
+}
+
+/* --Methode-- */
+void PIGraphicBuffer::CopyFromWdg(PIWdg* wdg, int ox, int oy, int dx, int dy, int x, int y)
+{
+XCopyArea(XtDisplay(wdg->XtWdg()), XtWindow(wdg->XtWdg()), XGrBuffer(), defgc, ox, oy, 
+          (unsigned int)dx, (unsigned int)dy, x, y);
+}
+
+/* --Methode-- */
+void PIGraphicBuffer::CopyToWdg(PIWdg* wdg, int ox, int oy, int dx, int dy, int x, int y)
+{
+XCopyArea(XtDisplay(wdg->XtWdg()), XGrBuffer(), XtWindow(wdg->XtWdg()), defgc, ox, oy, 
+          (unsigned int)dx, (unsigned int)dy, x, y);
+}
+
+/* --Methode-- */
+void PIGraphicBuffer::CopyFrom(PIGraphicBuffer* grb, int ox, int oy, int dx, int dy, int x, int y)
+{
+
+XCopyArea(PIXDisplay(), grb->XGrBuffer(), XGrBuffer(), defgc, ox, oy, 
+          (unsigned int)dx, (unsigned int)dy, x, y);
+}
Index: /trunk/SophyaPI/PI/piwdgx.h
===================================================================
--- /trunk/SophyaPI/PI/piwdgx.h	(revision 172)
+++ /trunk/SophyaPI/PI/piwdgx.h	(revision 173)
@@ -25,9 +25,9 @@
 public:
 // Les methodes ...
-  PIWdgX(int narg=0, char *arg[]=NULL);
-  PIWdgX(PIContainerGen *par, char *nom, 
-         int sx=10, int sy=10, int px=0, int py=0);
+  		  PIWdgX(int narg=0, char *arg[]=NULL);
+  		  PIWdgX(PIContainerGen *par, char *nom, 
+         		 int sx=10, int sy=10, int px=0, int py=0);
 
-  virtual ~PIWdgX();
+  virtual 	 ~PIWdgX();
 
   virtual void	 FinishCreate(); // apres avoir installe les sous-vues
@@ -64,4 +64,7 @@
   virtual void           PasteSelection(unsigned int typ, void *, unsigned int l);
 
+//  Copie depuis un PIWdgGen
+  virtual void		 CopyFrom(PIWdgGen* wdg, int ox, int oy, int dx, int dy, int x, int y);
+
 //  Gestion des EventHandler
   virtual void		 AddDrawHandler(PIEventHandler* drwh, bool ad=false);
@@ -94,4 +97,23 @@
 typedef PIWdgX PIWdg;
 
+// -------- La classe PIGraphicBuffer ----------
+class PIGraphicBuffer {
+public :
+  			PIGraphicBuffer(int sx, int sy);
+  virtual		~PIGraphicBuffer();
+
+  virtual int         	XSize();
+  virtual int         	YSize();
+  virtual  void 	CopyFromWdg(PIWdg* wdg, int ox, int oy, int dx, int dy, int x, int y);
+  virtual  void 	CopyToWdg(PIWdg* wdg, int ox, int oy, int dx, int dy, int x, int y);
+  virtual  void 	CopyFrom(PIGraphicBuffer* grb, int ox, int oy, int dx, int dy, int x, int y);
+
+//  Acces au Drawable X 
+  inline Pixmap		XGrBuffer() { return(xGrbuff); }
+protected :
+  Pixmap xGrbuff;
+  int mSx, mSy;
+};
+
 
 // Utile pour avoir acces au Display et Screen X ...
