// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COBALT_MATH_CUBIC_BEZIER_H_
#define COBALT_MATH_CUBIC_BEZIER_H_

namespace cobalt {
namespace math {

// CubicBezier implements functionality required to evaluate the cubic-bezier()
// class of timing functions as defined here:
//   https://developer.mozilla.org/en-US/docs/Web/CSS/timing-function
//
// A cubic Bezier curve is defined by four points P0, P1, P2, and P3.
// P0 and P3 are the start and the end of the curve and in CSS these points
// are fixed and defined as (0, 0) and (1, 1) respectively.
//
// Given P1=(x1, y1) and P2=(x2, y2), for each x in [0, 1] the following code
// will find y, such that P=(x, y) resides on the curve.
//
//   const CubicBezier curve(x1, y1, x2, y2);
//   const double y = curve.Solve(x);
//
class CubicBezier {
 public:
  CubicBezier(double x1, double y1, double x2, double y2);
  ~CubicBezier();

  // Returns an approximation of y at the given x.
  double Solve(double x) const;

  // Returns an approximation of dy/dx at the given x.
  double Slope(double x) const;

  // Sets |min| and |max| to the bezier's minimum and maximium y values in the
  // interval [0, 1].
  void Range(double* min, double* max) const;

  double x1() const { return x1_; }
  double y1() const { return y1_; }
  double x2() const { return x2_; }
  double y2() const { return y2_; }

  bool operator==(const CubicBezier& other) const {
    return x1_ == other.x1_ && y1_ == other.y1_ && x2_ == other.x2_ &&
           y2_ == other.y2_;
  }

 private:
  double x1_;
  double y1_;
  double x2_;
  double y2_;
};

}  // namespace math
}  // namespace cobalt

#endif  // COBALT_MATH_CUBIC_BEZIER_H_
