//Screen.h: Файл заголовка
//

#pragma once
#include "Defines.h"
#include "DDrawWindow.h"
#include "LockVarType.h"
#include "Screen_Shared.h"

// CScreen
#define SCREEN_WIDTH 512
#define SCREEN_HEIGHT 256

#define TEXTURE_MULTIPLER_X 2
#define TEXTURE_MULTIPLER_Y 2


class CScreen : public CWnd
{
		DECLARE_DYNAMIC(CScreen)

		CBKScreen_Shared *m_pscrSharedFunc;
		HMODULE m_hModule;
		typedef BKSCREENHANDLE(WINAPI *GETBKSCR)();


		static const int    TEXTURE_WIDTH, TEXTURE_HEIGHT;
		static const double BK_ASPECT_RATIO;
		static const int    BK_SCREEN_WIDTH, BK_SCREEN_HEIGHT;
		//16kPage
		BYTE               *m_pBuffer;
		size_t              m_nBufSize;

		BOOL                m_bReverseScreen; //флаг перевёрнутого экрана.
		/* DrawDIB в отличие всех остальных рисует вверх ногами.
		или наоборот, все остальные в отличие от DrawDIB рисуют вверх ногами. Поэтому для определения
		направления введён этот флаг. */

	protected:
		CWnd               *m_pwndParent; //указатель на родительское окно (View)
		int                 m_nFrame; //счётчик фреймов
		int                 m_nCurFPS; //текущее значение  FPS
		ULONGLONG           m_msec, m_mtmpsec; //счётчики миллисекунд, прошедшие с момента старта системы
		BYTE                m_nOfs;
		int                 m_nPaletteNum;
		BOOL                m_bColorMode; //флаг работы в цветном режиме
		BOOL                m_bAdapt; //флаг работы в ч/б адаптивном режиме
		BOOL                m_bExtended; //флаг расширенного экрана

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

		CDDrawWindow        m_DDWnd; //окно для полноэкранного режима

		DWORD              *m_pColTable32;
		DWORD              *m_pMonoTable32;
		DWORD              *m_pTexBits; //указатель на выделенную память текстуры. здесь с ним ничего делать не нужно.

	public:
		CScreen(int nRenderType);
		CScreen(int nRenderType, BYTE *buffer, size_t size); //16kpage
		virtual ~CScreen(void);
		void InitVars(int nRenderType);
		void ClearObjects();
		virtual void ReDrawScreen() //16kpage
		{
			PrepareScreenRGB32(m_pBuffer);
			DrawScreen();
		};
		virtual void        DrawScreen(BOOL bCheckFPS = FALSE);
		virtual void        PrepareScreenLineByteRGB32(int nLineNum, int nByteNum, BYTE b);
		virtual void        PrepareScreenRGB32(BYTE *ScreenBuffer);
		virtual void        AdjustLayout();
		// Screen own methods
		virtual void        SetRegister(WORD w)
		{
			SetOffset(LOBYTE(w));
			SetExtendedMode(!(w & 01000));
		}
		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_nCurFPS;
		}
		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;
		}

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

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

	protected:
		virtual BOOL        InitColorTables();

		virtual BOOL PreCreateWindow(CREATESTRUCT &cs);
		afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
		afx_msg void OnSize(UINT nType, int cx, int cy);
		afx_msg void OnSetFocus(CWnd *pOldWnd);
		afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
		afx_msg BOOL OnEraseBkgnd(CDC *pDC);
		afx_msg void OnDestroy();
		afx_msg void OnPaint();
		DECLARE_MESSAGE_MAP()
};


