// Module PI : Peida Interactive     PIGraphic 
// Primitives de trace graphiques    R. Ansari  97
// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA

// Classe generique de trace graphique de base (Ne peut etre instancie)

#include "pigraphgen.h"

//++
// Class	PIGraphic
// Lib		PI
// include	pigraphgen.h
//
//   	Classe de base fournissant les services de tracé graphique.
//   	La classe PIGraphicGen définit l'interface à travers des méthodes
//   	virtuelles pures. Les objets instanciés doivent être de la classe
//   	"PIGraphicWin" ou "PIGraphicUC" ou ...
//   	La classe "PIGraphicWin" a une implementation dépendante du système 
//   	utilisé (Mac, XWindow, ...). 
//   	Un type particulier *PIGrCoord* est défini pour la spécification 
//	des coordonnées graphiques. 
//--
//++
// Links	Voir aussi
// PIGrCoord
// PIFont
// PIColorMap
//--

//++
// Titre	Constructeurs
//--
//++
// PIGraphic()
//	Constructeur utilisé par les classes dérivées.
// PIGraphic(PIWdg* wdg)
//	Constructeur pour les *PIGraphicWin*. Objet "PIGraphic" capable 
//	de tracer dans un "PIWdg".
// PIGraphic(PIScreenBuffer* grb)
//	Constructeur pour objet "PIGraphic" capable de tracer dans un 
//	buffer graphique.
//--
//++
//--
// Titre	Méthodes
//++
// int  kind()
//	Renvoie le type de l'objet "PIGraphic" .
//	* PI_UnknownGraphics : Objet PIGraphic de type inconnue.
//	* PI_ScrBufferGraphics : 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)
//	* PI_UCGraphics : Objet PIGraphic travaillant dans un système de coordonnées utilisateur.
//	* PI_3DGraphics : Objet PIGraphic fournissant des méthodes de tracé en coordonnées 3-D
// void  GetGrSpace(PIGrCoord& xmin, PIGrCoord& xmax, PIGrCoord& ymin, PIGrCoord& ymax)
//	Renvoie les limites de l'espace graphique - Coordonnées fenêtre pour un PIGraphicWin, 
//	Limites définies par l'utilisateur pour un PIGraphicUC
// void  Erase(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy) 
//	Efface le rectangle défini par le coin "x0,y0", de longeur et de largeur "dx,dy"
//	en utilisant la couleur d'arrière plan (Background)
//--


/* --Methode-- */
PIGraphicGen::PIGraphicGen()
{
myWdg = NULL;
myGrb = NULL;
}

/* --Methode-- */
PIGraphicGen::PIGraphicGen(PIWdg* wdg)
{
myWdg = wdg;
myGrb = NULL;
}

/* --Methode-- */
PIGraphicGen::PIGraphicGen(PIScreenBuffer* grb)
{
myWdg = NULL;
myGrb = grb;
}

/* --Methode-- */
PIGraphicGen::~PIGraphicGen()
{
}
/* --Methode-- */
int PIGraphicGen::kind() 
{
return PI_UnknownGraphics ;
}


/* --Methode-- */
void PIGraphicGen::GetGrSpace(PIGrCoord& xmin, PIGrCoord& xmax, PIGrCoord& ymin, PIGrCoord& ymax)
{
xmin = ymin = 0;  
xmax = ymax = 0;
if (myWdg) {
  xmax = myWdg->XSize();
  ymax = myWdg->YSize();
  }
}

//++ 
// Titre	Tracés de texte
//--
//++
// void  DrawString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0)
//	Trace la chaîne de caractères "s" à la position "x,y", 
//	en utilisant la couleur d'avant-plan (Foreground)
//	La chaine est trace avec une justification a gauche, ou droite,
//	ou centree (horzontal) - bas, haut, milieu (vertical), en fonction de
//	de la valeur du flag "pos"
//|	PI_HorizontalLeft PI_HorizontalCenter PI_HorizontalRight
//|	PI_VerticalBottom PI_VerticalCenter PI_VerticalTop
// void  DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0) 
//	Trace la chaîne de caractères "s" à la position "x,y" . La couleur d'
//	arrière-plan est utilisée pour remplir la zone rectangulaire occupée par
//	le tracé de texte.
//	La chaine est trace avec une justification a gauche, ou droite,
//	ou centree (horzontal) - bas, haut, milieu (vertical), en fonction de
//	de la valeur du flag "pos"
//|	PI_HorizontalLeft PI_HorizontalCenter PI_HorizontalRight
//|	PI_VerticalBottom PI_VerticalCenter PI_VerticalTop
//--

