Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2242)

Unified Diff: cc/animation/element_animations.cc

Issue 947033002: CC Animations: Establish AnimationHost, AnimationTimeline and AnimationPlayer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix MSVC warning. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/animation/element_animations.h ('k') | cc/animation/element_animations_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/animation/element_animations.cc
diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc
new file mode 100644
index 0000000000000000000000000000000000000000..934aec40660d05ec4a6283f11606161d5d4a0c00
--- /dev/null
+++ b/cc/animation/element_animations.cc
@@ -0,0 +1,243 @@
+// Copyright 2015 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.
+
+#include "cc/animation/element_animations.h"
+
+#include "cc/animation/animation_host.h"
+#include "cc/animation/animation_player.h"
+#include "cc/animation/animation_registrar.h"
+#include "cc/animation/layer_animation_value_observer.h"
+#include "cc/trees/mutator_host_client.h"
+
+namespace cc {
+
+class ElementAnimations::ValueObserver : public LayerAnimationValueObserver {
+ public:
+ ValueObserver(ElementAnimations* element_animation, LayerTreeType tree_type)
+ : element_animations_(element_animation), tree_type_(tree_type) {
+ DCHECK(element_animations_);
+ }
+
+ // LayerAnimationValueObserver implementation.
+ void OnFilterAnimated(const FilterOperations& filters) override {
+ element_animations_->SetFilterMutated(tree_type_, filters);
+ }
+
+ void OnOpacityAnimated(float opacity) override {
+ element_animations_->SetOpacityMutated(tree_type_, opacity);
+ }
+
+ void OnTransformAnimated(const gfx::Transform& transform) override {
+ element_animations_->SetTransformMutated(tree_type_, transform);
+ }
+
+ void OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) override {
+ element_animations_->SetScrollOffsetMutated(tree_type_, scroll_offset);
+ }
+
+ void OnAnimationWaitingForDeletion() override {
+ // TODO(loyso): implement it.
+ }
+
+ bool IsActive() const override { return tree_type_ == LayerTreeType::ACTIVE; }
+
+ private:
+ ElementAnimations* element_animations_;
+ const LayerTreeType tree_type_;
+
+ DISALLOW_COPY_AND_ASSIGN(ValueObserver);
+};
+
+scoped_ptr<ElementAnimations> ElementAnimations::Create(AnimationHost* host) {
+ return make_scoped_ptr(new ElementAnimations(host));
+}
+
+ElementAnimations::ElementAnimations(AnimationHost* host)
+ : players_list_(make_scoped_ptr(new PlayersList())), animation_host_(host) {
+ DCHECK(animation_host_);
+}
+
+ElementAnimations::~ElementAnimations() {
+ DCHECK(!layer_animation_controller_);
+}
+
+void ElementAnimations::CreateLayerAnimationController(int layer_id) {
+ DCHECK(layer_id);
+ DCHECK(!layer_animation_controller_);
+ DCHECK(animation_host_);
+
+ AnimationRegistrar* registrar = animation_host_->animation_registrar();
+ DCHECK(registrar);
+
+ layer_animation_controller_ =
+ registrar->GetAnimationControllerForId(layer_id);
+ layer_animation_controller_->SetAnimationRegistrar(registrar);
+ layer_animation_controller_->set_layer_animation_delegate(this);
+ layer_animation_controller_->set_value_provider(this);
+
+ DCHECK(animation_host_->mutator_host_client());
+ if (animation_host_->mutator_host_client()->IsLayerInTree(
+ layer_id, LayerTreeType::ACTIVE))
+ CreateActiveValueObserver();
+ if (animation_host_->mutator_host_client()->IsLayerInTree(
+ layer_id, LayerTreeType::PENDING))
+ CreatePendingValueObserver();
+}
+
+void ElementAnimations::DestroyLayerAnimationController() {
+ DCHECK(animation_host_);
+
+ DestroyPendingValueObserver();
+ DestroyActiveValueObserver();
+
+ if (layer_animation_controller_) {
+ layer_animation_controller_->remove_value_provider(this);
+ layer_animation_controller_->remove_layer_animation_delegate(this);
+ layer_animation_controller_->SetAnimationRegistrar(nullptr);
+ layer_animation_controller_ = nullptr;
+ }
+}
+
+void ElementAnimations::LayerRegistered(int layer_id, LayerTreeType tree_type) {
+ DCHECK(layer_animation_controller_);
+ DCHECK_EQ(layer_animation_controller_->id(), layer_id);
+
+ if (tree_type == LayerTreeType::ACTIVE) {
+ if (!active_value_observer_)
+ CreateActiveValueObserver();
+ } else {
+ if (!pending_value_observer_)
+ CreatePendingValueObserver();
+ }
+}
+
+void ElementAnimations::LayerUnregistered(int layer_id,
+ LayerTreeType tree_type) {
+ DCHECK_EQ(this->layer_id(), layer_id);
+ tree_type == LayerTreeType::ACTIVE ? DestroyActiveValueObserver()
+ : DestroyPendingValueObserver();
+}
+
+void ElementAnimations::AddPlayer(AnimationPlayer* player) {
+ players_list_->Append(player);
+}
+
+void ElementAnimations::RemovePlayer(AnimationPlayer* player) {
+ for (PlayersListNode* node = players_list_->head();
+ node != players_list_->end(); node = node->next()) {
+ if (node->value() == player) {
+ node->RemoveFromList();
+ return;
+ }
+ }
+}
+
+bool ElementAnimations::IsEmpty() const {
+ return players_list_->empty();
+}
+
+void ElementAnimations::PushPropertiesTo(
+ ElementAnimations* element_animations_impl) {
+ DCHECK(layer_animation_controller_);
+ DCHECK(element_animations_impl->layer_animation_controller());
+
+ layer_animation_controller_->PushAnimationUpdatesTo(
+ element_animations_impl->layer_animation_controller());
+}
+
+void ElementAnimations::SetFilterMutated(LayerTreeType tree_type,
+ const FilterOperations& filters) {
+ DCHECK(layer_id());
+ DCHECK(animation_host());
+ DCHECK(animation_host()->mutator_host_client());
+ animation_host()->mutator_host_client()->SetLayerFilterMutated(
+ layer_id(), tree_type, filters);
+}
+
+void ElementAnimations::SetOpacityMutated(LayerTreeType tree_type,
+ float opacity) {
+ DCHECK(layer_id());
+ DCHECK(animation_host());
+ DCHECK(animation_host()->mutator_host_client());
+ animation_host()->mutator_host_client()->SetLayerOpacityMutated(
+ layer_id(), tree_type, opacity);
+}
+
+void ElementAnimations::SetTransformMutated(LayerTreeType tree_type,
+ const gfx::Transform& transform) {
+ DCHECK(layer_id());
+ DCHECK(animation_host());
+ DCHECK(animation_host()->mutator_host_client());
+ animation_host()->mutator_host_client()->SetLayerTransformMutated(
+ layer_id(), tree_type, transform);
+}
+
+void ElementAnimations::SetScrollOffsetMutated(
+ LayerTreeType tree_type,
+ const gfx::ScrollOffset& scroll_offset) {
+ DCHECK(layer_id());
+ DCHECK(animation_host());
+ DCHECK(animation_host()->mutator_host_client());
+ animation_host()->mutator_host_client()->SetLayerScrollOffsetMutated(
+ layer_id(), tree_type, scroll_offset);
+}
+
+void ElementAnimations::CreateActiveValueObserver() {
+ DCHECK(layer_animation_controller_);
+ DCHECK(!active_value_observer_);
+ active_value_observer_ =
+ make_scoped_ptr(new ValueObserver(this, LayerTreeType::ACTIVE));
+ layer_animation_controller_->AddValueObserver(active_value_observer_.get());
+}
+
+void ElementAnimations::DestroyActiveValueObserver() {
+ if (layer_animation_controller_ && active_value_observer_)
+ layer_animation_controller_->RemoveValueObserver(
+ active_value_observer_.get());
+ active_value_observer_ = nullptr;
+}
+
+void ElementAnimations::CreatePendingValueObserver() {
+ DCHECK(layer_animation_controller_);
+ DCHECK(!pending_value_observer_);
+ pending_value_observer_ =
+ make_scoped_ptr(new ValueObserver(this, LayerTreeType::PENDING));
+ layer_animation_controller_->AddValueObserver(pending_value_observer_.get());
+}
+
+void ElementAnimations::DestroyPendingValueObserver() {
+ if (layer_animation_controller_ && pending_value_observer_)
+ layer_animation_controller_->RemoveValueObserver(
+ pending_value_observer_.get());
+ pending_value_observer_ = nullptr;
+}
+
+void ElementAnimations::NotifyAnimationStarted(
+ base::TimeTicks monotonic_time,
+ Animation::TargetProperty target_property,
+ int group) {
+ for (PlayersListNode* node = players_list_->head();
+ node != players_list_->end(); node = node->next()) {
+ AnimationPlayer* player = node->value();
+ player->NotifyAnimationStarted(monotonic_time, target_property, group);
+ }
+}
+
+void ElementAnimations::NotifyAnimationFinished(
+ base::TimeTicks monotonic_time,
+ Animation::TargetProperty target_property,
+ int group) {
+ for (PlayersListNode* node = players_list_->head();
+ node != players_list_->end(); node = node->next()) {
+ AnimationPlayer* player = node->value();
+ player->NotifyAnimationFinished(monotonic_time, target_property, group);
+ }
+}
+
+gfx::ScrollOffset ElementAnimations::ScrollOffsetForAnimation() const {
+ // TODO(loyso): implement it.
+ return gfx::ScrollOffset();
+}
+
+} // namespace cc
« no previous file with comments | « cc/animation/element_animations.h ('k') | cc/animation/element_animations_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698