#pragma once

#include "Cスケジューラ.h"

namespace FDK
{
	#define PRESENTER_BUFFER_COUNT	1	// 今のところ1で固定。増やしても意味が無い作りになってるので。
	
	private class PresenterEngine : public STスケジューラコールバック
	{
	public:

		enum D3DDEVICE_STATE
		{
			D3DDEVICE_STATE_OK,
			D3DDEVICE_STATE_リセットされたか再生成された,
			D3DDEVICE_STATE_除去された
		};
		
		PresenterEngine( HRESULT& hr );
		virtual ~PresenterEngine();

		virtual HRESULT GetService( REFGUID guidService, REFIID riid, void** ppv );
		virtual HRESULT t指定されたフォーマットが利用可能か調べる( D3DFORMAT format );

		HRESULT SetVideoWindow( HWND hwnd );
		HWND    GetVideoWindow();
		void	SetVideoSize( LONG width, LONG height );
		SIZE	GetVideoSize();

		/// <summary>
		/// サンプルの作成とサンプルキューへの格納：<br>
		/// 指定されたメディアタイプ（pFormat）のビデオサンプル（IMFSample）を任意個作成し、それを videoSsampleQueue に格納して返す。
		/// </summary>
		HRESULT CreateVideoSamples( IMFMediaType *pMediaType, CVideoSampleList& videoSampleQueue );
	
		/// <summary>
		/// STスケジューラコールバック の実装<br>
		/// ここでは pTexture に表示対象のサンプルのテクスチャポインタをコピーするだけ。描画は行わない。
		/// <summary>
		HRESULT tサンプルを受け取る( IMFSample* pSample, LONGLONG llTarget );
		
		void t次のサンプルを要求する();

		/// <summary>
		/// 現在コピーしているテクスチャを描画する。デバイスはロック済みであること。<br>
		/// prcSrc を NULL にすると、テクスチャ全体を描画する。<br>
		/// prcDest を NULL にすると、左上隅から描画する。<br>
		/// </summary>
		void tサンプルを描画する( LPRECT prcSrc, LPRECT prcDest, UINT32 u透明度, UINT32 u加算合成 );

		UINT RefreshRate();
		void ReleaseResources();

	protected:

		// 派生クラスでオーバーライドすることができる。
		virtual void PaintFrameWithGDI();

	protected:
		HWND	m_hwnd;		// アプリケーションが提供する転送先ウィンドウ。
		SIZE	m_szVideo;
			
		CritSec	cs表示要求;
		bool	b表示要求;

		CritSec	csTexture;
		IDirect3DTexture9 *pTexture;
	};
}