//++ 
// Titre	Tracés de lignes et de figures géometriques
//--
//++
// void  DrawLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
//	Trace une ligne entre les points de coordonnées "(x1,y1)" et "(x2,y2)", 
//	en utilisant la couleur d'avant-plan (Foreground)
// void  DrawBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
//	Tracé du contour d'un rectangle défini par la position du coin "(x0,y0)"
//	et de taille "dx,dy" avec la couleur d'avant-plan.
// void  DrawFBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
//	Tracé d'un rectangle plein, défini par la position du coin "(x0,y0)"
//	et de taille "dx,dy" avec la couleur d'avant-plan.
// void  DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)  
//	Tracé du contour d'un cercle centré en "(x0,y0)", de rayon "r"
// void  DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)  
//	Tracé d'un cercle plein centré en "(x0,y0)", de rayon "r"
// void  DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
//	Tracé d'une ellipse incluse dans le rectangle "(x0,y0)" , "dx,dy"
// void  DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
//	Tracé d'une ellipse pleine incluse dans le rectangle "(x0,y0)" , "dx,dy"
// void  DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true)
//	Tracé du contour d'un polygone défini par le tableau des "n" points "x,y".
//	Si "cinc==true", les coordonnées seront considérées comme relatives
//	à la position du point "(x[0], y[0])". Dans le cas contraire, chaque couple
//	"(x[i], y[i])" représentera les coordonnées absolues d'un coin du polygone.
// void  DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true)
//	Tracé d'un polygone plein de la couleur d'avant-plan.
// void  DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, double degdeb, double degfin)
//	Tracé d'un arc de cercle ou d'ellipse, inclu dans le "(x0,y0)" , "dx,dy" 
//	entre les angles (en degré) "degdeb" - "degfin" 
// void  DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, double degdeb, double degfin)
//	Tracé d'un arc plein, inclu dans le "(x0,y0)" , "dx,dy" 
//	entre les angles (en degré) "degdeb" - "degfin" 
//--

//++ 
// Titre	Tracés de signes
//--
//++
// void  DrawMarker(PIGrCoord x0, PIGrCoord y0)  
//	Tracé d'un signe au point "(x0,y0)". Le choix du signe tracé s'effectue
//	à travers la méthode "SelMarker()"
// void  DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n)
//	Tracé de "n" signes aux points "(x[i],y[i])"
//--

//++
// Titre	Tracé d'images (pixmap)
//--
//++
// void  DrawPixmap(PIGrCoord x, PIGrCoord y, unsigned char *pix, int sx, int sy, PIColorMap* cmap)
//	Tracé d'un pixmap dans un rectangle positionné en "(x,y)". Le tableau des pixels
//	"pix", de taille "sx,sy" représente les index dans la table de couleur "cmap".
//--

//++
// Titre	Modifications des attributs graphiques	
//--
//++
// void  SelForeground(PIColors col=PI_Black)
//	Choix de la couleur de tracé d'avant-plan
//|	PI_Black , PI_White,  PI_Grey , PI_Red , PI_Blue , PI_Green ,  
//|	PI_Yellow , PI_Magenta , PI_Cyan , PI_Turquoise , PI_NavyBlue , 
//|	PI_Orange , PI_SiennaRed , PI_Purple , PI_LimeGreen , PI_Gold ,
//|	PI_ColorAllBits0 , PI_ColorAllBits1
// void  SelBackground(PIColors col=PI_White)
//	Choix de la couleur d'arrière-plan
// void  SelForeground(PIColorMap& cmap, int cid) 
//	Choix de la couleur de tracé d'avant-plan: Couleur numéro "cid" de la table de couleur "cmap"
// void  SelBackground(PIColorMap& cmap, int cid)
//	Choix de la couleur d'arrière-plan: Couleur numéro "cid" de la table de couleur "cmap"
// void  SelGOMode(PIGOMode mod=PI_GOCopy) 
//	Choix du mode de tracé graphique: "PI_GOCopy" ou "PI_GOXOR" ou 	"PI_GOInvert"
// void  SelLine(PILineAtt att=PI_NormalLine)
//	Choix du type de ligne pour le tracé des lignes et contours
//|	PI_NormalLine, PI_ThinLine , PI_ThickLine
//|	PI_DashedLine, PI_ThinDashedLine, PI_ThickDashedLine
//|	PI_DottedLine, PI_ThinDottedLine, PI_ThickDottedLine
// void  SelMarker(int msz=3, PIMarker mrk=PI_DotMarker) 
//	Choix de la taille et du type de signe pour "DrawMarker() / DrawMarkers()"
//|	PI_DotMarker , PI_PlusMarker , PI_CrossMarker
//|	PI_CircleMarker , PI_FCircleMarker , PI_BoxMarker , PI_FBoxMarker
//|	PI_TriangleMarker , PI_FTriangleMarker , PI_StarMarker , PI_FStarMarker
//	(Les "StarMaker" ne sont pas encore implémentés  11/98) 
//--

//++
// Titre	Changement de fontes
//--
//++
// void  SelFont(PIFont & fnt)
//	Choix de fonte courant.
// void  SelFont(PIFontSize sz=PI_NormalSizeFont, PIFontAtt att=PI_RomanFont)
//	Changement de taille et attribut de fonte
//|	PI_SmallSizeFont , PI_NormalSizeFont , PI_BigSizeFont, PI_HugeSizeFont
//|	PI_RomanFont , PI_BoldFont , PI_ItalicFont 
// void  SelFontSzPt(int npt=12, PIFontAtt att=PI_RomanFont)
//	Choix de taille de fonte avec spécification de taille en points 
//	(pixels sur l'écran)
// 
//--

