// 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_quadTo_example_parametric_animated, 512, 512, false, 0, 4) {
// SkPath_quadTo_example_parametric_animated

SkPoint quad(SkPoint p0, SkPoint p1, SkPoint p2, float t) {
    float s = 1 - t;
    return {(s * s * p0.x()) + (2 * s * t * p1.x()) + (t * t * p2.x()),
            (s * s * p0.y()) + (2 * s * t * p1.y()) + (t * t * p2.y())};
}

/*

        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 * x0) + (2 * s * t * x1) + (t * t * x2)
          y := (s * s * y0) + (2 * s * t * y1) + (t * t * y2)

*/

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

static void draw_line(SkCanvas* canvas, SkPoint p0, SkPoint p1, const SkPaint& paint) {
    canvas->drawLine(p0.x(), p0.y(), p1.x(), p1.y(), paint);
}

static void draw_point(SkCanvas* canvas, SkPoint p, const SkPaint& paint) {
    canvas->drawPoint(p.x(), p.y(), paint);
}

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

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

    SkPoint a{10, 100};
    SkPoint b{200, 400};
    SkPoint c{390, 100};

    SkPoint ab = interpolate(a, b, frame);
    SkPoint bc = interpolate(b, c, frame);

    draw_line(canvas, a, b, paint);
    draw_line(canvas, b, c, paint);

    paint.setStrokeWidth(1);
    draw_line(canvas, ab, bc, paint);
    paint.setStrokeWidth(5);

    paint.setColor(SkColorSetARGB(255,0,0,255));
    SkPathBuilder quadraticCurve;
    quadraticCurve.moveTo(a);
    quadraticCurve.quadTo(b, c);
    canvas->drawPath(quadraticCurve.detach(), paint);

    SkPaint textPaint;
    SkFont font(fontMgr->matchFamilyStyle(nullptr, {}), 32);
    textPaint.setAntiAlias(true);
    canvas->drawString("a", a.x(),    a.y(),    font, textPaint);
    canvas->drawString("b", b.x()+20, b.y()+20, font, textPaint);
    canvas->drawString("c", c.x(),    c.y(),    font, textPaint);

    SkPaint pointPaint;
    pointPaint.setAntiAlias(true);
    pointPaint.setStrokeWidth(8);
    pointPaint.setStrokeCap(SkPaint::kRound_Cap);
    pointPaint.setColor(SkColorSetARGB(255, 0, 255, 0));
    draw_point(canvas, quad(a, b, c, frame), pointPaint);
}
}  // END FIDDLE
