// 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_ANIMATED(SkPath_cubicTo_example_parametric_animated, 512, 512, false, 0, 3) {
/*
        If the starting point is (x0, y0), then this curve is defined as the
        paramentric curve as `t` goes from 0 to 1:
          s := 1 - t
          x := (s * s * s * x0) +
               (3 * s * s * t * x1) +
               (3 * s * t * t * x2) +
               (t * t * t * x3)
          y := (s * s * s * y0) +
               (3 * s * s * t * y1) +
               (3 * s * t * t * y2) +
               (t * t * t * y3)

*/

SkPoint cubic(SkPoint p0, SkPoint p1, SkPoint p2, SkPoint p3, float t) {
    // a simple mathematical definition of cubic curve.
    // There are faster ways to calculate this.
    float s = 1 - t;
    return {(s * s * s * p0.x()) +
            (3 * s * s * t * p1.x()) +
            (3 * s * t * t * p2.x()) +
            (t * t * t * p3.x()),
            (s * s * s * p0.y()) +
            (3 * s * s * t * p1.y()) +
            (3 * s * t * t * p2.y()) +
            (t * t * t * p3.y())};
}

static SkPoint interpolate(SkPoint a, SkPoint b, float t) {
   return {SkScalarInterp(a.x(), b.x(), t),
           SkScalarInterp(a.y(), b.y(), t)};
}

void draw(SkCanvas* canvas) {
    canvas->clear(SkColorSetARGB(255,255,255,255));

    SkPoint a{136,  64};
    SkPoint b{448, 448};
    SkPoint c{64,  448};
    SkPoint d{376, 64};

    SkPoint ab = interpolate(a, b, frame);
    SkPoint bc = interpolate(b, c, frame);
    SkPoint cd = interpolate(c, d, frame);
    SkPoint abc = interpolate(ab, bc, frame);
    SkPoint bcd = interpolate(bc, cd, frame);

    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(1);

    canvas->drawLine(ab, bc, paint);
    canvas->drawLine(bc, cd, paint);
    canvas->drawLine(abc, bcd, paint);

    paint.setStrokeWidth(3);
    canvas->drawLine(a, b, paint);
    canvas->drawLine(b, c, paint);
    canvas->drawLine(c, d, paint);

    paint.setStrokeWidth(5);
    paint.setColor(SkColorSetARGB(255, 0, 0, 255));
    SkPathBuilder cubicCurve;
    cubicCurve.moveTo(a);
    cubicCurve.cubicTo(b, c, d);
    canvas->drawPath(cubicCurve.detach(), paint);

    SkFont font(fontMgr->matchFamilyStyle(nullptr, {}), 32);
    SkPaint textPaint;
    textPaint.setColor(SkColorSetARGB(255, 0, 255, 0));
    textPaint.setAntiAlias(true);

    sk_sp<SkTypeface> face(fontMgr->matchFamilyStyle("DejaVu Sans Mono", SkFontStyle()));
    canvas->drawString("a", a.x(),    a.y(), font, textPaint);
    canvas->drawString("b", b.x(),    b.y(), font, textPaint);
    canvas->drawString("c", c.x()-20, c.y(), font, textPaint);
    canvas->drawString("d", d.x(),    d.y(), font, textPaint);
    SkString msg = SkStringPrintf("%.4f", frame);
    textPaint.setColor(SkColorSetARGB(255, 204, 204, 204));
    canvas->drawString(msg.c_str(), 4, 36, font, textPaint);

    SkPaint pointPaint;
    pointPaint.setAntiAlias(true);
    pointPaint.setStrokeWidth(8);
    pointPaint.setStrokeCap(SkPaint::kRound_Cap);

    pointPaint.setColor(SkColorSetARGB(255, 255, 0, 0));
    canvas->drawPoint(interpolate(abc, bcd, frame), pointPaint);

    pointPaint.setColor(SkColorSetARGB(255, 0, 255, 0));
    pointPaint.setStrokeWidth(7);
    canvas->drawPoint(cubic(a, b, c, d, frame), pointPaint);
}
}  // END FIDDLE