//++
// Titre	Sélection de la zone de tracé (clip)	
//--
//++
// void  SetClipRectangle(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
//	Limite la zone de tracé permise au rectangle "(x0,y0)", "dx,dy"
// void  ClearClipRectangle() 
//	Supprime si nécéssaire la limitation de la zone de tracé.	
//--

//++
// Titre	Accès aux attributs graphiques
//--
//++
// PIColors  GetForeground()
//	Renvoie la couleur de tracé d'avant-plan courante. 
//	("PI_ColorFromMap" si défini à partir d'une table de couleur
// PIColors  GetBackground()
//	Renvoie la couleur d'arrière-plan courante.
// PIGOMode  GetGOMode()
//	Renvoie le mode de tracé graphique courante.
// PIFontAtt GetFontAtt()
//	Renvoie les attributs de la fonte courante.
// int GetFontSize() 
//	Renvoie la taille de la fonte courante.
// PILineAtt GetLineAtt() 
//	Renvoie le type de ligne courant
// PIMarker  GetMarker() 
//	Renvoie le type de signe (Marker) courant
// int GetMarkerSize()
//	Renvoie la taille des signes (Marker) pour le marker courant
// PIFont  GetFont()
//	Retourne une copie de l'objet "PIFont" courant.
// PIGrCoord  GetFontHeight(PIGrCoord& asc, PIGrCoord& desc);
//	Renvoie la hauteur des caractères, ainsi que la taille au dessus
//	et en-dessous de la ligne de base ("asc , desc") pour la fonte courante
//	dans le système de coordonnées courant (Fenêtre ou UC).
// PIGrCoord CalcStringWidth(char const* s)
//	Renvoie la largeur occupé par un texte s'il était affiché dans le 
//	système de coordonnées courant (Fenêtre ou UC).
//--

/* --Methode-- */
PIGrCoord PIGraphicGen::GetFontHeight(PIGrCoord& asc, PIGrCoord& desc)
{
int t,a,d;
t = myFont.GetFontHeight(a, d);
asc = a;   desc = d;
return(t);
}

/* --Methode-- */
PIGrCoord PIGraphicGen::CalcStringWidth(char const* s)
{
return (myFont.GetStringWidth(s));
}

//++
// Titre	Sauvegarde et rappel des attributs graphiques
//--
//++
// void  SaveGraphicAtt()
//	Sauvegarde des attributs graphiques courants
// void  RestoreGraphicAtt()
//	Utilisation de l'ensemble des attributs graphiques sauvegardés par un appel
//	à "SaveGraphicAtt()"
//--


/* --Methode-- */
void PIGraphicGen::SaveGraphicAtt()
{
  sFCol = GetForeground();
  sBCol = GetBackground();
  sGOm = GetGOMode();
  sFont = GetFont();   
  sLAtt = GetLineAtt();
  sMrk = GetMarker();   
  sMrkSz = GetMarkerSize();
  return;
}

/* --Methode-- */
void PIGraphicGen::RestoreGraphicAtt()
{
  SelForeground(sFCol);
  SelBackground(sBCol);
  SelGOMode(sGOm);
  SelFont(sFont);
  SelLine(sLAtt);
  SelMarker(sMrkSz, sMrk);
  return;
}




//++
// Class	PIGrCoord
// Lib		PI
// include	pigraphgen.h
//
//   	Classe utilisé pour la spécifiaction de coordonnées graphique.
//	Des constructeurs et des méthodes de conversion à partir 
//	et vers des "int", "float" et "double" sont définis.
//	L'objet conserve le type effectif de l'argument lors de la 
//	création ou de la dernière affectation.
// 
//|	PIGrCoord gco;
//|	gco = 3.141596 ; 
//|	int ic = gco;     // ic -> 3
//|	float fc = gco;   // fc -> 3.141596
//--
//++
// Links	Voir aussi
// PIGraphic
//--

//++
// Titre	Constructeurs
//--
//++
// 
// PIGrCoord() 
//	Constructeur par défaut ("intVal=floatVal=0")
// PIGrCoord(int a)
//	Constructeur à partir de l'entier "a"
// PIGrCoord(float a) 
//	Constructeur à partir de la valeur flottante "a"
// PIGrCoord(double a) 
//	Constructeur à partir de la valeur flottante double précision "a"
//--
//++
// Titre	Opérateurs de conversion
//--
//++
// operator int() 
//	Conversion en entier "int"
// operator short() 
//	Conversion en entier "short"
// operator unsigned int() 
//	Conversion en entier non signé "unsigned int"
// operator unsigned short() 
//	Conversion en entier non signé "unsigned short"
// operator float() 
//	Conversion en réél "float"
// operator double() 
//	Conversion en réél "double"
//--
//++
// Titre	Opérateurs d'affectation
//--
//++
// PIGrCoord& operator= (int a) 
//	Affectation à partir de valeur entière "int"
// PIGrCoord& operator= (float a) 
//	Affectation à partir de valeur réélle "float"
// PIGrCoord& operator= (double a) 
//	Affectation à partir de valeur réélle double précision "double"
//--
