// Copyright 2020 Google LLC
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "tools/fiddle/examples.h"
REG_FIDDLE(SmoothBezierSplineInterpolation, 1024, 1024, false, 0) {
// Smooth Bézier Spline Interpolation

SkPath MakeCubicSplineInterpolation(const SkPoint* pts, size_t N) {
    // Code borrowed from https://www.particleincell.com/2012/bezier-splines/

    SkPathBuilder path;
    if (N < 2) {
        return path.detach();
    }
    if (N == 2) {
        path.moveTo(pts[0]);
        path.lineTo(pts[1]);
        return path.detach();
    }
    size_t n = N - 1;  // number of segments
    struct Scratch {
        SkPoint a, b, c, r, p;
    };
    // Can I do this will less allocation?
    std::unique_ptr<Scratch[]> s(new Scratch[n]);
    s[0].a = {0, 0};
    s[0].b = {2, 2};
    s[0].c = {1, 1};
    s[0].r = {pts[0].x() + 2 * pts[1].x(), pts[0].y() + 2 * pts[1].y()};
    for (size_t i = 1; i < n - 1; ++i) {
        s[i].a = {1, 1};
        s[i].b = {4, 4};
        s[i].c = {1, 1};
        s[i].r = {4 * pts[i].x() + 2 * pts[i + 1].x(), 4 * pts[i].y() + 2 * pts[i + 1].y()};
    }
    s[n - 1].a = {2, 2};
    s[n - 1].b = {7, 7};
    s[n - 1].c = {0, 0};
    s[n - 1].r = {8 * pts[n - 1].x() + pts[N - 1].x(), 8 * pts[n - 1].y() + pts[N - 1].y()};
    for (size_t i = 1; i < n; i++) {
        float mx = s[i].a.x() / s[i - 1].b.x();
        float my = s[i].a.y() / s[i - 1].b.y();
        s[i].b -= {mx * s[i - 1].c.x(), my * s[i - 1].c.y()};
        s[i].r -= {mx * s[i - 1].r.x(), my * s[i - 1].r.y()};
    }
    s[n - 1].p = {s[n - 1].r.x() / s[n - 1].b.x(), s[n - 1].r.y() / s[n - 1].b.y()};
    for (int i = (int)N - 3; i >= 0; --i) {
        s[i].p = {(s[i].r.x() - s[i].c.x() * s[i + 1].p.fX) / s[i].b.x(),
                  (s[i].r.y() - s[i].c.y() * s[i + 1].p.fY) / s[i].b.y()};
    }

    path.moveTo(pts[0]);
    for (size_t i = 0; i < n - 1; i++) {
        SkPoint q = {2 * pts[i + 1].x() - s[i + 1].p.fX, 2 * pts[i + 1].y() - s[i + 1].p.fY};
        path.cubicTo(s[i].p, q, pts[i + 1]);
    }
    SkPoint q = {0.5f * (pts[N - 1].x() + s[n - 1].p.x()),
                 0.5f * (pts[N - 1].y() + s[n - 1].p.y())};
    path.cubicTo(s[n - 1].p, q, pts[n]);
    return path.detach();
}

void draw(SkCanvas* canvas) {
    SkPaint p;
    p.setColor(SK_ColorRED);
    p.setAntiAlias(true);
    p.setStyle(SkPaint::kStroke_Style);
    p.setStrokeWidth(3);
    p.setStrokeCap(SkPaint::kRound_Cap);

    // randomly generated y values in range [12,1024].
    SkPoint pts[] = {
            {62, 511}, {162, 605}, {262, 610}, {362, 402}, {462, 959},
            {562, 58}, {662, 272}, {762, 99},  {862, 759}, {962, 945},
    };

    canvas->drawPath(MakeCubicSplineInterpolation(pts, std::size(pts)), p);

    p.setStrokeWidth(10);
    p.setColor(SK_ColorBLACK);
    canvas->drawPoints(SkCanvas::kPoints_PointMode, pts, p);
}
}  // END FIDDLE
