/**
 * \file ElementStructurant.cpp
 * Implante une structure de stockage d'elements structurants pour les filtres de morphologie mathematique.
 * Definit quelques elements structurants usuels.
 * Exemple:<br>
 * [ .. X .. X .. ]<br>
 * [ X .. X .. _ ]<br>
 * [ .. _ .. 0 .. ]<br>
 * X : pixel devant etre present<br>
 * _ : pixel indifferent<br>
 * 0 : pixel devant etre absent  
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */

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

#include "ElementStructurant.h"

/**
 * Element structurant complet.
 * [ .. X .. X .. ]<br>
 * [ X .. X .. X ]<br>
 * [ .. X .. X .. ] 
 */
struct elementStructurant ELEMENT_STRUCTURANT_COMPLET = { 255,255,255,255,255,255,255 };

/**
 * Element structurant de squelettisation type 1.
 * [ .. X .. X .. ]<br>
 * [ _... X .. _ ]<br>
 * [ .. 0 .. 0 .. ] 
 */
struct elementStructurant ELEMENT_STRUCTURANT_SQUELETTISATION_1 = { 255,-1,0,0,-1,255,255 };

/**
 * Element structurant de squelettisation type 2.
 * [ .. X .. X .. ]<br>
 * [ X .. X .. _ ]<br>
 * [ .. _ .. 0 .. ] 
 */
struct elementStructurant ELEMENT_STRUCTURANT_SQUELETTISATION_2 = { 255,-1,0,-1,255,255,255 };

/**
 * Initialise un element structurant avec l'element structurant de squelettisation numero 1.
 *
 * @param e le pointeur sur l'element structurant a initaliser a l'element structurant de squelettisation numero 1.
 * @param bits le nombre de bits de l'image destinee a l'element structurant.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void initialiseElementSquelettisation1(struct elementStructurant *e,int bits) {
  int v = (0xFFFFFFFF>>(32-bits));
  e->c = e->g = e->sg = e->sd = v;
  e->d = e->ig = -1;
  e->id = 0 ;
}

/**
 * Initialise un element structurant avec l'element structurant de squelettisation numero 2.
 *
 * @param e le pointeur sur l'element structurant a initaliser a l'element structurant de squelettisation numero 2.
 * @param bits le nombre de bits de l'image destinee a l'element structurant.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void initialiseElementSquelettisation2(struct elementStructurant *e,int bits) {
  int v = (0xFFFFFFFF>>(32-bits));
  e->c = e->sg = e->sd = v;
  e->d = e->g = -1;
  e->id = e->ig = 0 ;
}

/**
 * Initialise un element structurant avec l'element structurant complet.
 *
 * @param e le pointeur sur l'element structurant a initaliser a l'element complet.
 * @param bits le nombre de bits de l'image destinee a l'element structurant.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void initialiseElementComplet(struct elementStructurant *e,int bits) {
  int v = (0xFFFFFFFF>>(32-bits));
  e->c = e->d = e->g = e->id = e->ig = e->sd = e->sg = v;
}

/**
 * Tourne de 60° les valeurs d'un element structurant.
 *
 * @param e le pointeur sur l'element structurant a modifier.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void rotation(struct elementStructurant *e) {
  int aux;
  aux = e->d;
  e->d = e->id;
  e->id = e->ig;
  e->ig = e->g;
  e->g = e->sg;
  e->sg = e->sd;
  e->sd = aux;
}

/**
 * Transpose les valeurs d'un element structurant.
 *
 * @param e le pointeur sur l'element structurant a modifier.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void transpose(struct elementStructurant *e) {
  int aux;
  aux = e->d;
  e->d = e->g;
  e->g = aux;
  aux = e->id;
  e->id = e->sg;
  e->sg = aux;
  aux = e->sd;
  e->sd = e->ig;
  e->ig = aux;
}

/**
 * Construit une chaine de caracteres de description d'un element structurant.
 *
 * @param e le pointeur sur l'element structurant a traiter.
 * @return la chaine de caracteres construite
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
char *toString(struct elementStructurant *e) {
  static char s[2048];
  sprintf(s,"[%d,[%d,%d,%d,%d,%d,%d]]",e->c,e->d,e->id,e->ig,e->g,e->sg,e->sd);
  return(s);
}
