// FilterBase.h: interface for the CFilterBase class.
//
//////////////////////////////////////////////////////////////////////

/** \file FilterBase.h
	\brief Rozhraní pro třídu CFilterBase
*/

#if !defined(_FILTER_BASE_H_)
#define _FILTER_BASE_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <math.h>
#include "Structures.h"
#include "PixelArray.h"
#include <cstring>	
#include <iostream>
using namespace std;

#define IDF_CAMERA 0	///< ID filtru camera
#define IDF_BARREL 1	///< ID filtru barrel
#define IDF_LIGHTNESS 2	///< ID filtru lightness
#define IDF_ALIAS 3		///< ID filtru alias
#define IDF_NEW 4		//Nový filtr

/** Třída zahrnující společné vlastností filtrů obrazového zkreslení
*/
class CFilterBase : public CObject  
{
DECLARE_DYNAMIC(CFilterBase)

private:
	static int num_filters;		///< Počet vytvořených instancí třídy

	char* m_FilterName;			///< Název filtru
	int m_len;					///< Délka řetězce
	//MR float m_CameraFocus;		//focus kamery - nepouziva se
	//MR float m_DistanceToCamera;	//vzdalenost od kamery - nepouziva se
	int	m_Width;				///< Šířka filtrtu	
	int	m_Height;				///< Výška filtru
	CStructures::fPoint m_Center;		///< Souřadnice středu filtru
	CStructures::Supersample m_supersample; ///< Poměr převzorkování
	bool m_bSave;				///< \c true  = vysledek transformace chceme ulozit, \c false = nechceme
	bool m_bDisplay;			///< \c true = vysledek chceme zobrazit, \c false = nechceme
	bool m_bUse;				///< filtr \c true = zařazen, \c false = nezařazen do výpočtu

public:
	CFilterBase();				///< Defaultní konstruktor
	
	/** Parametrický konstruktor.
		Inicializuje společné prvky filtrů
		@param name - nazev filtru
	*/
	CFilterBase(float CameraFocus, float DistanceToCamera, const char* name = "Untitled");
	
	CFilterBase(const CFilterBase & fb);				///< Kopírovací konstruktor
	CFilterBase & operator=(const CFilterBase & fb);	///< Operátor přiřazení
	virtual ~CFilterBase();								///< Destruktor

	void SetSupersample(CStructures::Supersample supersample);				///< Nastaví převzorkování obrazu
	CStructures::Supersample GetSupersample() const {return m_supersample;}	///< Vrátí poměr převzorkování

	
	char* GetName() {return m_FilterName;}				///< Vrátí název filtru
//MR	float GetCameraFocus() {return m_CameraFocus;}		//vrati focus kamery
//MR	float GetDistance() {return m_DistanceToCamera;}	//vrati vzdalenost filtru od kamery
	void Rename(const char* name);						///< Přejmenuje filtr na nový nazev
	void SetSize(CStructures::iPoint size);				///< Nastaví rozměry filtru
	CStructures::iPoint GetSize() const;					///< Vrátí rozměry filtru
	float GetDistanceToCenter(CStructures::iPoint point) const; ///< Vrátí vzdálenost zadaného bodu ke stredu
	void Save(bool save){m_bSave = save;}				///< Nastaví příznak pro uložení výsledného obrazu \c true = uložit, \c false = neukládat
	bool Save(){return m_bSave;}						///< Vrátí příznak nastavení uložení
	void Display(bool display) {m_bDisplay = display;}	///< Nastaví příznak pro zobrazení výsledného obrazu \c true = zobrazit, \c false = nezobrazovat
	bool Display() {return m_bDisplay;}					///< Vrátí příznak nastavení zobrazení
	void Use(bool bUse){m_bUse = bUse;} ///< Nastaví příznak, zda se má vrstva použít
	bool Use(){return m_bUse;}			///< Vrací příznak zařazení vrstvy do testovacího vzoru

	virtual void Show();								///< Zobrazí informace o nastavení filtru
	virtual double GetParam() const = 0;				///< Vrátí paprametr zkreslení
	virtual CStructures::iPoint GetNextSize() const = 0;	///< Vráti rozměry potřebné pro následující filtr v řadě
	virtual int GetType() {return -1;}					///< Vrátí ID filtru

	/** Provede obrazovou transformaci.
		Dle definovaného pžedpisu zkreslení převede vstupní obraz na výsledná výstupní
		@param[in] pSource - ukazatel na zdrojový obraz (předlohu)
		@param[out] pTarget - ukazatel na data pro uložení výsledku
	*/
	virtual void Transform(CPixelArray* pSource, CPixelArray* pTarget);

	//dumping objektu
	#ifdef _DEBUG
		void Dump(CDumpContext& dc) const;
	#endif //_DEBUG

};

#endif // !defined(_FILTER_BASE_H_)
