// Copyright 2012 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 CC_ANIMATION_ANIMATION_CURVE_H_
#define CC_ANIMATION_ANIMATION_CURVE_H_

#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "cc/base/cc_export.h"
#include "cc/output/filter_operations.h"
#include "ui/gfx/transform.h"

namespace gfx {
class BoxF;
}

namespace cc {

class ColorAnimationCurve;
class FilterAnimationCurve;
class FloatAnimationCurve;
class ScrollOffsetAnimationCurve;
class TransformAnimationCurve;
class TransformOperations;

// An animation curve is a function that returns a value given a time.
class CC_EXPORT AnimationCurve {
 public:
  enum CurveType { Color, Float, Transform, Filter, ScrollOffset };

  virtual ~AnimationCurve() {}

  virtual base::TimeDelta Duration() const = 0;
  virtual CurveType Type() const = 0;
  virtual scoped_ptr<AnimationCurve> Clone() const = 0;

  const ColorAnimationCurve* ToColorAnimationCurve() const;
  const FloatAnimationCurve* ToFloatAnimationCurve() const;
  const TransformAnimationCurve* ToTransformAnimationCurve() const;
  const FilterAnimationCurve* ToFilterAnimationCurve() const;
  const ScrollOffsetAnimationCurve* ToScrollOffsetAnimationCurve() const;

  ScrollOffsetAnimationCurve* ToScrollOffsetAnimationCurve();
};

class CC_EXPORT ColorAnimationCurve : public AnimationCurve {
 public:
  ~ColorAnimationCurve() override {}

  virtual SkColor GetValue(base::TimeDelta t) const = 0;

  // Partial Animation implementation.
  CurveType Type() const override;
};

class CC_EXPORT FloatAnimationCurve : public AnimationCurve {
 public:
  ~FloatAnimationCurve() override {}

  virtual float GetValue(base::TimeDelta t) const = 0;

  // Partial Animation implementation.
  CurveType Type() const override;
};

class CC_EXPORT TransformAnimationCurve : public AnimationCurve {
 public:
  ~TransformAnimationCurve() override {}

  virtual gfx::Transform GetValue(base::TimeDelta t) const = 0;

  // Sets |bounds| to be the bounding box for the region within which |box|
  // will move during this animation. If this region cannot be computed,
  // returns false.
  virtual bool AnimatedBoundsForBox(const gfx::BoxF& box,
                                    gfx::BoxF* bounds) const = 0;

  // Returns true if this animation affects scale.
  virtual bool AffectsScale() const = 0;

  // Returns true if this animation is a translation.
  virtual bool IsTranslation() const = 0;

  // Set |max_scale| to the maximum scale along any dimension at the end of
  // intermediate animation target points (eg keyframe end points). When
  // |forward_direction| is true, the animation curve assumes it plays from
  // the first keyframe to the last, otherwise it assumes the opposite. Returns
  // false if the maximum scale cannot be computed.
  virtual bool MaximumTargetScale(bool forward_direction,
                                  float* max_scale) const = 0;

  // Partial Animation implementation.
  CurveType Type() const override;
};

class CC_EXPORT FilterAnimationCurve : public AnimationCurve {
 public:
  ~FilterAnimationCurve() override {}

  virtual FilterOperations GetValue(base::TimeDelta t) const = 0;
  virtual bool HasFilterThatMovesPixels() const = 0;

  // Partial Animation implementation.
  CurveType Type() const override;
};

}  // namespace cc

#endif  // CC_ANIMATION_ANIMATION_CURVE_H_
