// FilterManager.h: interface for the CFilterManager class.
//
//////////////////////////////////////////////////////////////////////

/** \file FilterManager.h
	\brief Rozhraní pro třídu CFilterManager
*/

#if !defined(_FILTERMANAGER_H_)
#define _FILTERMANAGER_H_

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

#include "FilterBase.h"
#include "Camera.h"
#include "PatternManager.h"
#include <afxcoll.h>

#include "FilterBarrel.h"
#include "FilterLightness.h"
#include "FilterCamera.h"
#include "FilterAlias.h"

/** Třída spravujicí seznam vytvořených filtrů. 
	Obsahuje seznam všech vytvořených filtrů a filtrů zařazených do výpočtu.
*/
class CFilterManager : public CObject  
{
private:
	CObList m_listCreated;		///< Seznam vytvořených filtrů
	CObList m_listRegistred;	///< Seznam zařazených filtrů do výpočtu
	POSITION m_pos;				///< Ukazatel pozice v seznamech

	CPixelArray* m_pSourceArray;	///< Datové uložiště pro vstupní obraz
	CPixelArray* m_pTargetArray;	///< Datové uložiště pro výstupní obraz

	CString m_strSavePath;			// 

public:
	CFilterManager();			///< Defaultní konstruktor
	virtual ~CFilterManager();	///< Destruktor

	/** Přidá vytvořený filtr na konec seznamu vytvořených.
		@param[in] pFilter - ukazatel na vytvořený filtr
	*/
	void AddFilter(CFilterBase* pFilter);

	/** Zařadí filtr na danou pozici do seznamu pro výpočet.
		Pokud není pozice nalezena, je vrstva zařazena na konec
		@param[in] pFilter - ukazatel na zařazovaný filtr
		@param[in] index - pozice na kterou se filtr zařadí (počítano od 0), -1 = zařazen na konec
	*/
	void RegisterFilter(CFilterBase* pFilter, int index);	//zaradi filtr do vypoctu
	
	/** Odstraní filtr na dané pozici ze seznamu filtrů použitých pro výpočet.
		@param[in] index - pozice filtru k odstranění
		@return \c true = filtr odstraněn, \c false = požadovaný index nebyl nalezen
	*/
	void UnregisterFilter(int index);

	void RegisterAll();					///< Zařadí všechny vytvořené filtry do výpočtu
	void UnregisterAll();				///< Odstrani všechny filtry z výpočtu
	void Empty();						///< Vyprázdní oba seznamy filtrů

	void MoveUp(int index);		///< Přesune filtr na daném indexu v pořadí blíže ke kameře
	void MoveDown(int index);	///< Přesune filtr na daném indexu v pořadí dále od kamery

	/** Vrátí ukazatel na daný filtr v seznamu všech vytvořených.
		@param[in] index - pozice filtru
		@return ukazatel na filtr, v případně nenalezení vrací \c NULL
	*/
	CFilterBase* GetFilterCreated(int index);	///<vrati filtr na danem indexu
	
	/** Vrátí ukazatel na daný filtr v seznamu zařazených.
		@param[in] index - pozice filtru
		@return ukazatel na filtr, v případně nenalezení vrací \c NULL
	*/
	CFilterBase* GetFilterRegistred(int index);	///<vrati filtr na danem indexu
	
	int GetCountCreated();						///< Vrátí počet všech vytvořených filtrů
	int GetCountRegistred();					///< Vrátí počet zařazených filtrů do výpočtu

	/** Vypočítá potřebné rozlišení pro zařazené filtry.
		Rozlišení prvního filtru v řadě je nastaveno podle rozlišení kamery.
		Rozlišení posledního filtru určuje rozlišení potřebné pro testovací vzor.
		@param pCamera - ukazatel na objekt kamery, získává se její rozlišení
		@param pPatternManager - ukazatel na správce vzorů. Je potřeba nastavit rozlišení předlohy
		@return \c true = inicializace rozměrů proběhla v pořádku, \c false = není zařazen žádný filtr
	*/
	bool PrepareFilters(CCamera* pCamera, CPatternManager* pPatternManager);
	
	/** Spustí výpočet zkreslení.
		Prochází se postupně všechny zařazené filtry od posledního v řadě. Vždy pro aktuální filtr se
		alokuje potřebná paměť, zavolá se funkce pro transformaci. Uvolní se nepotřebá paměť.
		@return \c true = výpočet proběhl v pořádku, \c false = nastala chyba
		@see CFilterBase::Transform
	*/
	bool StartProcess();
	
	void LoadPattern(char path[]);				///< Načte vstupní obraz ze souboru
	void LoadPattern(CPixelArray* pPattern);	///< Načte vstupní obraz jako vlastní vytvořený vzor

	//nepouzito
	void SaveCreated();
	void SetSavePath(CString strPath);

};

#endif // !defined(_FILTERMANAGER_H_)
