// 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 SetAnimationTimeInternal(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_;

  // |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_
