/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016 Raytrix GmbH. All rights reserved.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once

#include "DLLInterface.h"
#include "Calibration.h"
#include "MetaData.h"

#include "Rx.Core.Ex/RxImage.h"

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Rx.LFR
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Rx
{
	namespace LFR
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>
		/// 	Extends the default CRxImage class by a set of meta data and a calibration.
		/// </summary>
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		class RX_API CRayImage : public CRxImage
		{
		public:

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Default constructor. Does not allocate image memory.
			/// </summary>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CRayImage();

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Move constructor.
			/// </summary>
			///
			/// <param name="xRayFile"> [in,out] The ray file to move. Is invalid after this call. </param>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CRayImage(CRayImage&& xRayFile);

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Destructor. Frees all used memory.
			/// </summary>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			virtual ~CRayImage();

		public:

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Move assignment operator.
			/// </summary>
			///
			/// <param name="xRayFile"> [in,out] The ray file to move. Is invalid after this call. </param>
			///
			/// <returns> This instance. </returns>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CRayImage& operator=(CRayImage&& xRayFile);

		public:

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Gets the meta data.
			/// </summary>
			///
			/// <returns> The meta data. </returns>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			const CMetaData& GetMetaData() const
			{
				return *m_pxMetaData;
			}

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Gets the meta data.
			/// </summary>
			///
			/// <returns> The meta data. </returns>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CMetaData& GetMetaData()
			{
				return *m_pxMetaData;
			}

		public:

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Gets the calibration.
			/// </summary>
			///
			/// <returns> The calibration. </returns>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			const CCalibration& GetCalibration() const
			{
				return *m_pxCalibration;
			}

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Gets the calibration.
			/// </summary>
			///
			/// <returns> The calibration. </returns>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CCalibration& GetCalibration()
			{
				return *m_pxCalibration;
			}

		private:

			/// <summary> Internal pointer to the meta data. </summary>
			CMetaData* m_pxMetaData;
			/// <summary> Internal pointer to the calibration. </summary>
			CCalibration* m_pxCalibration;
		};
	}
}
