blob: b6f9f13b99ec55a58ff19022fb1b70ff6ca6e1f5 (
plain)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
#pragma once
#include "pre.hpp"
#include "system_headers.hpp"
#include <functional>
#include <cassert>
#include "base.hpp"
#include "ui/ui_base.hpp"
#include "ui/d2d_util.hpp"
namespace cru::ui::render
{
/* About Render Object
*
* Render object is a concrete subclass of RenderObject class.
* It represents a painting action on a d2d render target. By
* overriding "Draw" virtual method, it can customize its painting
* action.
*/
struct IRenderHost : Interface
{
virtual void InvalidateRender() = 0;
};
class RenderObject : public Object
{
protected:
RenderObject() = default;
public:
RenderObject(const RenderObject& other) = delete;
RenderObject(RenderObject&& other) = delete;
RenderObject& operator=(const RenderObject& other) = delete;
RenderObject& operator=(RenderObject&& other) = delete;
~RenderObject() override = default;
virtual void Draw(ID2D1RenderTarget* render_target) = 0;
IRenderHost* GetRenderHost() const
{
return render_host_;
}
void SetRenderHost(IRenderHost* new_render_host);
protected:
virtual void OnRenderHostChanged(IRenderHost* old_render_host, IRenderHost* new_render_host);
void InvalidateRenderHost();
private:
IRenderHost* render_host_ = nullptr;
};
class StrokeRenderObject : public virtual RenderObject
{
protected:
StrokeRenderObject() = default;
public:
StrokeRenderObject(const StrokeRenderObject& other) = delete;
StrokeRenderObject(StrokeRenderObject&& other) = delete;
StrokeRenderObject& operator=(const StrokeRenderObject& other) = delete;
StrokeRenderObject& operator=(StrokeRenderObject&& other) = delete;
~StrokeRenderObject() override = default;
float GetStrokeWidth() const
{
return stroke_width_;
}
void SetStrokeWidth(float new_stroke_width);
Microsoft::WRL::ComPtr<ID2D1Brush> GetBrush() const
{
return brush_;
}
void SetBrush(Microsoft::WRL::ComPtr<ID2D1Brush> new_brush);
Microsoft::WRL::ComPtr<ID2D1StrokeStyle> GetStrokeStyle() const
{
return stroke_style_;
}
void SetStrokeStyle(Microsoft::WRL::ComPtr<ID2D1StrokeStyle> new_stroke_style);
private:
float stroke_width_ = 1.0f;
Microsoft::WRL::ComPtr<ID2D1Brush> brush_ = nullptr;
Microsoft::WRL::ComPtr<ID2D1StrokeStyle> stroke_style_ = nullptr;
};
class FillRenderObject : public virtual RenderObject
{
protected:
FillRenderObject() = default;
public:
FillRenderObject(const FillRenderObject& other) = delete;
FillRenderObject(FillRenderObject&& other) = delete;
FillRenderObject& operator=(const FillRenderObject& other) = delete;
FillRenderObject& operator=(FillRenderObject&& other) = delete;
~FillRenderObject() override = default;
Microsoft::WRL::ComPtr<ID2D1Brush> GetBrush() const
{
return brush_;
}
void SetBrush(Microsoft::WRL::ComPtr<ID2D1Brush> new_brush);
private:
Microsoft::WRL::ComPtr<ID2D1Brush> brush_ = nullptr;
};
class RoundedRectangleRenderObject : public virtual RenderObject
{
protected:
RoundedRectangleRenderObject() = default;
public:
RoundedRectangleRenderObject(const RoundedRectangleRenderObject& other) = delete;
RoundedRectangleRenderObject(RoundedRectangleRenderObject&& other) = delete;
RoundedRectangleRenderObject& operator=(const RoundedRectangleRenderObject& other) = delete;
RoundedRectangleRenderObject& operator=(RoundedRectangleRenderObject&& other) = delete;
~RoundedRectangleRenderObject() override = default;
Rect GetRect() const
{
return Convert(rounded_rect_.rect);
}
void SetRect(const Rect& rect);
float GetRadiusX() const
{
return rounded_rect_.radiusX;
}
void SetRadiusX(float new_radius_x);
float GetRadiusY() const
{
return rounded_rect_.radiusY;
}
void SetRadiusY(float new_radius_y);
D2D1_ROUNDED_RECT GetRoundedRect() const
{
return rounded_rect_;
}
void SetRoundedRect(const D2D1_ROUNDED_RECT& new_rounded_rect);
private:
D2D1_ROUNDED_RECT rounded_rect_ = D2D1::RoundedRect(D2D1::RectF(), 0.0f, 0.0f);
};
class RoundedRectangleStrokeRenderObject final : public StrokeRenderObject, public RoundedRectangleRenderObject
{
public:
RoundedRectangleStrokeRenderObject() = default;
RoundedRectangleStrokeRenderObject(const RoundedRectangleStrokeRenderObject& other) = delete;
RoundedRectangleStrokeRenderObject(RoundedRectangleStrokeRenderObject&& other) = delete;
RoundedRectangleStrokeRenderObject& operator=(const RoundedRectangleStrokeRenderObject& other) = delete;
RoundedRectangleStrokeRenderObject& operator=(RoundedRectangleStrokeRenderObject&& other) = delete;
~RoundedRectangleStrokeRenderObject() override = default;
protected:
void Draw(ID2D1RenderTarget* render_target) override;
};
class CustomDrawHandlerRenderObject : public RenderObject
{
public:
using DrawHandler = std::function<void(ID2D1RenderTarget*)>;
CustomDrawHandlerRenderObject() = default;
CustomDrawHandlerRenderObject(const CustomDrawHandlerRenderObject& other) = delete;
CustomDrawHandlerRenderObject& operator=(const CustomDrawHandlerRenderObject& other) = delete;
CustomDrawHandlerRenderObject(CustomDrawHandlerRenderObject&& other) = delete;
CustomDrawHandlerRenderObject& operator=(CustomDrawHandlerRenderObject&& other) = delete;
~CustomDrawHandlerRenderObject() override = default;
DrawHandler GetDrawHandler() const
{
return draw_handler_;
}
void SetDrawHandler(DrawHandler new_draw_handler);
protected:
void Draw(ID2D1RenderTarget* render_target) override;
private:
DrawHandler draw_handler_{};
};
}
|