#pragma once

#include <d2d1.h>
#include <d2d1helper.h>
#include "DDrawWindow.h"
#include "LockVarType.h"

#pragma comment (lib, "d2d1.lib")

// CScreen
#define SCREEN_WIDTH 512
#define SCREEN_HEIGHT 256

#define TEXTURE_MULTIPLER_X 2
#define TEXTURE_MULTIPLER_Y 2

class CMotherBoard;

class CScreen : public CWnd
{
		DECLARE_DYNAMIC(CScreen)

		static const DWORD  ScreenView_ColorPalettes[16][4];
		static const DWORD  MonochromePalette[2][4];
		static const DWORD  AdaptMonochromePalette[2][4];
		static const int    TEXTURE_WIDTH, TEXTURE_HEIGHT;
		static const double BK_ASPECT_RATIO;
		static const int    BK_SCREEN_WIDTH, BK_SCREEN_HEIGHT;

	protected:
		CMotherBoard       *m_pParent;
		CWnd               *m_cwndParent; //указатель на родительское окно
		int                 m_nFrame; //счётчик фреймов
		int                 m_curFPS; //текущее значение  FPS
		ULONGLONG           m_msec, m_mtmpsec; //счётчики миллисекунд, прошедшие с момента старта системы
		int                 m_cx, m_cy;
		BYTE                m_nOfs;
		int                 m_nPaletteNum;
		BOOL                m_bFullScreen;
		BOOL                m_bColorMode;
		BOOL                m_bAdapt;
		BOOL                m_bExtended;
		BOOL                m_bMWHdn;

		LockVarType         m_lockChangeMode; //флаг, пока переключаются режимы экрана,чтобы в это время не рисовался экран
		LockVarType         m_lockPrepare;
		LockVarType         m_lockBusy;

		CDDrawWindow        m_DDWnd; //окно для полноэкранного режима
		HWND                m_hwndScreen;  // Screen View window handle
		HWND                m_hwndFullScreen;

		DWORD              *m_colTable32;
		DWORD              *m_monTable32;
		DWORD              *m_bits;

		ID2D1Factory       *m_pDirect2dFactory;
		ID2D1HwndRenderTarget *m_pRenderTarget, *m_pRenderTargetFS, *m_pCurrentRenderTarget;
		ID2D1Bitmap        *m_pBitmap;

		UINT32              m_nPitch;

		RECT                m_rectFullScreen; //размеры полноэкранного окна
		D2D1_RECT_F         m_rectFSWnd; //размеры viewportа в полноэкранном режиме
		D2D1_RECT_F         m_rectWnd; //размеры viewportа в оконном режиме
		D2D1_RECT_F         m_rectCurrentViewport;

	public:
		CScreen(void);
		virtual ~CScreen(void);
		virtual void        DrawScreen(BOOL bCheckFPS = FALSE);
		virtual void        PrepareScreenLineByteRGB32(int nLineNum, int nByteNum, BYTE b);
		virtual void        PrepareScreenRGB32(BYTE *ScreenBuffer);
		virtual void        AttachParent(CMotherBoard *pParent)
		{
			m_pParent = pParent;
		}
		virtual void        AdjustLayout();
		// Screen own methods
		inline virtual void SetOffset(BYTE nOfs)
		{
			m_nOfs = nOfs;
		}
		inline virtual BYTE GetOffset()
		{
			return m_nOfs;
		}
		inline virtual void SetExtendedMode(BOOL bFlag)
		{
			m_bExtended = bFlag;
		}
		inline virtual BOOL GetExtendedMode()
		{
			return m_bExtended;
		}
		inline virtual int  GetFPS()
		{
			return m_curFPS;
		}
		inline virtual int  GetPalette()
		{
			return m_nPaletteNum;
		}
		virtual void        SetPalette(int palette)
		{
			m_nPaletteNum = palette & 0xf;
		}

		virtual void        SetAdaptMode(BOOL bFlag)
		{
			m_bAdapt = bFlag;
			InitColorTables();
		}
		inline virtual BOOL IsAdaptMode()
		{
			return m_bAdapt;
		}

		inline virtual void SetColorMode(BOOL bColorMode = TRUE)
		{
			m_bColorMode = bColorMode;
		}
		inline virtual BOOL IsColorMode()
		{
			return m_bColorMode;
		}

		BOOL                SetFullScreenMode();
		BOOL                SetWindowMode();
		inline BOOL         IsFullScreenMode()
		{
			return m_bFullScreen;
		}

		inline CWnd        *GetBackgroundWindow()
		{
			return this; //&m_DDWnd;
		}
		HBITMAP             GetScreenshot();

	protected:
		HRESULT ScreenView_Init();
		void ScreenView_Done();
		void InitColorTables();

		virtual BOOL PreCreateWindow(CREATESTRUCT &cs);
		afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
		afx_msg void OnSetFocus(CWnd *pOldWnd);
		afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
		DECLARE_MESSAGE_MAP()
};


