

#ifndef __MSIGNEDSHORTIMAGE__H__
#define __MSIGNEDSHORTIMAGE__H__

#include <iostream>
#include "Mmx.h"
#include "Sse.h"
#include "MUtils.h"

#include "MCharImage.h"

class MCharImage;

class MSignedShortImage {
  int x__, y__,xMin_, xMax_, yMin_, yMax_;
  signed short *Map;
  inline void SetSize(int x_, int y_);
 public:
  MSignedShortImage(int x_= 0, int y_= 0, int WithInit0= 0);
  ~MSignedShortImage();

  inline int x() const { return x__; }
  inline int y() const { return y__; }
  inline void Bound(int&xMin, int&xMax, int&yMin, int&yMax) const {xMin= xMin_; xMax= xMax_; yMin= yMin_; yMax= yMax_;}

  inline const signed short& M_(int xx, int yy) const { return Map[xx+yy*x__];}
  inline signed short& M(int xx, int yy) {return Map[xx+yy*x__];}

  void Fill(signed short GrayLevel);

  void ConvertFrom(const MCharImage& Image);

  //Soustraction de Image à this
  void Substract(const MSignedShortImage& Image);


  //calcul du produit de 2 MCharImage, resultat dans une MSignedShortImage
  //Attention : les images en char contiennent en realite des valeurs signees
  // 127 correspond a la valeur 0
  // 0 correspond a -127
  // 254 correspont a 127
  // 255 est non defini
  void CharProduct(const MCharImage& Image1,const MCharImage& Image2);

  const MSignedShortImage& operator=(const MSignedShortImage& Image);
  void Smooth121(int IsHorizontal0Vertical1, const MSignedShortImage& Data);

  //Filtre moyenneur 5x5 applique sur une MCharImage (non signee) et conversion en short dans la foulee
  void Moyenne5x5Char2Short(MCharImage& Data);
  void Somme5XChar2Short(MCharImage& Data);
  void MSignedShortImage::Somme5Y(MSignedShortImage& Data);
  void MSignedShortImage::Divide(short denom);

};

#endif

