OXYGENHUB
◆ main openmsx / src / console / OSDText.hh
2.0 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#ifndef OSDTEXT_HH
2
#define OSDTEXT_HH
3
4
#include "OSDImageBasedWidget.hh"
5
#include "TTFFont.hh"
6
7
#include "stl.hh"
8
9
#include <array>
10
#include <cstdint>
11
#include <memory>
12
13
namespace openmsx {
14
15
class OSDText final : public OSDImageBasedWidget
16
{
17
private:
18
	static constexpr auto textProperties = [] {
19
		using namespace std::literals;
20
		return concatArray(
21
			imageBasedProperties,
22
			std::array{
23
				"-text"sv, "-font"sv, "-fontfaceindex"sv, "-size"sv,
24
				"-wrap"sv, "-wrapw"sv, "-wraprelw"sv,
25
			});
26
	}();
27
28
public:
29
	OSDText(Display& display, const TclObject& name);
30
31
	[[nodiscard]] std::span<const std::string_view> getProperties() const override {
32
		return textProperties;
33
	}
34
	void setProperty(Interpreter& interp,
35
	                 std::string_view name, const TclObject& value) override;
36
	void getProperty(std::string_view name, TclObject& result) const override;
37
	[[nodiscard]] std::string_view getType() const override;
38
39
private:
40
	void invalidateLocal() override;
41
	[[nodiscard]] gl::vec2 getSize(const OutputSurface& output) const override;
42
	[[nodiscard]] uint8_t getFadedAlpha() const override;
43
	[[nodiscard]] std::unique_ptr<GLImage> create(OutputSurface& output) override;
44
45
	template<typename FindSplitPointFunc, typename CantSplitFunc>
46
	[[nodiscard]] size_t split(const std::string& line, unsigned maxWidth,
47
		FindSplitPointFunc findSplitPoint, CantSplitFunc cantSplit,
48
		bool removeTrailingSpaces) const;
49
	[[nodiscard]] size_t splitAtChar(const std::string& line, unsigned maxWidth) const;
50
	[[nodiscard]] size_t splitAtWord(const std::string& line, unsigned maxWidth) const;
51
	[[nodiscard]] std::string getCharWrappedText(const std::string& txt, unsigned maxWidth) const;
52
	[[nodiscard]] std::string getWordWrappedText(const std::string& txt, unsigned maxWidth) const;
53
54
private:
55
	enum WrapMode : uint8_t { NONE, WORD, CHAR };
56
57
	std::string text;
58
	std::string fontFile;
59
	TTFFont font;
60
	int size = 12;
61
	int fontFaceIndex = 0;
62
	WrapMode wrapMode = NONE;
63
	float wrapw = 0.0f, wraprelw = 1.0f;
64
65
	friend struct SplitAtChar;
66
};
67
68
} // namespace openmsx
69
70
#endif