19 enum class Type { Anchor, QuadraticControl, CubicControl1, CubicControl2 };
43 std::vector<bezier_point>::const_iterator
const begin,
44 std::vector<bezier_point>::const_iterator
const end)
noexcept
48 tt_assert((end - begin) >= 2);
50 auto previousPoint = *(end - 1);
51 auto previousPreviousPoint = *(end - 2);
52 for (
auto i = begin; i != end; i++) {
56 case bezier_point::Type::Anchor:
57 tt_assert(previousPoint.type != bezier_point::Type::CubicControl1);
61 case bezier_point::Type::QuadraticControl:
62 if (previousPoint.type == bezier_point::Type::QuadraticControl) {
63 r.
emplace_back(midpoint(previousPoint.p, point.p), bezier_point::Type::Anchor);
66 tt_assert(previousPoint.type == bezier_point::Type::Anchor);
71 case bezier_point::Type::CubicControl1: r.
push_back(point);
break;
73 case bezier_point::Type::CubicControl2:
74 if (previousPoint.type == bezier_point::Type::Anchor) {
75 tt_assert(previousPreviousPoint.type == bezier_point::Type::CubicControl2);
77 r.
emplace_back(reflect(previousPreviousPoint.p, previousPoint.p), bezier_point::Type::CubicControl1);
79 tt_assert(previousPoint.type == bezier_point::Type::CubicControl1);
84 default: tt_no_default();
87 previousPreviousPoint = previousPoint;
88 previousPoint = point;
91 for (
ssize_t i = 0; i < std::ssize(r); i++) {
92 if (r[i].type == bezier_point::Type::Anchor) {