// Copyright 2020 The Cobalt Authors. 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_RENDERER_RASTERIZER_SKIA_SKOTTIE_ANIMATION_H_
#define COBALT_RENDERER_RASTERIZER_SKIA_SKOTTIE_ANIMATION_H_

#include "cobalt/render_tree/lottie_animation.h"
#include "third_party/skia/modules/skottie/include/Skottie.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace skia {

// A subclass of render_tree::LottieAnnimation that holds information about
// the Skottie animation object associated with the given animation data.
class SkottieAnimation : public render_tree::LottieAnimation {
 public:
  SkottieAnimation(const char* data, size_t length);

  const math::Size& GetSize() const override { return animation_size_; }

  uint32 GetEstimatedSizeInBytes() const override {
    return json_size_in_bytes_;
  }

  bool IsOpaque() const override { return false; }

  void SetProperties(LottieProperties properties) override;

  void SetAnimationTime(base::TimeDelta animate_function_time) override;

  sk_sp<skottie::Animation> GetSkottieAnimation() { return skottie_animation_; }

 private:
  void UpdateAnimationFrameAndAnimateFunctionTimes(
      base::TimeDelta current_animation_time,
      base::TimeDelta current_animate_function_time);

  sk_sp<skottie::Animation> skottie_animation_;
  math::Size animation_size_;
  uint32 json_size_in_bytes_;

  LottieProperties properties_;
  // |seek_counter_| is used to indicate whether a particular seek has already
  // been processed. When |LottieProperties::seek_counter| is different, then
  // the requested seek should be performed and |seek_counter_| updated to match
  // LottieProperties.
  size_t seek_counter_ = 0;

  // |total_loops_| keeps track of how many times the animation has played
  // in its entirety.
  int total_loops_ = 0;
  // |direction_| is used to indicate whether the animation should be playing
  // in the the direction set by |LottieProperties::direction|, or whether it
  // should be playing in the opposite direction (ex: when mode = "bounce", the
  // animation needs to switch direction in between each loop).
  int direction_ = 1;
  // |is_complete_| indicates whether the animation has finished playback. It
  // should be set to true only after the animation frame time exceeds the
  // animation duration due to normal playback, and after the "complete" event
  // is triggered. It should be reset to false whenever the animation frame time
  // is updated by a change outside of normal playback, such as seeking or
  // stopping the animation.
  bool is_complete_ = false;

  // The last timestamp from the animation function in which we updated the
  // the frame time for |skottie_animation_|. Used for calculating the time
  // elapsed and updating the frame time again.
  base::TimeDelta last_updated_animate_function_time_;

  // The most recently updated frame time for |skottie_animation_|.
  base::TimeDelta last_updated_animation_time_;
};

}  // namespace skia
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_RASTERIZER_SKIA_SKOTTIE_ANIMATION_H_
