1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/********************************************************************
*
*	Created:	3/3/2014   12:32
*
*	File:		fsIDisplay.h
*
*	Author:		Mick Waites
*	
*	Purpose:	Creation and control of the app window and full
*				screen display (where applicable) and transformation
*				of visual entities from canvas space to screen space.
*
*********************************************************************/

#ifndef fsIDisplayhdr
#define fsIDisplayhdr

#include <list>

#include <fsCore/src/fsCUniqueId.h>
#include "fsINode.h"

#include "src/fsCDisplayMode.h"

class fsCAppCoreMain;
class fsICursor;
class fsCScreenFade;


class fsIDisplay : protected fsINode
{
	friend class fsCAppCoreMain;
	friend class fsICursor;
	friend class fsCScreenFade;

public:

	static const fsCUniqueId mEventFullScreenToggleMsg;

    void defaultCameraFlagSet(fsU32 pFlag);
	fsBool wideScreenGet() const;

	fsBool windowModeAvailableGet() const;

	void fullScreenToggle();
	fsS32 designCanvasWidthGet() const;
	fsS32 designCanvasHeightGet() const;
	fsS32 visibleCanvasWidthGet() const;
	fsS32 visibleCanvasHeightGet() const;
	fsBool displayIsWideScreenGet() const;
	fsBool screenModeSet(fsBool pFullScreen);
	const fsVec2d& scaleGet() const;
	const fsAffineMtx2d& renderMatrixGet() const;

	static fsBool fixedAspectGet();

	static fsIDisplay* create();
	static fsIDisplay* instanceGet();
	virtual ~fsIDisplay();<--- Destructor in derived class

protected:

	fsS32 retinaScaleFactorGet() const;
	void clipWindowSet(const fsCDisplayMode* const pDisplayMode);

	virtual fsBool windowModeAvailableGetDo(const fsCDisplayMode* const pBestMode) const { return false; }

	virtual fsBool displayTypeIsDesktopGet() const = 0;
	virtual fsPoint fixedDisplaySizeGet() const = 0;
	virtual void desktopScreenModesEnumerateDo() = 0;
	virtual fsBool desktopScreenModeSetDo(const fsCDisplayMode* pDisplayMode, fsBool pFullScreen) = 0;

	const fsPoint& startupDimensionsGet() const { return mStartupDimensions; }
	void screenModeAdd(fsS32 pW, fsS32 pH, fsS32 pBitDepth);

	fsIDisplay();
	fsCDisplayMode mDesignedDisplayMode;

private:

    virtual void defaultCameraFlagSetDo(fsU32 pFlag) {}
    
	virtual fsS32 retinaScaleFactorGetDo() const { return 1; }
	virtual void clipWindowSetDo(const fsCDisplayMode* const pDisplayMode) {}
	
	void windowModeLocate();

	typedef fsBool (fsIDisplay::*fsTDistlayMemCriteriaFnc)(fsCDisplayMode* pScreenMode) const;
	fsBool failSafeResolutionCriteria(fsCDisplayMode* pScreenMode) const;
	fsBool desktopResolutionCriteria(fsCDisplayMode* pScreenMode) const;
	void displayModeLocate(fsCDisplayMode*& pMode, fsTDistlayMemCriteriaFnc pCriteria, fsBool pFirstMatch);

	void desktopScreenModesEnumerate();

	void initialise();
	void designedScreenModeDetermine(const fsCDisplayMode* pMode = nullptr);
	void matrixSetForDisplaySize(const fsCDisplayMode* pDisplayMode);
	void bestWindowedScreenModeDetermine();

	void fixedAspectCalculate(fsF32& scaleX, fsF32& scaleY, const fsCDisplayMode* const pDisplayMode);

	fsBool simulatedFixedDisplayConfigure();
	fsBool mSimulatingFixedDisplay;

	static const fsStr mAppCanvasWKey;
	static const fsStr mAppCanvasHKey;

	fsPoint mStartupDimensions;
	fsCDisplayMode mDeviceOriginalDisplayMode;
	fsCDisplayMode mDesktopWindowDisplayMode;

	fsBool mFullScreen;

	fsCDisplayMode* mBestDeviceDisplayMode;
	std::list<fsCDisplayMode*> mScreenModes;
};

#endif