OXYGENHUB
◆ main openmsx / src / video / Layer.hh
2.5 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#ifndef LAYER_HH
2
#define LAYER_HH
3
4
#include <cstdint>
5
#include <utility>
6
7
namespace openmsx {
8
9
class Display;
10
class OutputSurface;
11
12
/** Interface for display layers.
13
  */
14
class Layer
15
{
16
public:
17
	/** Determines stacking order of layers:
18
	  * layers with higher Z-indices are closer to the viewer.
19
	  */
20
	enum class ZIndex : uint8_t {
21
		BACKGROUND,
22
		MSX_PASSIVE,
23
		MSX_ACTIVE,
24
		OSDGUI,
25
		IMGUI,
26
	};
27
	[[nodiscard]] friend auto operator<=>(ZIndex x, ZIndex y) { return std::to_underlying(x) <=> std::to_underlying(y); }
28
29
	/** Describes how much of the screen is currently covered by a particular
30
	  * layer.
31
	  */
32
	enum class Coverage : uint8_t {
33
		/** Layer fully covers the screen: any underlying layers are invisible.
34
		  */
35
		FULL,
36
		/** Layer partially covers the screen: it may cover only part of the
37
		  * screen area, or it may be (semi-)transparent in places.
38
		  */
39
		PARTIAL,
40
		/** Layer is not visible, that is completely transparent.
41
		  */
42
		NONE
43
	};
44
45
	virtual ~Layer() = default;
46
47
	/** Paint this layer.
48
	  */
49
	virtual void paint(OutputSurface& output) = 0;
50
51
	/** Query the Z-index of this layer.
52
	  */
53
	[[nodiscard]] ZIndex getZ() const { return z; }
54
	[[nodiscard]] bool isActive() const { return getZ() == ZIndex::MSX_ACTIVE; }
55
56
	/** Query the coverage of this layer.
57
	 */
58
	[[nodiscard]] Coverage getCoverage() const { return coverage; }
59
60
	/** Store pointer to Display.
61
	  * Will be called by Display::addLayer().
62
	  */
63
	void setDisplay(Display& display_) { display = &display_; }
64
65
protected:
66
	/** Construct a layer. */
67
	explicit Layer(Coverage coverage_, ZIndex z_)
68
		: coverage(coverage_), z(z_)
69
	{
70
	}
71
72
	/** Changes the current coverage of this layer.
73
	  */
74
	void setCoverage(Coverage coverage_) { coverage = coverage_; }
75
76
	/** Changes the current Z-index of this layer.
77
	  */
78
	void setZ(ZIndex z);
79
80
private:
81
	/** The display this layer is part of. */
82
	Display* display = nullptr;
83
84
	/** Inspected by Display to determine which layers to paint. */
85
	Coverage coverage;
86
87
	/** Inspected by Display to determine the order in which layers are
88
	  * painted.
89
	  */
90
	ZIndex z;
91
92
	friend class ScopedLayerHider; // for setCoverage()
93
};
94
95
96
class ScopedLayerHider
97
{
98
public:
99
	explicit ScopedLayerHider(Layer& layer);
100
	ScopedLayerHider(const ScopedLayerHider&) = delete;
101
	ScopedLayerHider(ScopedLayerHider&&) = delete;
102
	ScopedLayerHider& operator=(const ScopedLayerHider&) = delete;
103
	ScopedLayerHider& operator=(ScopedLayerHider&&) = delete;
104
	~ScopedLayerHider();
105
private:
106
	Layer& layer;
107
	Layer::Coverage originalCoverage;
108
};
109
110
} // namespace openmsx
111
112
#endif