// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_MATH_MATRIX_INTERPOLATION_H_
#define COBALT_MATH_MATRIX_INTERPOLATION_H_

#include "base/memory/ref_counted.h"
#include "cobalt/math/matrix3_f.h"

namespace cobalt {
namespace math {

// This structure is based off of the specification provided by the W3C here:
//   https://www.w3.org/TR/css-transforms/#interpolation-of-2d-matrices
struct DecomposedMatrix {
  float translation[2];
  float scale[2];
  float angle;
  float m11;
  float m12;
  float m21;
  float m22;
};

// Decompose a matrix into basic transformations:
// (translation/scale/rotation/skew)
//   https://www.w3.org/TR/css-transforms/#decomposing-a-2d-matrix
DecomposedMatrix DecomposeMatrix(const math::Matrix3F& matrix);

// Interpolate between two decomposed matrices a and b by the specified
// progress.
//   https://www.w3.org/TR/css-transforms/#interpolation-of-decomposed-2d-matrix-values
DecomposedMatrix InterpolateMatrixDecompositions(const DecomposedMatrix& a,
                                                 const DecomposedMatrix& b,
                                                 float progress);

// Reconstruct a matrix from a given matrix decomposition.
//   https://www.w3.org/TR/css-transforms/#recomposing-to-a-2d-matrix
math::Matrix3F RecomposeMatrix(const DecomposedMatrix& decomposition);

// Interpolates from matrix a to matrix b according to the specified progress.
// The algorithm used to do this interpolation is described here:
//   https://www.w3.org/TR/css-transforms/#interpolation-of-2d-matrices
math::Matrix3F InterpolateMatrices(const math::Matrix3F& a,
                                   const math::Matrix3F& b, float progress);

}  // namespace math
}  // namespace cobalt

#endif  // COBALT_MATH_MATRIX_INTERPOLATION_H_
