#pragma once
#include"DxLib.h"
#include"Image.h"

namespace DXFW
{
/// <summary>補完の方法</summary>
enum class DrawMode
{
	Nearest = DX_DRAWMODE_NEAREST,
	Bilinear = DX_DRAWMODE_BILINEAR
};
	
/// <summary>ブレンドモード</summary>
enum class BlendMode
{
	NoBlend = DX_BLENDMODE_NOBLEND,
	Alpha = DX_BLENDMODE_ALPHA,
	Add = DX_BLENDMODE_ADD,
	Sub = DX_BLENDMODE_SUB,
	Mula = DX_BLENDMODE_MULA,
	Invsrc = DX_BLENDMODE_INVSRC
};

/// <summary>説明</summary>
///	<example>
///	[サンプルコード:未完成]<BR>
/// サンプル説明<BR>
///	<code>
///	int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )<BR>
///	{<BR>
///		if( !Dx::Initialise() ) return -1;<BR>
///		Dx::End();<BR>
///		return 0;<BR>
/// }<BR>
/// </code>	
/// </example>
class Screen
{
private:
	Screen();
	~Screen();
	static int& Handle()
	{
		static int handle = -1;
		return handle;
	}
public:
	///<summary>描画範囲を指定</summary>
	///指定した範囲外には描画されない
	static bool SetArea(int x1,int y1,int x2,int y2)
	{
		return !DxLib::SetDrawArea( x1 , y1 , x2 , y2 );
	}
	

	///<summary>非実装</summary>
	///static bool SetValidMultiSample( int samples, int quality )
	///{
	///	return !DxLib::SetDrawValidMultiSample( samples , quality );
	///}
	
	///<summary>非実装</summary>
	///static bool SetValidFloatTypeGraphCreateFlag(bool isFloat)
	///{
	///	return! DxLib::SetDrawValidFloatTypeGraphCreateFlag( isFloat );
	///}
	
	///<summary>作成する画像のビット深度を設定</summary>
	///画像を読み込む時のビット深度を下げると、画質が下がる代わりに
	///使用するメモリが減少します
	///この関数は、Image::Load等で画像を読み込む前に呼ぶ必要がある
	static bool SetCreateGraphColorBitDepth(int bitDepth)
	{
		return !DxLib::SetCreateGraphColorBitDepth( bitDepth );
	}
	
	///<summary>スクリーン用Imageのチャンネル数を設定</summary>
	///チャンネル数は1,2,4のいずれかを指定
	///スクリーン用Imageが指定したチャンネル数で作成されるようになる
	///Image::Make関数を呼ぶ前に、この関数を呼ぶ必要がある
	static bool SetCreateValidGraphChannelNum(int channelNum)
	{
		return !DxLib::SetCreateDrawValidGraphChannelNum( channelNum );
	}
	
	///<summary>描画先の設定</summary>
	///Image::Draw等の描画先を裏画面にする。
	///SetImageを使用してから戻す時に使う
	static bool SetBack()
	{
		return !DxLib::SetDrawScreen( DX_SCREEN_BACK  );
	}
	
	///<summary>描画先イメージを設定</summary>
	///スクリーン用にMakeしたImageを描画先に設定する。
	///描画内容はScreen::Flipで反映。
	static bool SetImage(Image &img)
	{
		if( img.GetIsScreen() )
		{
			Handle() = img.GetHandle();
			return !DxLib::SetDrawScreen( img.GetHandle()  );
		}else{
			return false;
		}
	}
	
	///<summary>Screen::Clear後の色を設定</summary>
	static bool SetBackColor(int r,int g,int b)
	{
		return !DxLib::SetBackgroundColor( r , g , b );
	}
	
	///<summary>描画内容を反映</summary>
	///
	static bool Flip()
	{
		return !DxLib::ScreenFlip();
	}
	
	///<summary>裏画面の内容を、表画面にコピー</summary>
	static bool Copy()
	{
		return !DxLib::ScreenCopy();
	}
	
	///<summary>画面を消去する</summary>
	///消去後の色はSetBackColorで設定する
	static bool Clear()
	{
		return !DxLib::ClearDrawScreen();
	}
	
	///<summary>拡大描画の補完方法を設定</summary>
	static bool SetMode(DrawMode mode)
	{
		return !DxLib::SetDrawMode( (int)mode );
	}
	
	///<summary>ブレンド描画のモードを設定</summary>
	static bool SetBlendMode(BlendMode blendMode,int pal)
	{
		return !DxLib::SetDrawBlendMode( (int)blendMode , pal );
	}
	
	/// <summary>描画対象になっている画面をBMP形式で保存</summary>
	static bool SaveBmp(int x1, int y1 , int x2 , int y2 , const char *ファイル名 )
	{
		return !DxLib::SaveDrawScreen( x1 ,  y1 , x2 , y2 , ファイル名 );
	}

	///<summary>描画輝度を設定</summary>
	static bool SetBright( int r , int g , int b )
	{
		return !DxLib::SetDrawBright( r , g , b );
	}

	///<summary>透過色を設定</summary>
	static bool SetTransColor( int r , int g , int b )
	{
		return !DxLib::SetTransColor( r , g , b );
	}
	
	///<summary>Zバッファ使用フラグを設定</summary>
	static void SetZUse(bool 使用フラグ )
	{
		DxLib::SetUseZBufferFlag( 使用フラグ );
	}
		
	///<summary>Zバッファ描画フラグを設定</summary>
	static void SetZWrite(bool 使用フラグ )
	{
		DxLib::SetWriteZBufferFlag( 使用フラグ );
	}

	///<summary>Z描画深度を設定</summary>
	///Z深度は0.0〜1.0
	static void SetZDepth(double Z深度)
	{
		DxLib::SetDrawZ( (float)Z深度 );
	}
};
}