-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathspiro_wrapper.cc
More file actions
112 lines (90 loc) · 2.76 KB
/
Copy pathspiro_wrapper.cc
File metadata and controls
112 lines (90 loc) · 2.76 KB
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
extern "C" {
#include "libspiro/bezctx.h" /* bezctx structure */
#include "libspiro/spiro-config.h"
#include "libspiro/spiroentrypoints.h" /* call spiro through here */
}
#include "spiro_wrapper.h"
namespace spiro {
struct BezctxCrazy { // Don't try to inherit it
bezctx base; // This must be the first element of the custom class
double lastX, lastY;
std::vector<KnotResult> *results;
};
static void CrazyMoveto(bezctx *bc, double x, double y, int is_open) {
BezctxCrazy *g = reinterpret_cast<BezctxCrazy *>(bc);
KnotResult result;
result.type = KnotResult::Type::MOVE;
result.points.emplace_back(x, y);
result.fromX = g->lastX;
result.fromY = g->lastY;
g->results->push_back(result);
g->lastX = x;
g->lastY = y;
}
static void CrazyLineto(bezctx *bc, double x, double y) {
BezctxCrazy *g = reinterpret_cast<BezctxCrazy *>(bc);
KnotResult result;
result.type = KnotResult::Type::LINE;
result.points.emplace_back(x, y);
result.fromX = g->lastX;
result.fromY = g->lastY;
g->results->push_back(result);
g->lastX = x;
g->lastY = y;
}
static void CrazyCurveto(bezctx *bc, double x1, double y1, double x2, double y2,
double x3, double y3) {
BezctxCrazy *g = reinterpret_cast<BezctxCrazy *>(bc);
KnotResult result;
result.type = KnotResult::Type::CURVE;
result.points.emplace_back(x1, y1);
result.points.emplace_back(x2, y2);
result.points.emplace_back(x3, y3);
result.fromX = g->lastX;
result.fromY = g->lastY;
g->results->push_back(result);
g->lastX = x3;
g->lastY = y3;
}
static void CrazyMarkKnot(bezctx *bc, int knot_idx) {}
std::shared_ptr<BezctxCrazy> NewBezctxCrazy() {
auto result = std::shared_ptr<BezctxCrazy>(new BezctxCrazy());
result->base.moveto = CrazyMoveto;
result->base.lineto = CrazyLineto;
result->base.curveto = CrazyCurveto;
result->base.mark_knot = CrazyMarkKnot;
return result;
}
SpiroWrapper::SpiroWrapper(const std::vector<SpiroCP> &src, bool is_closed) {
n_ = static_cast<int>(src.size());
src_.reserve(n_);
for (const auto &s : src) {
src_.emplace_back(s);
}
is_closed_ = is_closed;
valid_ = false;
computed_ = false;
}
SpiroWrapper::~SpiroWrapper() {}
bool SpiroWrapper::Compute() {
if (computed_) {
return valid_;
}
std::unique_ptr<spiro_cp[]> src(new spiro_cp[n_]);
for (int i = 0; i < n_; ++i) {
auto &s = (src.get())[i];
s.x = src_[i].x;
s.y = src_[i].y;
s.ty = static_cast<char>(src_[i].ty);
}
auto bc = NewBezctxCrazy();
bc->results = &results_;
valid_ =
SpiroCPsToBezier0(src.get(), n_, (is_closed_ ? 1 : 0), &(bc->base)) == 1;
return valid_;
}
bool SpiroWrapper::Valid() const { return valid_; }
const std::vector<KnotResult> &SpiroWrapper::Results() const {
return results_;
}
} // namespace spiro