// Module PI : Peida Interactive     PIPixmap
// Classe de base pour affichage de pixmap  Reza 96
// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA

#include <stdlib.h>
#include <stdio.h>

#include "pipixmapgen.h"

// --------- Methodes de la classe PIPixMap  ----------
//++
// Class	PIPixmap
// Lib		PI
// include	pipixmapgen.h
//
//   	Classe pour la gestion optimisée des pixmap.
//	Un pixmap est un tableau d'index dans une table de couleurs.
//	Cette classe gére actuellement des pixmaps avec des index
//	codés sur 8 bits (256 couleurs).
//	Pour des raisons d'optimisation, cette classe a une 
//	implémentation spécifique pour chaque plateforme.
//	La classe "PIPixmapGen" définit l'interface, et ne doit pas 
//	être instanciée directement.  Les objets instanciés sont de la 
//	classes "PIPixmap" et le fichier entête correspondant est "PIPIXMAP_H"
//	défini dans "pisysdep.h".
//--
//++
// Links	Parents
// PIBaseWdg
//--
//++
// Links	Voir aussi
// PIColorMap
//--

//++
// Titre	Constructeur, Pixmap
//--
//++
// PIPixmapGen(PIContainerGen *par, const char *nom, int sx=10, int sy=10, int px=0, int py=0)
//	Constructeur - Création d'un "PIPIxmap".
// long  kind() 
//	Retourne le type ("=PIPixmap::ClassId")
// void  SetPixmap(unsigned char *pix, int sx, int sy, bool refr=true, int ox=0, int oy=0)
//	Associe un tableau d'index "pix" de taille "sx * sy".
//	(ox,oy)" définissent  l'offset d'affichage.
//	Si "refr=true", la méthode "Refresh()" est appelée.
//--
//++
// Titre	Gestion de la table de couleur
//--
//++
// void  SetColMap(PIColorMap* cmp, bool refr=true)
//	Change la table de couleur associée.
//	Si "refr=true", la méthode "Refresh()" est appelée.
// void  SetColMapId(CMapId cmapid, bool refr=true)
//	Change la table de couleur associée, à l'aide d'un identificateur
//	de table de couleur standard. ("CMapId cmapid").
//	Si "refr=true", la méthode "Refresh()" est appelée.
// PIColorMap* GetColMap()
//	Retourne la table de couleur associée.
// CMapId GetColMapId() 
//	Retourne l'identificateur de la table de couleur associée.
// int NbCol()
//	Retourne le nombre de couleurs de la table de couleur associée.
//--

//++
// Titre	Actions
//--
//++
// void  But1Press(int x, int y)
//	L'action sur le bouton 1 déclenche l'envoi d'un message
//	avec le modifier PIMsg_Click. La position du bouton-press
//	est stocké. (- Offset affichage)
// int  XPPos() 
//	Position X du click - Offset Affichage pixmap
// int  YPPos() 
//	Position Y du click - Offset Affichage pixmap
//--

/* --Methode-- */
PIPixmapGen::PIPixmapGen(PIContainerGen  *par, const char *nom,
                     int sx, int sy, int px, int py) :
PIBaseWdg(par, nom, sx, sy, px, py)
{
pixmap = NULL;
nx = ny = 0;
ofx = ofy = 0;
mPpos[0] = mPpos[0] = 0;
cmap = new PIColorMap(CMAP_GREY32);
ActivateButton(1);
}


/* --Methode-- */
PIPixmapGen::~PIPixmapGen()
{
delete cmap;
}

/* --Methode-- */
void PIPixmapGen::SetPixmap(unsigned char *pix, int sx, int sy, bool refr, int ox, int oy)
{
pixmap = pix; 
if (pixmap)
  {
  if (sx < 0)  sx = 0;
  if (sy < 0)  sy = 0;
  if (ox < 0)  ox = 0;
  if (oy < 0)  oy = 0;
  nx = sx; ny = sy;
  ofx = ox;  ofy = oy;
  }
else { ofx = ofy = nx = ny = 0; }
if (refr) Refresh();   
}

/* --Methode-- */
void PIPixmapGen::SetColMap(PIColorMap* cmp, bool refr)
{
if (!cmp)  return;
if ( (cmp->Type() == cmap->Type()) && (cmp->Type() != CMAP_OTHER) 
     && (cmp->IsColorIndexReversed() == cmap->IsColorIndexReversed()) ) return;
if (cmap) delete cmap;
cmap = new PIColorMap(*cmp);
if (refr)  Refresh();  
}

/* --Methode-- */
void PIPixmapGen::SetColMapId(CMapId cmapid, bool revidx, bool refr)
{
if (!cmap || (cmap->Type() != cmapid) || (cmapid == CMAP_OTHER) 
    || (cmap->IsColorIndexReversed() != revidx) ) {  
  if (cmap) delete cmap;
  cmap = new PIColorMap(cmapid);
  cmap->ReverseColorIndex(revidx);
  }
if (refr)  Refresh();  
}


/* --Methode-- */
void  PIPixmapGen::But1Press(int x, int y)
{
mPpos[0] = x-ofx;  mPpos[1] = y-ofy;  
if (Msg())  Send(Msg(), PIMsg_Click, mPpos);
return;
}



// Fin des methodes de la classe 


