#ifndef WAVELET_H_
#define WAVELET_H_

#include "DataGrid.h"
#include "Filter.h"
#include "FilterSet.h"
#include "DataGrid.h"
#include "Common.h"
#include "RemoteProcessor.h"

enum TRANSFORM_TYPE {
	   TRANSFORM_TYPE_INVALID = -1,
	   DWT,
	   IDWT,
	   SWT,
       RECONSTRUCTION,
	   TRANSFORM_TYPE_MAX
};

enum SYMMETRY {
	UNKNOWN = -1,
	ASYMMETRIC = 0,
	NEAR_SYMMETRIC = 1,
	SYMMETRIC = 2
};

class Wavelet
{
public:
	Wavelet();
	virtual ~Wavelet();
	void transform(DataGrid * data);
	void inverseTransform(DataGrid * data);
	
	
	int npad;
	int nsteps;
	double limit;
	int mode;
	
	FilterSet * filterset;
	Filter *analysisLow, *analysisHigh;    // H and G
	Filter *synthesisLow, *synthesisHigh;  // H~ and G~	
	
	int dec_len;	// length of decomposition filter
	int rec_len;	// length of reconstruction filter
	
	int dec_hi_offset;		// usually 0, but some filters are shifted in time
	int dec_lo_offset;
	int rec_hi_offset;		// - || -
	int rec_lo_offset;		// - || -

	int vanishing_moments_psi;
	int vanishing_moments_phi;
	int support_width;

	int symmetry:3;

	int orthogonal:1;
	int biorthogonal:1;
	int orthonormal:1;

	int compact_support:1;

	int _builtin:1;

	char* family_name;
	char* short_name;

protected:
	void transform1D(DataGrid * data);
	void transform2D(DataGrid * data);
	void transform3D(DataGrid * data);
	
	void inverseTransform1D(DataGrid * data);
	void inverseTransform2D(DataGrid * data);
	void inverseTransform3D(DataGrid * data);

	RemoteProcessor * remote;

};


#endif /*WAVELET_H_*/
