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
|
#pragma once
#include "Resource.h"
namespace cru::platform::graphics {
struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource {
virtual bool FillContains(const Point& point) = 0;
virtual Rect GetBounds() = 0;
virtual std::unique_ptr<IGeometry> Transform(const Matrix& matrix) = 0;
virtual std::unique_ptr<IGeometry> CreateStrokeGeometry(float width) = 0;
};
struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource {
virtual Point GetCurrentPosition() = 0;
virtual void MoveTo(const Point& point) = 0;
void RelativeMoveTo(const Point& offset) {
MoveTo(GetCurrentPosition() + offset);
}
virtual void LineTo(const Point& point) = 0;
void LineTo(float x, float y) { LineTo(Point(x, y)); }
void RelativeLineTo(const Point& offset) {
LineTo(GetCurrentPosition() + offset);
}
void RelativeLineTo(float x, float y) { RelativeLineTo(Point(x, y)); }
virtual void CubicBezierTo(const Point& start_control_point,
const Point& end_control_point,
const Point& end_point) = 0;
void RelativeCubicBezierTo(const Point& start_control_offset,
const Point& end_control_offset,
const Point& end_offset) {
auto current_position = GetCurrentPosition();
CubicBezierTo(current_position + start_control_offset,
current_position + end_control_offset,
current_position + end_offset);
}
virtual void QuadraticBezierTo(const Point& control_point,
const Point& end_point) = 0;
void RelativeQuadraticBezierTo(const Point& control_offset,
const Point& end_offset) {
auto current_position = GetCurrentPosition();
QuadraticBezierTo(current_position + control_offset,
current_position + end_offset);
}
virtual void ArcTo(const Point& radius, float angle, bool is_large_arc,
bool is_clockwise, const Point& end_point);
void RelativeArcTo(const Point& radius, float angle, bool is_large_arc,
bool is_clockwise, const Point& end_offset) {
ArcTo(radius, angle, is_large_arc, is_clockwise,
GetCurrentPosition() + end_offset);
}
virtual void CloseFigure(bool close) = 0;
virtual std::unique_ptr<IGeometry> Build() = 0;
void ParseAndApplySvgPathData(StringView path_d);
};
} // namespace cru::platform::graphics
|