// PixelArray.h: interface for the CPixelArray class.
//
//////////////////////////////////////////////////////////////////////
/** \file PixelArray.h
	\brief Rozhraní pro třídu CPixelArray
*/
#ifndef _PIXEL_ARRAY_
#define _PIXEL_ARRAY_

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


#include <cv.h>
#include <highgui.h>
#include "Structures.h"

/** Třída pro práci s obrazovýmy daty. Zajišťuje základní operace pro práci s obrazem
*/
class CPixelArray  : public CObject
{
	DECLARE_DYNAMIC(CPixelArray)

public:
	int m_width;  ///< Šířka obrazu
	int m_height; ///< Výška obrazu
	int m_depth;  ///< Hloubka obrazu
	CStructures::fPoint m_center;	///< Střed obrazu


	CPixelArray();										///< Defaultní konstruktor
	CPixelArray(int clmns, int rws, int depth);			///< Vytvoří objektu na základě rozměrů
	CPixelArray(char path[]);							///< Načte obraz ze souboru \a path
	CPixelArray(const CPixelArray & pa);				///< Kopírovací konstruktor
	CPixelArray & operator=(const CPixelArray & pa);	///< Operátor přiřazení

	virtual ~CPixelArray(); ///< Destruktor

	/** Alokuje paměť pro obraz požadované velikosti.
		@param[in] colmns - šířka obrazu
		@param[in] rws - výška obrazu
		@param[in] depth - hloubka obrazu
	*/
	void Create(int colmns, int rws, int depth);
	void Destroy();	///< Uvolní alokovanou paměť

	bool Load(const char* path);	///< Načte obraz ze souboru  \a path
	int Save(const char* path);		///< Uloží obraz  s názvem \a path
	void Display(const char* name);	///< Zobrazí obraz s názvem \a path
	void Clear();					///< Nastaví všechny pixely obrazu na barvu pozadí (černá)


	/** Nastaví hodnotu pixelu v dané hloubce a souřadnicích.
		Zadané souřadnice jsou brány v souřadném systému s počátkem v levém horním rohu.
		@see GetBasePosition
		@param[in] colmn - slupec
		@param[in] row - řádek
		@param[in] depth - hloubka
		@param[in] value - hodnota (0 - 255)
	*/
	void SetValue(int colmn, int row, int depth, float value);

	/** Nastaví hodnotu pixelu pro všechny hloubky stejnou.
		Barva pixelu bude v odstínu šedi.
		Zadané souřadnice jsou brány v souřadném systému s počátkem v levém horním rohu.
		@param[in] clmn - slupec
		@param[in] rw - řádek
		@param[in] value - hodnota (0 - 255)
	*/
	void SetGrayPixel(int clmn, int rw, float value);

	/** Nastaví hodnotu pixelu na zadané souřadnici pro všechny hloubky stejnou.
		Barva pixelu bude v odstínu šedi.
		Vstupní souřadnice jsou ze souřadného systému s počátkem ve středu obrazu a jsou 
		přepočítány do systému s počátkem v levém horním rohu.
		@param[in] point - struktura obashující x,y souřadnice pixelu
		@param[in] value - hodnota pixelu (0 - 255)
	*/
	void SetGrayPixel(CStructures::iPoint point, float value);

	/** Nastaví hodnotu pixelu na zadané souřadnici.
		Nastavují se zvlášť RGB kanály.
		Vstupní souřadnice jsou ze souřadného systému s počátkem ve středu obrazu a jsou 
		přepočítány do systému s počátkem v levém horním rohu.
		@param[in] point - struktura obashující x,y souřadnice pixelu
		@param[in] pixel - struktura obsahující RGB složky pixelu
	*/
	void SetRGBPixel(CStructures::iPoint point, CStructures::ARGBPixel pixel);
	// verze, která ukládá přímo na souřadnice pole bez korekce na střed
void CPixelArray::SetRGBPixelD(CStructures::iPoint point, CStructures::ARGBPixel pixel)	;
	/** Vrátí hodnotu pixelu na zadaných souřadnicích a dané hloubce.
		Zadané souřadnice jsou brány v souřadném systému s počátkem v levém horním rohu.
		@return hodnota pixelu v rozsahu 0 - 255
	*/
	double GetValue(int colmn, int row, int depth);

	/** Vrátí hodnotu pixelu v odstínu šedí na dané souřadnici.
		Zadané souřadnice jsou brány v souřadném systému s počátkem v levém horním rohu.
		@return hodnota pixelu v odstínu šedi (0 - 255)
	*/
	double GetGrayPixel(int clmn, int rw);

	/** Vrátí hodnotu pixelu v odstínu šedí na dané souřadnici.
		Vstupní souřadnice jsou ze souřadného systému s počátkem ve středu obrazu a jsou 
		přepočítány do systému s počátkem v levém horním rohu.
		@return hodnota pixelu v odstínu šedi
	*/
	double GetGrayPixel(CStructures::iPoint point);

	/** Vrátí hodnotu pixelu v RGB formátu na dané souřadnici.
		Vstupní souřadnice jsou ze souřadného systému s počátkem ve středu obrazu a jsou 
		přepočítány do systému s počátkem v levém horním rohu.
		@return RGB hodnota pixelu
	*/
	CStructures::ARGBPixel GetRGBPixel(CStructures::iPoint point);

	
	

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

private:
	double*** m_dat;	///< ukazatel na datové uložiště obrazu	
	IplImage* m_temp;	///< OpenCV proměnná pro načítání a ukládání obrazu

	/** Přepočítá vstupní souřadnici do souřadného systému datového uložiště.

		Obrazová předloha má počátek souřadného systému ve středu obrazu (na optické ose).

		Datové uložiště obrazu má počátek soüřadného systému v levém horním rohu.
		@param VirtualPosition - souřadnice z obrazové předlohy
		@return souřadnice v datovém uložišti
	*/
	CStructures::iPoint GetBasePosition(CStructures::iPoint VirtualPosition); 
	
	/** Alokuje paměť pro obraz.
	*/
	double*** AllocMems(int colmns,int rows,int depth);

	/** Uvolní paměť obazu.
	*/
	void DeallocMem();
};

#endif // _PIXEL_ARRAY_
