| Index: cc/layer_tree_host.cc
|
| diff --git a/cc/layer_tree_host.cc b/cc/layer_tree_host.cc
|
| index 25d3d2730df1cb0cbbc4cb3441053dc75405acdf..ce68eb2d230999a890edb4fb9013b7cf5a680809 100644
|
| --- a/cc/layer_tree_host.cc
|
| +++ b/cc/layer_tree_host.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/command_line.h"
|
| #include "base/debug/trace_event.h"
|
| #include "base/message_loop.h"
|
| +#include "base/stl_util.h"
|
| #include "cc/font_atlas.h"
|
| #include "cc/graphics_context.h"
|
| #include "cc/heads_up_display_layer.h"
|
| @@ -110,7 +111,6 @@ scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con
|
|
|
| LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSettings& settings)
|
| : m_animating(false)
|
| - , m_needsAnimateLayers(false)
|
| , m_client(client)
|
| , m_commitNumber(0)
|
| , m_renderingStats()
|
| @@ -157,6 +157,9 @@ LayerTreeHost::~LayerTreeHost()
|
| RateLimiterMap::iterator it = m_rateLimiters.begin();
|
| if (it != m_rateLimiters.end())
|
| it->second->stop();
|
| +
|
| + if (m_rootLayer)
|
| + m_rootLayer = 0;
|
| }
|
|
|
| void LayerTreeHost::setSurfaceReady()
|
| @@ -278,11 +281,6 @@ void LayerTreeHost::finishCommitOnImplThread(LayerTreeHostImpl* hostImpl)
|
| else
|
| hostImpl->setHudLayer(0);
|
|
|
| - // We may have added an animation during the tree sync. This will cause both layer tree hosts
|
| - // to visit their controllers.
|
| - if (rootLayer() && m_needsAnimateLayers)
|
| - hostImpl->setNeedsAnimateLayers();
|
| -
|
| hostImpl->setSourceFrameNumber(commitNumber());
|
| hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize());
|
| hostImpl->setDeviceScaleFactor(deviceScaleFactor());
|
| @@ -419,12 +417,6 @@ void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events,
|
| setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime);
|
| }
|
|
|
| -void LayerTreeHost::didAddAnimation()
|
| -{
|
| - m_needsAnimateLayers = true;
|
| - m_proxy->didAddAnimation();
|
| -}
|
| -
|
| void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer)
|
| {
|
| if (m_rootLayer == rootLayer)
|
| @@ -816,33 +808,16 @@ void LayerTreeHost::setDeviceScaleFactor(float deviceScaleFactor)
|
|
|
| void LayerTreeHost::animateLayers(base::TimeTicks time)
|
| {
|
| - if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers)
|
| + if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers.empty())
|
| return;
|
|
|
| TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers");
|
| - m_needsAnimateLayers = animateLayersRecursive(m_rootLayer.get(), time);
|
| -}
|
| -
|
| -bool LayerTreeHost::animateLayersRecursive(Layer* current, base::TimeTicks time)
|
| -{
|
| - if (!current)
|
| - return false;
|
|
|
| - bool subtreeNeedsAnimateLayers = false;
|
| - LayerAnimationController* currentController = current->layerAnimationController();
|
| double monotonicTime = (time - base::TimeTicks()).InSecondsF();
|
| - currentController->animate(monotonicTime, 0);
|
| -
|
| - // If the current controller still has an active animation, we must continue animating layers.
|
| - if (currentController->hasActiveAnimation())
|
| - subtreeNeedsAnimateLayers = true;
|
|
|
| - for (size_t i = 0; i < current->children().size(); ++i) {
|
| - if (animateLayersRecursive(current->children()[i].get(), time))
|
| - subtreeNeedsAnimateLayers = true;
|
| - }
|
| -
|
| - return subtreeNeedsAnimateLayers;
|
| + AnimationControllerSet copy = m_activeAnimationControllers;
|
| + for (AnimationControllerSet::iterator iter = copy.begin(); iter != copy.end(); ++iter)
|
| + (*iter)->animate(monotonicTime, 0);
|
| }
|
|
|
| void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& events, Layer* layer, base::Time wallClockTime)
|
| @@ -863,4 +838,16 @@ void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve
|
| setAnimationEventsRecursive(events, layer->children()[childIndex].get(), wallClockTime);
|
| }
|
|
|
| +void LayerTreeHost::Register(LayerAnimationController* controller) {
|
| + // Controllers register themselves when they have new animations. We need
|
| + // to commit in this case.
|
| + setNeedsCommit();
|
| + m_activeAnimationControllers.insert(controller);
|
| +}
|
| +
|
| +void LayerTreeHost::Unregister(LayerAnimationController* controller) {
|
| + if (ContainsKey(m_activeAnimationControllers, controller))
|
| + m_activeAnimationControllers.erase(controller);
|
| +}
|
| +
|
| } // namespace cc
|
|
|