File: MouseCursor.h

package info (click to toggle)
spring 104.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 47,512 kB
  • sloc: cpp: 391,093; ansic: 79,943; python: 12,356; java: 12,201; awk: 5,889; sh: 1,826; xml: 655; makefile: 486; perl: 405; php: 211; objc: 194; sed: 2
file content (109 lines) | stat: -rw-r--r-- 2,635 bytes parent folder | download
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
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef MOUSECURSOR_H
#define MOUSECURSOR_H

#include <string>
#include <vector>

class CBitmap;
class IHwCursor;

class CMouseCursor {
public:
	enum HotSpot {TopLeft, Center};

public:
	static CMouseCursor New(const std::string& name, HotSpot hs) { return (CMouseCursor(name, hs)); }

	CMouseCursor(); // null-cursor
	CMouseCursor(const CMouseCursor& mc) = delete;
	CMouseCursor(CMouseCursor&& mc) { *this = std::move(mc); }
	~CMouseCursor();

	CMouseCursor& operator = (const CMouseCursor& mc) = delete;
	CMouseCursor& operator = (CMouseCursor&& mc) {
		images = std::move(mc.images);
		frames = std::move(mc.frames);

		hwCursor = mc.hwCursor;
		mc.hwCursor = nullptr;

		hotSpot = mc.hotSpot;

		animTime = mc.animTime;
		animPeriod = mc.animPeriod;
		currentFrame = mc.currentFrame;

		xmaxsize = mc.xmaxsize;
		ymaxsize = mc.ymaxsize;

		xofs = mc.xofs;
		yofs = mc.yofs;

		hwValid = mc.hwValid;
		return *this;
	}

	void Update();
	void Draw(int x, int y, float scale) const;   // software cursor draw
	void DrawQuad(int x, int y) const;            // draw command queue icon
	void BindTexture() const;                     // software mouse cursor
	void BindHwCursor() const;                    // hardware mouse cursor

	int GetMaxSizeX() const { return xmaxsize; }
	int GetMaxSizeY() const { return ymaxsize; }

	bool IsHWValid() const { return hwValid; }
	bool IsValid() const { return (!frames.empty()); }

protected:
	struct ImageData {
		unsigned int texture;
		int xOrigSize;
		int yOrigSize;
		int xAlignedSize;
		int yAlignedSize;
	};
	struct FrameData {
		FrameData(const ImageData& _image, float time)
			: image(_image), length(time), startTime(0.0f), endTime(0.0f) {}
		ImageData image;
		float length;
		float startTime;
		float endTime;
	};

protected:
	CMouseCursor(const std::string& name, HotSpot hs);
	bool LoadCursorImage(const std::string& name, struct ImageData& image);
	bool BuildFromSpecFile(const std::string& name);
	bool BuildFromFileNames(const std::string& name, int lastFrame);

protected:
	std::vector<ImageData> images;
	std::vector<FrameData> frames;

	IHwCursor* hwCursor; // hardware cursor

	HotSpot hotSpot;

	float animTime;
	float animPeriod;
	int currentFrame;

	int xmaxsize;
	int ymaxsize;

	int xofs; // describes where the center of the cursor is,
	int yofs; // based on xmaxsize, ymaxsize, and the hotspot

	bool hwValid; // if hardware cursor is valid
};


static const float minFrameLength = 0.010f;  // seconds
static const float defFrameLength = 0.100f;  // seconds


#endif /* MOUSECURSOR_H */