forked from Pissandshittium/pissandshittium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmutator_host.h
188 lines (154 loc) · 7.16 KB
/
mutator_host.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
// 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_MUTATOR_HOST_H_
#define CC_TREES_MUTATOR_HOST_H_
#include <memory>
#include <vector>
#include "base/time/time.h"
#include "cc/paint/element_id.h"
#include "cc/trees/layer_tree_mutator.h"
#include "cc/trees/mutator_host_client.h"
#include "ui/gfx/geometry/box_f.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/vector2d_f.h"
namespace cc {
class MutatorEvents;
class MutatorHostClient;
class LayerTreeMutator;
class ScrollTree;
// Used as the return value of GetAnimationScales() to indicate that there is
// no active transform animation or the scale cannot be computed.
constexpr float kInvalidScale = 0.f;
// A MutatorHost owns all the animation and mutation effects.
// There is just one MutatorHost for LayerTreeHost on main renderer thread
// and just one MutatorHost for LayerTreeHostImpl on the impl thread.
// We synchronize them during the commit in a one-way data-flow process
// (PushPropertiesTo).
// A MutatorHost talks to its correspondent LayerTreeHost via
// MutatorHostClient interface.
class MutatorHost {
public:
virtual ~MutatorHost() = default;
virtual std::unique_ptr<MutatorHost> CreateImplInstance() const = 0;
virtual void ClearMutators() = 0;
virtual void UpdateRegisteredElementIds(ElementListType changed_list) = 0;
virtual void InitClientAnimationState() = 0;
virtual void RegisterElementId(ElementId element_id,
ElementListType list_type) = 0;
virtual void UnregisterElementId(ElementId element_id,
ElementListType list_type) = 0;
virtual void SetMutatorHostClient(MutatorHostClient* client) = 0;
virtual void SetLayerTreeMutator(
std::unique_ptr<LayerTreeMutator> mutator) = 0;
virtual void PushPropertiesTo(MutatorHost* host_impl) = 0;
virtual void SetScrollAnimationDurationForTesting(
base::TimeDelta duration) = 0;
virtual bool NeedsTickAnimations() const = 0;
virtual bool ActivateAnimations(MutatorEvents* events) = 0;
// TODO(smcgruer): Once we only tick scroll-based animations on scroll, we
// don't need to pass the scroll tree in here.
virtual bool TickAnimations(base::TimeTicks monotonic_time,
const ScrollTree& scroll_tree,
bool is_active_tree) = 0;
// Tick animations that depends on scroll offset.
virtual void TickScrollAnimations(base::TimeTicks monotonic_time,
const ScrollTree& scroll_tree) = 0;
virtual void TickWorkletAnimations() = 0;
virtual bool UpdateAnimationState(bool start_ready_animations,
MutatorEvents* events) = 0;
// Returns TIME_UPDATED events generated in this frame to be handled by
// BeginMainFrame.
virtual void TakeTimeUpdatedEvents(MutatorEvents* events) = 0;
virtual void PromoteScrollTimelinesPendingToActive() = 0;
virtual std::unique_ptr<MutatorEvents> CreateEvents() = 0;
virtual void SetAnimationEvents(std::unique_ptr<MutatorEvents> events) = 0;
virtual bool ScrollOffsetAnimationWasInterrupted(
ElementId element_id) const = 0;
virtual bool IsAnimatingFilterProperty(ElementId element_id,
ElementListType list_type) const = 0;
virtual bool IsAnimatingBackdropFilterProperty(
ElementId element_id,
ElementListType list_type) const = 0;
virtual bool IsAnimatingOpacityProperty(ElementId element_id,
ElementListType list_type) const = 0;
virtual bool IsAnimatingTransformProperty(
ElementId element_id,
ElementListType list_type) const = 0;
virtual bool HasPotentiallyRunningFilterAnimation(
ElementId element_id,
ElementListType list_type) const = 0;
virtual bool HasPotentiallyRunningBackdropFilterAnimation(
ElementId element_id,
ElementListType list_type) const = 0;
virtual bool HasPotentiallyRunningOpacityAnimation(
ElementId element_id,
ElementListType list_type) const = 0;
virtual bool HasPotentiallyRunningTransformAnimation(
ElementId element_id,
ElementListType list_type) const = 0;
virtual bool HasAnyAnimationTargetingProperty(
ElementId element_id,
TargetProperty::Type property) const = 0;
virtual bool AnimationsPreserveAxisAlignment(ElementId element_id) const = 0;
// Returns the maximum scale along any dimension at any destination in active
// scale animations, or kInvalidScale if there is no active transform
// animation or the scale cannot be computed.
virtual float MaximumScale(ElementId element_id,
ElementListType list_type) const = 0;
virtual bool IsElementAnimating(ElementId element_id) const = 0;
virtual bool HasTickingKeyframeModelForTesting(
ElementId element_id) const = 0;
virtual void ImplOnlyAutoScrollAnimationCreate(
ElementId element_id,
const gfx::PointF& target_offset,
const gfx::PointF& current_offset,
float autoscroll_velocity,
base::TimeDelta animation_start_offset) = 0;
virtual void ImplOnlyScrollAnimationCreate(
ElementId element_id,
const gfx::PointF& target_offset,
const gfx::PointF& current_offset,
base::TimeDelta delayed_by,
base::TimeDelta animation_start_offset) = 0;
virtual bool ImplOnlyScrollAnimationUpdateTarget(
const gfx::Vector2dF& scroll_delta,
const gfx::PointF& max_scroll_offset,
base::TimeTicks frame_monotonic_time,
base::TimeDelta delayed_by) = 0;
virtual void ScrollAnimationAbort() = 0;
// If there is an ongoing scroll animation on Impl, return the ElementId of
// the scroller. Otherwise returns an invalid ElementId.
virtual ElementId ImplOnlyScrollAnimatingElement() const = 0;
virtual size_t MainThreadAnimationsCount() const = 0;
virtual bool HasInvalidationAnimation() const = 0;
virtual bool HasNativePropertyAnimation() const = 0;
virtual bool CurrentFrameHadRAF() const = 0;
virtual bool NextFrameHasPendingRAF() const = 0;
virtual bool HasCanvasInvalidation() const = 0;
virtual bool HasJSAnimation() const = 0;
virtual bool HasSmilAnimation() const = 0;
// Iterates through all animations and returns the minimum tick interval.
// Returns 0 if there is a continuous animation which should be ticked
// as fast as possible.
virtual base::TimeDelta MinimumTickInterval() const = 0;
using TrackedAnimationSequenceId = size_t;
struct PendingThroughputTrackerInfo {
// Id of a tracked animation sequence.
TrackedAnimationSequenceId id = 0u;
// True means the tracking for |id| is pending to start and false means
// the tracking is pending to stop.
bool start = false;
};
// Takes info of throughput trackers that are pending start or stop.
using PendingThroughputTrackerInfos =
std::vector<PendingThroughputTrackerInfo>;
virtual PendingThroughputTrackerInfos TakePendingThroughputTrackerInfos() = 0;
};
class MutatorEvents {
public:
virtual ~MutatorEvents() = default;
virtual bool IsEmpty() const = 0;
};
} // namespace cc
#endif // CC_TREES_MUTATOR_HOST_H_