// 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 CCKeyframedAnimationCurve_h
#define CCKeyframedAnimationCurve_h

#include "CCAnimationCurve.h"
#include "CCTimingFunction.h"
#include "cc/own_ptr_vector.h"
#include <public/WebTransformOperations.h>
#include <wtf/OwnPtr.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/Vector.h>

namespace cc {

class CCKeyframe {
public:
    double time() const;
    const CCTimingFunction* timingFunction() const;

protected:
    CCKeyframe(double time, PassOwnPtr<CCTimingFunction>);
    virtual ~CCKeyframe();

private:
    double m_time;
    OwnPtr<CCTimingFunction> m_timingFunction;
};

class CCFloatKeyframe : public CCKeyframe {
public:
    static PassOwnPtr<CCFloatKeyframe> create(double time, float value, PassOwnPtr<CCTimingFunction>);
    virtual ~CCFloatKeyframe();

    float value() const;

    PassOwnPtr<CCFloatKeyframe> clone() const;

private:
    CCFloatKeyframe(double time, float value, PassOwnPtr<CCTimingFunction>);

    float m_value;
};

class CCTransformKeyframe : public CCKeyframe {
public:
    static PassOwnPtr<CCTransformKeyframe> create(double time, const WebKit::WebTransformOperations& value, PassOwnPtr<CCTimingFunction>);
    virtual ~CCTransformKeyframe();

    const WebKit::WebTransformOperations& value() const;

    PassOwnPtr<CCTransformKeyframe> clone() const;

private:
    CCTransformKeyframe(double time, const WebKit::WebTransformOperations& value, PassOwnPtr<CCTimingFunction>);

    WebKit::WebTransformOperations m_value;
};

class CCKeyframedFloatAnimationCurve : public CCFloatAnimationCurve {
public:
    // It is required that the keyframes be sorted by time.
    static PassOwnPtr<CCKeyframedFloatAnimationCurve> create();

    virtual ~CCKeyframedFloatAnimationCurve();

    void addKeyframe(PassOwnPtr<CCFloatKeyframe>);

    // CCAnimationCurve implementation
    virtual double duration() const OVERRIDE;
    virtual PassOwnPtr<CCAnimationCurve> clone() const OVERRIDE;

    // CCFloatAnimationCurve implementation
    virtual float getValue(double t) const OVERRIDE;

private:
    CCKeyframedFloatAnimationCurve();

    // Always sorted in order of increasing time. No two keyframes have the
    // same time.
    OwnPtrVector<CCFloatKeyframe> m_keyframes;
};

class CCKeyframedTransformAnimationCurve : public CCTransformAnimationCurve {
public:
    // It is required that the keyframes be sorted by time.
    static PassOwnPtr<CCKeyframedTransformAnimationCurve> create();

    virtual ~CCKeyframedTransformAnimationCurve();

    void addKeyframe(PassOwnPtr<CCTransformKeyframe>);

    // CCAnimationCurve implementation
    virtual double duration() const OVERRIDE;
    virtual PassOwnPtr<CCAnimationCurve> clone() const OVERRIDE;

    // CCTransformAnimationCurve implementation
    virtual WebKit::WebTransformationMatrix getValue(double t) const OVERRIDE;

private:
    CCKeyframedTransformAnimationCurve();

    // Always sorted in order of increasing time. No two keyframes have the
    // same time.
    OwnPtrVector<CCTransformKeyframe> m_keyframes;
};

} // namespace cc

#endif // CCKeyframedAnimationCurve_h