blob: 700549fa1d7513a18134b803e2854ab3e12cb088 [file] [log] [blame]
// Copyright 2016 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 CC_TREES_LAYER_TREE_MUTATOR_H_
#define CC_TREES_LAYER_TREE_MUTATOR_H_
#include "base/callback_forward.h"
#include "base/time/time.h"
#include "cc/cc_export.h"
#include "cc/trees/animation_options.h"
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
namespace cc {
struct CC_EXPORT WorkletAnimationId {
// Uniquely identifies the animation worklet with which this animation is
// associated.
int scope_id;
// Uniquely identifies the animation within its animation worklet. Note that
// animation_id is only guaranteed to be unique per animation worklet.
int animation_id;
inline bool operator==(const WorkletAnimationId& rhs) const {
return (this->scope_id == rhs.scope_id) &&
(this->animation_id == rhs.animation_id);
}
};
struct CC_EXPORT AnimationWorkletInput {
struct CC_EXPORT AddAndUpdateState {
WorkletAnimationId worklet_animation_id;
// Name associated with worklet animation.
std::string name;
// Worklet animation's current time, from its associated timeline.
double current_time;
std::unique_ptr<AnimationOptions> options;
AddAndUpdateState(WorkletAnimationId worklet_animation_id,
std::string name,
double current_time,
std::unique_ptr<AnimationOptions> options);
AddAndUpdateState(AddAndUpdateState&&);
~AddAndUpdateState();
};
struct CC_EXPORT UpdateState {
WorkletAnimationId worklet_animation_id;
// Worklet animation's current time, from its associated timeline.
double current_time = 0;
};
// Note: When adding any new fields please also update ValidateScope to
// reflect them if necessary.
std::vector<AddAndUpdateState> added_and_updated_animations;
std::vector<UpdateState> updated_animations;
std::vector<WorkletAnimationId> removed_animations;
AnimationWorkletInput();
~AnimationWorkletInput();
#if DCHECK_IS_ON()
// Verifies all animation states have the expected scope id.
bool ValidateScope(int scope_id) const;
#endif
DISALLOW_COPY_AND_ASSIGN(AnimationWorkletInput);
};
class CC_EXPORT MutatorInputState {
public:
MutatorInputState();
~MutatorInputState();
bool IsEmpty() const;
void Add(AnimationWorkletInput::AddAndUpdateState&& state);
void Update(AnimationWorkletInput::UpdateState&& state);
void Remove(WorkletAnimationId worklet_animation_id);
// Returns input for animation worklet with the given |scope_id| and nullptr
// if there is no input.
std::unique_ptr<AnimationWorkletInput> TakeWorkletState(int scope_id);
private:
using InputMap =
std::unordered_map<int, std::unique_ptr<AnimationWorkletInput>>;
// Maps a scope id to its associated AnimationWorkletInput instance.
// Only contains scope ids for which there is a non-empty input.
InputMap inputs_;
// Returns iterator pointing to the entry in |inputs_| map whose key is id. It
// inserts a new entry if none exists.
AnimationWorkletInput& EnsureWorkletEntry(int id);
DISALLOW_COPY_AND_ASSIGN(MutatorInputState);
};
struct CC_EXPORT AnimationWorkletOutput {
struct CC_EXPORT AnimationState {
WorkletAnimationId worklet_animation_id;
// The animator effect's local time.
// TODO(majidvp): This assumes each animator has a single output effect
// which does not hold once we state support group effects.
// http://crbug.com/767043
base::TimeDelta local_time;
};
AnimationWorkletOutput();
~AnimationWorkletOutput();
std::vector<AnimationState> animations;
};
// LayerTreeMutatorClient processes worklet outputs individually so we can
// define mutator output to be the same as animation worklet output.
using MutatorOutputState = AnimationWorkletOutput;
class LayerTreeMutatorClient {
public:
// Called when mutator needs to update its output.
//
// |output_state|: Most recent output of the mutator.
virtual void SetMutationUpdate(
std::unique_ptr<MutatorOutputState> output_state) = 0;
};
class CC_EXPORT LayerTreeMutator {
public:
virtual ~LayerTreeMutator() {}
virtual void SetClient(LayerTreeMutatorClient* client) = 0;
virtual void Mutate(std::unique_ptr<MutatorInputState> input_state) = 0;
// TODO(majidvp): Remove when timeline inputs are known.
virtual bool HasAnimators() = 0;
};
} // namespace cc
#endif // CC_TREES_LAYER_TREE_MUTATOR_H_