// Copyright 2013 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.

#include "webkit/renderer/compositor_bindings/web_filter_animation_curve_impl.h"

#include "cc/animation/keyframed_animation_curve.h"
#include "cc/animation/timing_function.h"
#include "cc/output/filter_operations.h"
#include "webkit/renderer/compositor_bindings/web_animation_curve_common.h"
#include "webkit/renderer/compositor_bindings/web_filter_operations_impl.h"

using blink::WebFilterKeyframe;

namespace webkit {

WebFilterAnimationCurveImpl::WebFilterAnimationCurveImpl()
    : curve_(cc::KeyframedFilterAnimationCurve::Create()) {}

WebFilterAnimationCurveImpl::~WebFilterAnimationCurveImpl() {}

blink::WebAnimationCurve::AnimationCurveType
WebFilterAnimationCurveImpl::type() const {
  return WebAnimationCurve::AnimationCurveTypeFilter;
}

void WebFilterAnimationCurveImpl::add(const WebFilterKeyframe& keyframe,
                                      TimingFunctionType type) {
  const cc::FilterOperations& filter_operations =
      static_cast<const webkit::WebFilterOperationsImpl&>(keyframe.value())
      .AsFilterOperations();
  curve_->AddKeyframe(cc::FilterKeyframe::Create(
      keyframe.time(), filter_operations, CreateTimingFunction(type)));
}

void WebFilterAnimationCurveImpl::add(const WebFilterKeyframe& keyframe,
                                      double x1,
                                      double y1,
                                      double x2,
                                      double y2) {
  const cc::FilterOperations& filter_operations =
      static_cast<const webkit::WebFilterOperationsImpl&>(keyframe.value())
      .AsFilterOperations();
  curve_->AddKeyframe(cc::FilterKeyframe::Create(
      keyframe.time(),
      filter_operations,
      cc::CubicBezierTimingFunction::Create(x1, y1, x2, y2)
          .PassAs<cc::TimingFunction>()));
}

scoped_ptr<cc::AnimationCurve>
WebFilterAnimationCurveImpl::CloneToAnimationCurve() const {
  return curve_->Clone();
}

}  // namespace webkit
