#ifndef CC_TREES_LAYER_TREE_MUTATOR_H_
#define CC_TREES_LAYER_TREE_MUTATOR_H_
#include <memory>
#include <optional>
#include <string>
#include <unordered_map>
#include <vector>
#include "base/check.h"
#include "base/functional/callback_forward.h"
#include "base/time/time.h"
#include "cc/cc_export.h"
#include "cc/trees/animation_effect_timings.h"
#include "cc/trees/animation_options.h"
namespace cc {
enum class MutateQueuingStrategy {
kDrop,
kQueueHighPriority,
kQueueAndReplaceNormalPriority,
};
enum class MutateStatus {
kCompletedWithUpdate,
kCompletedNoUpdate,
kCanceled
};
struct CC_EXPORT WorkletAnimationId {
int worklet_id;
int animation_id;
WorkletAnimationId() : worklet_id(0), animation_id(0) {}
WorkletAnimationId(int worklet_id, int animation_id)
: worklet_id(worklet_id), animation_id(animation_id) {}
inline bool operator==(const WorkletAnimationId& rhs) const {
return (this->worklet_id == rhs.worklet_id) &&
(this->animation_id == rhs.animation_id);
}
explicit operator bool() const { return !!worklet_id || !!animation_id; }
};
struct CC_EXPORT AnimationWorkletInput {
struct CC_EXPORT AddAndUpdateState {
WorkletAnimationId worklet_animation_id;
std::string name;
double current_time;
std::unique_ptr<AnimationOptions> options;
std::unique_ptr<AnimationEffectTimings> effect_timings;
AddAndUpdateState(WorkletAnimationId worklet_animation_id,
std::string name,
double current_time,
std::unique_ptr<AnimationOptions> options,
std::unique_ptr<AnimationEffectTimings> effect_timings);
AddAndUpdateState(AddAndUpdateState&&);
~AddAndUpdateState();
};
struct CC_EXPORT UpdateState {
WorkletAnimationId worklet_animation_id;
double current_time = 0;
};
std::vector<AddAndUpdateState> added_and_updated_animations;
std::vector<UpdateState> updated_animations;
std::vector<WorkletAnimationId> removed_animations;
AnimationWorkletInput();
AnimationWorkletInput(const AnimationWorkletInput&) = delete;
~AnimationWorkletInput();
AnimationWorkletInput& operator=(const AnimationWorkletInput&) = delete;
#if DCHECK_IS_ON()
bool ValidateId(int worklet_id) const;
#endif
};
class CC_EXPORT MutatorInputState {
public:
MutatorInputState();
MutatorInputState(const MutatorInputState&) = delete;
~MutatorInputState();
MutatorInputState& operator=(const MutatorInputState&) = delete;
bool IsEmpty() const;
void Add(AnimationWorkletInput::AddAndUpdateState&& state);
void Update(AnimationWorkletInput::UpdateState&& state);
void Remove(WorkletAnimationId worklet_animation_id);
std::unique_ptr<AnimationWorkletInput> TakeWorkletState(int scope_id);
private:
using InputMap =
std::unordered_map<int, std::unique_ptr<AnimationWorkletInput>>;
InputMap inputs_;
AnimationWorkletInput& EnsureWorkletEntry(int id);
};
struct CC_EXPORT AnimationWorkletOutput {
struct CC_EXPORT AnimationState {
explicit AnimationState(WorkletAnimationId);
AnimationState(const AnimationState&);
~AnimationState();
WorkletAnimationId worklet_animation_id;
std::vector<std::optional<base::TimeDelta>> local_times;
};
AnimationWorkletOutput();
~AnimationWorkletOutput();
std::vector<AnimationState> animations;
};
using MutatorOutputState = AnimationWorkletOutput;
class LayerTreeMutatorClient {
public:
virtual void SetMutationUpdate(
std::unique_ptr<MutatorOutputState> output_state) = 0;
};
class CC_EXPORT LayerTreeMutator {
public:
virtual ~LayerTreeMutator() {}
virtual void SetClient(LayerTreeMutatorClient* client) = 0;
using DoneCallback = base::OnceCallback<void(MutateStatus)>;
virtual bool Mutate(std::unique_ptr<MutatorInputState> input_state,
MutateQueuingStrategy queueing_strategy,
DoneCallback done_callback) = 0;
virtual bool HasMutators() = 0;
};
}
#endif