| // Copyright 2017 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 UI_GFX_ANIMATION_KEYFRAME_KEYFRAME_EFFECT_H_ |
| #define UI_GFX_ANIMATION_KEYFRAME_KEYFRAME_EFFECT_H_ |
| |
| #include <bitset> |
| #include <set> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| #include "ui/gfx/animation/keyframe/animation_curve.h" |
| #include "ui/gfx/animation/keyframe/keyframe_animation_export.h" |
| #include "ui/gfx/animation/keyframe/keyframe_model.h" |
| #include "ui/gfx/animation/keyframe/transition.h" |
| |
| namespace gfx { |
| class SizeF; |
| class TransformOperations; |
| |
| static constexpr size_t kMaxTargetPropertyId = 32u; |
| using TargetProperties = std::bitset<kMaxTargetPropertyId>; |
| |
| // This is a simplified version of cc::KeyframeEffect. Its sole purpose is the |
| // management of its collection of KeyframeModels. Ticking them, updating their |
| // state, and deleting them as required. |
| // |
| // For background on the name of this class, please refer to the WebAnimations |
| // spec: https://www.w3.org/TR/web-animations-1/#the-keyframeeffect-interface |
| // |
| // TODO(crbug.com/747185): Make cc::KeyframeEffect a subclass of KeyframeEffect |
| // and share common code. |
| class GFX_KEYFRAME_ANIMATION_EXPORT KeyframeEffect { |
| public: |
| static int GetNextKeyframeModelId(); |
| static int GetNextGroupId(); |
| |
| KeyframeEffect(); |
| ~KeyframeEffect(); |
| |
| KeyframeEffect(KeyframeEffect&&); |
| KeyframeEffect(const KeyframeEffect&) = delete; |
| |
| KeyframeEffect& operator=(KeyframeEffect&&) = default; |
| KeyframeEffect& operator=(const KeyframeEffect&) = delete; |
| |
| virtual void AddKeyframeModel(std::unique_ptr<KeyframeModel> keyframe_model); |
| void RemoveAllKeyframeModels(); |
| void RemoveKeyframeModel(int keyframe_model_id); |
| void RemoveKeyframeModels(int target_property); |
| |
| virtual void Tick(base::TimeTicks monotonic_time); |
| |
| // This ticks all keyframe models until they are complete. |
| void FinishAll(); |
| |
| using KeyframeModels = std::vector<std::unique_ptr<KeyframeModel>>; |
| const KeyframeModels& keyframe_models() const { return keyframe_models_; } |
| KeyframeModels& keyframe_models() { return keyframe_models_; } |
| |
| // The transition is analogous to CSS transitions. When configured, the |
| // transition object will cause subsequent calls the corresponding |
| // TransitionXXXTo functions to induce transition animations. |
| const Transition& transition() const { return transition_; } |
| void set_transition(const Transition& transition) { |
| transition_ = transition; |
| } |
| |
| void SetTransitionedProperties(const std::set<int>& properties); |
| void SetTransitionDuration(base::TimeDelta delta); |
| |
| void TransitionFloatTo(FloatAnimationCurve::Target* target, |
| base::TimeTicks monotonic_time, |
| int target_property, |
| float from, |
| float to); |
| void TransitionTransformOperationsTo(TransformAnimationCurve::Target* target, |
| base::TimeTicks monotonic_time, |
| int target_property, |
| const gfx::TransformOperations& from, |
| const gfx::TransformOperations& to); |
| void TransitionSizeTo(SizeAnimationCurve::Target* target, |
| base::TimeTicks monotonic_time, |
| int target_property, |
| const gfx::SizeF& from, |
| const gfx::SizeF& to); |
| void TransitionColorTo(ColorAnimationCurve::Target* target, |
| base::TimeTicks monotonic_time, |
| int target_property, |
| SkColor from, |
| SkColor to); |
| |
| bool IsAnimatingProperty(int property) const; |
| bool IsAnimating() const; |
| |
| float GetTargetFloatValue(int target_property, float default_value) const; |
| gfx::TransformOperations GetTargetTransformOperationsValue( |
| int target_property, |
| const gfx::TransformOperations& default_value) const; |
| gfx::SizeF GetTargetSizeValue(int target_property, |
| const gfx::SizeF& default_value) const; |
| SkColor GetTargetColorValue(int target_property, SkColor default_value) const; |
| KeyframeModel* GetRunningKeyframeModelForProperty(int target_property) const; |
| KeyframeModel* GetKeyframeModel(int target_property) const; |
| KeyframeModel* GetKeyframeModelById(int id) const; |
| |
| protected: |
| // Removes all keyframe models in the range provided. This is virtual so that |
| // subclasses that need to do extra bookkeeping upon removals may do so. As a |
| // consequence, please ensure that all removals happen via this method. |
| virtual void RemoveKeyframeModelRange( |
| typename KeyframeModels::iterator to_remove_begin, |
| typename KeyframeModels::iterator to_remove_end); |
| void TickKeyframeModel(base::TimeTicks monotonic_time, |
| KeyframeModel* keyframe_model); |
| |
| private: |
| void TickInternal(base::TimeTicks monotonic_time, |
| bool include_infinite_animations); |
| void StartKeyframeModels(base::TimeTicks monotonic_time, |
| bool include_infinite_animations); |
| template <typename ValueType> |
| ValueType GetTargetValue(int target_property, |
| const ValueType& default_value) const; |
| |
| KeyframeModels keyframe_models_; |
| Transition transition_; |
| }; |
| |
| } // namespace gfx |
| |
| #endif // UI_GFX_ANIMATION_KEYFRAME_KEYFRAME_EFFECT_H_ |