#ifndef COLOR_A04R04G04B04I_h
#define COLOR_A04R04G04B04I_h

/*!
 	@file
 	@brief	１ピクセルをあらわすクラス
\n			A04R04G04B04 intger フォーマット Ver.
 */

#include"../../Setup/CompileMode.h"
#include"../../Auxiliary/Macro.h"

#include"PixelConvertFunction.h"

namespace Maid
{
	/*!
	 *	\class	COLOR_A04R04G04B04I COLOR_A04R04G04B04I.h
	 *	\brief	アルファ付１６ビットピクセル
	 */
	class COLOR_A04R04G04B04I
	{
	public:
		COLOR_A04R04G04B04I(){}	//!<	コンストラクタ
		COLOR_A04R04G04B04I( unt08 a, unt08 r, unt08 g, unt08 b ){ SetARGB( a, r, g, b ); }	//!<	コンストラクタ
		template <class COLOR>
		COLOR_A04R04G04B04I( const COLOR& Col ){ SetARGB( Col.GetA(), Col.GetR(), Col.GetG(), Col.GetB() ); }	//!<	コンストラクタ

		unt08 GetA() const	{ return PIXELCONVERT04_08((m_ARGB&0xF000)>>12);	}	//!<	アルファ成分の取得
		unt08 GetR() const	{ return PIXELCONVERT04_08((m_ARGB&0x0F00)>> 8);	}	//!<	赤成分の取得
		unt08 GetG() const	{ return PIXELCONVERT04_08((m_ARGB&0x00F0)>> 4);	}	//!<	緑成分の取得
		unt08 GetB() const	{ return PIXELCONVERT04_08((m_ARGB&0x000F)>> 0);	}	//!<	青成分の取得

		operator unt16() const { return m_ARGB; }	//!<	一括変換

		void SetA( unt08 a )	{ m_ARGB = (m_ARGB&~0xF000)|(PIXELCONVERT08_04(a)<<12);	}	//!<	アルファ成分の設定
		void SetR( unt08 r )	{ m_ARGB = (m_ARGB&~0x0F00)|(PIXELCONVERT08_04(r)<< 8);	}	//!<	赤成分の設定
		void SetG( unt08 g )	{ m_ARGB = (m_ARGB&~0x00F0)|(PIXELCONVERT08_04(g)<< 4);	}	//!<	緑成分の設定
		void SetB( unt08 b )	{ m_ARGB = (m_ARGB&~0x000F)|(PIXELCONVERT08_04(b)<< 0);	}	//!<	青成分の設定

		void SetARGB( unt08 a, unt08 r, unt08 g, unt08 b )	//!<	いっきに設定
		{
			SetA( a );
			SetR( r );
			SetG( g );
			SetB( b );
		}

		//!	違うピクセルフォーマットとのコピー
		template <class PIXEL>
		COLOR_A04R04G04B04I& operator = (const PIXEL &src)
		{
			SetARGB(src.GetA(),src.GetR(),src.GetG(),src.GetB());
			return *this;
		}

		//!	同じピクセルフォーマットとのコピー
		COLOR_A04R04G04B04I& operator = (const COLOR_A04R04G04B04I& src)
		{
			m_ARGB = src.m_ARGB;
			return *this;
		}

	private:
		unt16 m_ARGB;
	};
}

#endif
