18 enum class Type { Anchor, QuadraticControl, CubicControl1, CubicControl2 };
42 std::vector<BezierPoint>::const_iterator
const begin,
43 std::vector<BezierPoint>::const_iterator
const end
47 tt_assert((end - begin) >= 2);
49 auto previousPoint = *(end - 1);
50 auto previousPreviousPoint = *(end - 2);
51 for (
auto i = begin; i != end; i++) {
55 case BezierPoint::Type::Anchor:
56 tt_assert(previousPoint.type != BezierPoint::Type::CubicControl1);
60 case BezierPoint::Type::QuadraticControl:
61 if (previousPoint.type == BezierPoint::Type::QuadraticControl) {
62 r.
emplace_back(midpoint(previousPoint.p, point.p), BezierPoint::Type::Anchor);
65 tt_assert(previousPoint.type == BezierPoint::Type::Anchor);
70 case BezierPoint::Type::CubicControl1:
74 case BezierPoint::Type::CubicControl2:
75 if (previousPoint.type == BezierPoint::Type::Anchor) {
76 tt_assert(previousPreviousPoint.type == BezierPoint::Type::CubicControl2);
78 r.
emplace_back(reflect_point(previousPreviousPoint.p, previousPoint.p), BezierPoint::Type::CubicControl1);
80 tt_assert(previousPoint.type == BezierPoint::Type::CubicControl1);
89 previousPreviousPoint = previousPoint;
90 previousPoint = point;
93 for (
ssize_t i = 0; i < ssize(r); i++) {
94 if (r[i].type == BezierPoint::Type::Anchor) {