OXYGENHUB
◆ main openmsx / src / console / OSDImageBasedWidget.hh
2.6 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#ifndef OSDIMAGEBASEDWIDGET_HH
2
#define OSDIMAGEBASEDWIDGET_HH
3
4
#include "OSDWidget.hh"
5
#include "stl.hh"
6
#include <array>
7
#include <cstdint>
8
#include <optional>
9
#include <span>
10
11
namespace openmsx {
12
13
class GLImage;
14
class Display;
15
16
class OSDImageBasedWidget : public OSDWidget
17
{
18
protected:
19
	static constexpr auto imageBasedProperties = [] {
20
		using namespace std::literals;
21
		return concatArray(
22
			widgetProperties,
23
			std::array{
24
				"-rgba"sv, "-rgb"sv, "-alpha"sv,
25
				"-fadePeriod"sv, "-fadeTarget"sv,
26
				"-fadeCurrent"sv,
27
				"-scrollSpeed"sv,
28
				"-scrollPauseLeft"sv,
29
				"-scrollPauseRight"sv,
30
				"-query-size"sv,
31
			});
32
	}();
33
34
public:
35
	[[nodiscard]] gl::vec2 getPos() const override;
36
	[[nodiscard]] uint32_t getRGBA(uint32_t corner) const { return rgba[corner]; }
37
	[[nodiscard]] std::span<const uint32_t, 4> getRGBA4() const { return rgba; }
38
39
	[[nodiscard]] virtual uint8_t getFadedAlpha() const = 0;
40
41
	[[nodiscard]] std::span<const std::string_view> getProperties() const override {
42
		return imageBasedProperties;
43
	}
44
	void setProperty(Interpreter& interp,
45
	                 std::string_view name, const TclObject& value) override;
46
	void getProperty(std::string_view name, TclObject& result) const override;
47
	[[nodiscard]] float getRecursiveFadeValue() const override;
48
	[[nodiscard]] bool isVisible() const override;
49
	[[nodiscard]] bool isRecursiveFading() const override;
50
51
protected:
52
	OSDImageBasedWidget(Display& display, const TclObject& name);
53
	~OSDImageBasedWidget() override;
54
	[[nodiscard]] bool hasConstantAlpha() const;
55
	void createImage(OutputSurface& output);
56
	void invalidateLocal() override;
57
	void paint(OutputSurface& output) override;
58
	[[nodiscard]] virtual std::unique_ptr<GLImage> create(OutputSurface& output) = 0;
59
	[[nodiscard]] gl::vec2 getRenderedSize() const;
60
61
	void setError(std::string message);
62
	[[nodiscard]] bool hasError() const { return error; }
63
64
	std::unique_ptr<GLImage> image;
65
66
private:
67
	void setRGBA(std::span<const uint32_t, 4> newRGBA);
68
	[[nodiscard]] bool isFading() const;
69
	[[nodiscard]] float getCurrentFadeValue() const;
70
	[[nodiscard]] float getCurrentFadeValue(uint64_t now) const;
71
	[[nodiscard]] bool isAnimating() const;
72
	[[nodiscard]] std::optional<float> getScrollWidth() const;
73
	void updateCurrentFadeValue();
74
75
	[[nodiscard]] gl::vec2 getTransformedPos(const OutputSurface& output) const;
76
77
private:
78
	uint64_t startFadeTime = 0;
79
	float fadePeriod = 0.0f;
80
	float fadeTarget = 1.0f;
81
	mutable float startFadeValue = 1.0f;
82
	float scrollSpeed = 0.0f; // 0 means disabled
83
	float scrollPauseLeft = 0.0f;
84
	float scrollPauseRight = 0.0f;
85
	uint64_t startScrollTime = 0;
86
	std::array<uint32_t, 4> rgba;
87
	bool error = false;
88
};
89
90
} // namespace openmsx
91
92
#endif