// Image.h: interface for the CImage class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_IMAGE_H__D3142778_9555_4128_887F_104A5F9478E1__INCLUDED_)
#define AFX_IMAGE_H__D3142778_9555_4128_887F_104A5F9478E1__INCLUDED_

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

#include "BaseException.h"

/** ImageFormat constants */
enum IMAGE_FORMAT { IF_BMP, IF_JPG };


/** Exception class for CImage and its derivative classes.
*
*	ex) You can throw CImageException object like this.
*
*	1. throw CImageException();	-> Reason would be "Exception".
*
*	2. throw CImageException(_T("Disaster")); -> Reason would be "Disaster".
*
*	3. throw CImageException(_T("Disaster"), LOCATION); ->Reason would be "Disaster SomeFile line no 11".
*/
class CImageException : public BaseException
{
public:
	/** Default Constructor
	*	@param		None
	*	@exceptions	None
	*/
	CImageException() throw() : BaseException(_T("ImageException")) {}
	/** Constructor with string description
	*	@param		message - This should be a useful message for error tracking.
	*	@exceptions	None
	*/
	CImageException(string message) throw() : BaseException(message) {}
	/** Constructor with string description and error location 
	*	@param		message - This should be a useful message for error tracking.
	*	@param		location - Location where Exception has occrurred. You can use LOCATION macro here.
	*	@exceptions	None
	*/
	CImageException(string message, string location) throw() : BaseException(message, location) {}
};

/** Base class of all Image Class.
*
*	Normally, you use this class for all bmp, jpg objects.
*
*	ex) CImage* pImage = new CDib;
*
*		pImage->Draw(pDC);
*/
class CImage  
{
public:
	/** Virtual Destructor.
	*	Does nothing
	*/
	virtual ~CImage(){}
	/** Load image from specified filename. Overriding Function
	*	@param		fileName - Name of the File
	*	@return		None
	*	@exceptions	CImageException
	*/
	virtual void Load(CString fileName) throw(CImageException) = 0;
	/** Load image from CFile pointer. Overriding Function
	*	@param		pFile - CFile pointer
	*	@return		None
	*	@exceptions	CImageException
	*/
	virtual void Load(CFile* pFile) throw(CImageException) = 0;
	/** Save image with a specified filename. Overriding Function
	*	@param		fileName - Name of the File to be saved
	*	@return		None
	*	@exceptions	CImageException
	*/
	virtual void Save(CString fileName) throw(CImageException) = 0;
	/** Save image with a specified CFile pointer. Overriding Function
	*	@param		pFile - CFile pointer
	*	@return		None
	*	@exceptions	CImageException
	*/
	virtual void Save(CFile* pFile) throw(CImageException) = 0;
	/** Draw image to Screen with coordinate and scale ratio. Overriding Function
	*	@param		pdc - Device Context
	*	@param		x - x coordinate of destination image
	*	@param		y - y coordinate of destination image
	*	@param		scale - ratio of dest/source rectangle
	*	@param		dwROPCode - ROP code
	*	@return		None
	*	@exceptions	CImageException
	*/
	virtual void Draw(CDC* pdc, int x=0, int y=0, double scale = 1.0, DWORD dwROPCode = SRCCOPY) const throw(CImageException) = 0;
	/** Draw image to Screen with coordinate and fixed width/height. Overriding Function
	*	@param		pdc - Device Context
	*	@param		x - x coordinate of destination image
	*	@param		y - y coordinate of destination image
	*	@param		width - fixed width of destination image
	*	@param		height - fixed height of destination image
	*	@param		dwROPCode - ROP code
	*	@return		None
	*	@exceptions	CImageException
	*/
	virtual void Draw(CDC* pdc, int x, int y, int width, int height, DWORD dwROPCode = SRCCOPY) const throw(CImageException) = 0;
	/** Create image from data bits. Overriding Function
	*	@param		width - width of original image
	*	@param		height - height of original Image
	*	@param		pData - data bits. Contains rgb data(Pallette mode not supported)
	*	@return		None
	*	@exceptions	CImageException
	*/
	virtual void Create(int width, int height, LPBYTE pData, int bitCount=24) throw(CImageException) = 0;
	/** Returns width of Image. Overriding Function
	*	@param		None
	*	@return		width of Image
	*	@exceptions	None
	*/
	virtual UINT GetWidth() const throw() = 0;
	/** Returns height of Image. Overriding Function
	*	@param		None
	*	@return		height of Image
	*	@exceptions	None
	*/
	virtual UINT GetHeight() const throw() = 0;
	/** Returns BitPerPixel value of current Image
	*	@param		None
	*	@return		BitPerPixel value
	*	@exceptions	None
	*/
	virtual UINT GetBPP() const throw() = 0;
	/** Get COLORREF value of given pixel
	*	@param		x - x coordinate
	*	@param		y - y coordinate
	*	@return		COLORREF value of given pixel
	*	@exceptions None
	*/
	virtual COLORREF GetPixel(int x, int y) const throw() = 0;
	/** Get DibBits directly
	*	@param		None
	*	@return		LPBYTE	BYTE pointer of given Dib
	*	@exceptions None
	*/
	virtual LPBYTE GetDibBits() const throw() = 0;
};

#endif // !defined(AFX_IMAGE_H__D3142778_9555_4128_887F_104A5F9478E1__INCLUDED_)
