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

Side by Side Diff: cc/layer.cc

Issue 11598005: Ref count layer animation controllers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/layer.h ('k') | cc/layer_animation_controller.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layer.h" 5 #include "cc/layer.h"
6 6
7 #include "cc/active_animation.h" 7 #include "cc/active_animation.h"
8 #include "cc/animation_events.h" 8 #include "cc/animation_events.h"
9 #include "cc/layer_animation_controller.h" 9 #include "cc/layer_animation_controller.h"
10 #include "cc/layer_impl.h" 10 #include "cc/layer_impl.h"
(...skipping 14 matching lines...) Expand all
25 { 25 {
26 return make_scoped_refptr(new Layer()); 26 return make_scoped_refptr(new Layer());
27 } 27 }
28 28
29 Layer::Layer() 29 Layer::Layer()
30 : m_needsDisplay(false) 30 : m_needsDisplay(false)
31 , m_stackingOrderChanged(false) 31 , m_stackingOrderChanged(false)
32 , m_layerId(s_nextLayerId++) 32 , m_layerId(s_nextLayerId++)
33 , m_parent(0) 33 , m_parent(0)
34 , m_layerTreeHost(0) 34 , m_layerTreeHost(0)
35 , m_layerAnimationController(LayerAnimationController::create(this))
36 , m_scrollable(false) 35 , m_scrollable(false)
37 , m_shouldScrollOnMainThread(false) 36 , m_shouldScrollOnMainThread(false)
38 , m_haveWheelEventHandlers(false) 37 , m_haveWheelEventHandlers(false)
39 , m_nonFastScrollableRegionChanged(false) 38 , m_nonFastScrollableRegionChanged(false)
40 , m_touchEventHandlerRegionChanged(false) 39 , m_touchEventHandlerRegionChanged(false)
41 , m_anchorPoint(0.5, 0.5) 40 , m_anchorPoint(0.5, 0.5)
42 , m_backgroundColor(0) 41 , m_backgroundColor(0)
43 , m_opacity(1.0) 42 , m_opacity(1.0)
44 , m_anchorPointZ(0) 43 , m_anchorPointZ(0)
45 , m_isContainerForFixedPositionLayers(false) 44 , m_isContainerForFixedPositionLayers(false)
(...skipping 11 matching lines...) Expand all
57 , m_automaticallyComputeRasterScale(false) 56 , m_automaticallyComputeRasterScale(false)
58 , m_boundsContainPageScale(false) 57 , m_boundsContainPageScale(false)
59 , m_layerAnimationDelegate(0) 58 , m_layerAnimationDelegate(0)
60 , m_layerScrollClient(0) 59 , m_layerScrollClient(0)
61 { 60 {
62 if (m_layerId < 0) { 61 if (m_layerId < 0) {
63 s_nextLayerId = 1; 62 s_nextLayerId = 1;
64 m_layerId = s_nextLayerId++; 63 m_layerId = s_nextLayerId++;
65 } 64 }
66 65
67 addLayerAnimationObserver(m_layerAnimationController.get()); 66 m_layerAnimationController = LayerAnimationController::create(m_layerId);
67 m_layerAnimationController->addObserver(this);
68 addLayerAnimationEventObserver(m_layerAnimationController.get());
68 } 69 }
69 70
70 Layer::~Layer() 71 Layer::~Layer()
71 { 72 {
72 // Our parent should be holding a reference to us so there should be no 73 // Our parent should be holding a reference to us so there should be no
73 // way for us to be destroyed while we still have a parent. 74 // way for us to be destroyed while we still have a parent.
74 DCHECK(!parent()); 75 DCHECK(!parent());
75 76
77 m_layerAnimationController->removeObserver(this);
78
76 // Remove the parent reference from all children. 79 // Remove the parent reference from all children.
77 removeAllChildren(); 80 removeAllChildren();
78 } 81 }
79 82
80 void Layer::setLayerTreeHost(LayerTreeHost* host) 83 void Layer::setLayerTreeHost(LayerTreeHost* host)
81 { 84 {
82 if (m_layerTreeHost == host) 85 if (m_layerTreeHost == host)
83 return; 86 return;
84 87
85 m_layerTreeHost = host; 88 m_layerTreeHost = host;
86 89
87 for (size_t i = 0; i < m_children.size(); ++i) 90 for (size_t i = 0; i < m_children.size(); ++i)
88 m_children[i]->setLayerTreeHost(host); 91 m_children[i]->setLayerTreeHost(host);
89 92
90 if (m_maskLayer) 93 if (m_maskLayer)
91 m_maskLayer->setLayerTreeHost(host); 94 m_maskLayer->setLayerTreeHost(host);
92 if (m_replicaLayer) 95 if (m_replicaLayer)
93 m_replicaLayer->setLayerTreeHost(host); 96 m_replicaLayer->setLayerTreeHost(host);
94 97
95 // If this layer already has active animations, the host needs to be notifie d. 98 m_layerAnimationController->setAnimationRegistrar(host ? host->animationRegi strar() : 0);
96 if (host && m_layerAnimationController->hasActiveAnimation()) 99
97 host->didAddAnimation(); 100 if (host && m_layerAnimationController->hasAnyAnimation())
101 host->setNeedsCommit();
98 } 102 }
99 103
100 void Layer::setNeedsCommit() 104 void Layer::setNeedsCommit()
101 { 105 {
102 if (m_layerTreeHost) 106 if (m_layerTreeHost)
103 m_layerTreeHost->setNeedsCommit(); 107 m_layerTreeHost->setNeedsCommit();
104 } 108 }
105 109
106 void Layer::setNeedsFullTreeSync() 110 void Layer::setNeedsFullTreeSync()
107 { 111 {
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 } 370 }
367 371
368 void Layer::setOpacity(float opacity) 372 void Layer::setOpacity(float opacity)
369 { 373 {
370 if (m_opacity == opacity) 374 if (m_opacity == opacity)
371 return; 375 return;
372 m_opacity = opacity; 376 m_opacity = opacity;
373 setNeedsCommit(); 377 setNeedsCommit();
374 } 378 }
375 379
380 float Layer::opacity() const
381 {
382 return m_opacity;
383 }
384
376 bool Layer::opacityIsAnimating() const 385 bool Layer::opacityIsAnimating() const
377 { 386 {
378 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Opac ity); 387 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Opac ity);
379 } 388 }
380 389
381 void Layer::setContentsOpaque(bool opaque) 390 void Layer::setContentsOpaque(bool opaque)
382 { 391 {
383 if (m_contentsOpaque == opaque) 392 if (m_contentsOpaque == opaque)
384 return; 393 return;
385 m_contentsOpaque = opaque; 394 m_contentsOpaque = opaque;
(...skipping 17 matching lines...) Expand all
403 } 412 }
404 413
405 void Layer::setTransform(const gfx::Transform& transform) 414 void Layer::setTransform(const gfx::Transform& transform)
406 { 415 {
407 if (m_transform == transform) 416 if (m_transform == transform)
408 return; 417 return;
409 m_transform = transform; 418 m_transform = transform;
410 setNeedsCommit(); 419 setNeedsCommit();
411 } 420 }
412 421
422 const gfx::Transform& Layer::transform() const
423 {
424 return m_transform;
425 }
426
413 bool Layer::transformIsAnimating() const 427 bool Layer::transformIsAnimating() const
414 { 428 {
415 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Tran sform); 429 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Tran sform);
416 } 430 }
417 431
418 void Layer::setScrollOffset(gfx::Vector2d scrollOffset) 432 void Layer::setScrollOffset(gfx::Vector2d scrollOffset)
419 { 433 {
420 if (m_scrollOffset == scrollOffset) 434 if (m_scrollOffset == scrollOffset)
421 return; 435 return;
422 m_scrollOffset = scrollOffset; 436 m_scrollOffset = scrollOffset;
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 DCHECK(!m_drawProperties.render_surface); 710 DCHECK(!m_drawProperties.render_surface);
697 m_drawProperties.render_surface = make_scoped_ptr(new RenderSurface(this)); 711 m_drawProperties.render_surface = make_scoped_ptr(new RenderSurface(this));
698 m_drawProperties.render_target = this; 712 m_drawProperties.render_target = this;
699 } 713 }
700 714
701 int Layer::id() const 715 int Layer::id() const
702 { 716 {
703 return m_layerId; 717 return m_layerId;
704 } 718 }
705 719
706 float Layer::opacity() const 720 void Layer::OnOpacityAnimated(float opacity)
707 {
708 return m_opacity;
709 }
710
711 void Layer::setOpacityFromAnimation(float opacity)
712 { 721 {
713 // This is called due to an ongoing accelerated animation. Since this animat ion is 722 // This is called due to an ongoing accelerated animation. Since this animat ion is
714 // also being run on the impl thread, there is no need to request a commit t o push 723 // also being run on the impl thread, there is no need to request a commit t o push
715 // this value over, so set the value directly rather than calling setOpacity . 724 // this value over, so set the value directly rather than calling setOpacity .
716 m_opacity = opacity; 725 m_opacity = opacity;
717 } 726 }
718 727
719 const gfx::Transform& Layer::transform() const 728 void Layer::OnTransformAnimated(const gfx::Transform& transform)
720 {
721 return m_transform;
722 }
723
724 void Layer::setTransformFromAnimation(const gfx::Transform& transform)
725 { 729 {
726 // This is called due to an ongoing accelerated animation. Since this animat ion is 730 // This is called due to an ongoing accelerated animation. Since this animat ion is
727 // also being run on the impl thread, there is no need to request a commit t o push 731 // also being run on the impl thread, there is no need to request a commit t o push
728 // this value over, so set this value directly rather than calling setTransf orm. 732 // this value over, so set this value directly rather than calling setTransf orm.
729 m_transform = transform; 733 m_transform = transform;
730 } 734 }
731 735
732 bool Layer::addAnimation(scoped_ptr <ActiveAnimation> animation) 736 bool Layer::addAnimation(scoped_ptr <ActiveAnimation> animation)
733 { 737 {
734 // WebCore currently assumes that accelerated animations will start soon 738 // WebCore currently assumes that accelerated animations will start soon
735 // after the animation is added. However we cannot guarantee that if we do 739 // after the animation is added. However we cannot guarantee that if we do
736 // not have a layerTreeHost that will setNeedsCommit(). 740 // not have a layerTreeHost that will setNeedsCommit().
737 // Unfortunately, the fix below to guarantee correctness causes performance 741 // Unfortunately, the fix below to guarantee correctness causes performance
738 // regressions on Android, since Android has shipped for a long time 742 // regressions on Android, since Android has shipped for a long time
739 // with all animations accelerated. For this reason, we will live with 743 // with all animations accelerated. For this reason, we will live with
740 // this bug only on Android until the bug is fixed. 744 // this bug only on Android until the bug is fixed.
741 // http://crbug.com/129683 745 // http://crbug.com/129683
742 #if !defined(OS_ANDROID) 746 #if !defined(OS_ANDROID)
743 if (!m_layerTreeHost) 747 if (!m_layerTreeHost)
744 return false; 748 return false;
745 749
746 if (!m_layerTreeHost->settings().acceleratedAnimationEnabled) 750 if (!m_layerTreeHost->settings().acceleratedAnimationEnabled)
747 return false; 751 return false;
748 #endif 752 #endif
749 753
750 m_layerAnimationController->addAnimation(animation.Pass()); 754 m_layerAnimationController->addAnimation(animation.Pass());
751 if (m_layerTreeHost) { 755 setNeedsCommit();
752 m_layerTreeHost->didAddAnimation();
753 setNeedsCommit();
754 }
755 return true; 756 return true;
756 } 757 }
757 758
758 void Layer::pauseAnimation(int animationId, double timeOffset) 759 void Layer::pauseAnimation(int animationId, double timeOffset)
759 { 760 {
760 m_layerAnimationController->pauseAnimation(animationId, timeOffset); 761 m_layerAnimationController->pauseAnimation(animationId, timeOffset);
761 setNeedsCommit(); 762 setNeedsCommit();
762 } 763 }
763 764
764 void Layer::removeAnimation(int animationId) 765 void Layer::removeAnimation(int animationId)
765 { 766 {
766 m_layerAnimationController->removeAnimation(animationId); 767 m_layerAnimationController->removeAnimation(animationId);
767 setNeedsCommit(); 768 setNeedsCommit();
768 } 769 }
769 770
770 void Layer::suspendAnimations(double monotonicTime) 771 void Layer::suspendAnimations(double monotonicTime)
771 { 772 {
772 m_layerAnimationController->suspendAnimations(monotonicTime); 773 m_layerAnimationController->suspendAnimations(monotonicTime);
773 setNeedsCommit(); 774 setNeedsCommit();
774 } 775 }
775 776
776 void Layer::resumeAnimations(double monotonicTime) 777 void Layer::resumeAnimations(double monotonicTime)
777 { 778 {
778 m_layerAnimationController->resumeAnimations(monotonicTime); 779 m_layerAnimationController->resumeAnimations(monotonicTime);
779 setNeedsCommit(); 780 setNeedsCommit();
780 } 781 }
781 782
782 void Layer::setLayerAnimationController(scoped_ptr<LayerAnimationController> lay erAnimationController) 783 void Layer::setLayerAnimationController(scoped_refptr<LayerAnimationController> layerAnimationController)
783 { 784 {
784 if (m_layerAnimationController) 785 removeLayerAnimationEventObserver(m_layerAnimationController.get());
785 removeLayerAnimationObserver(m_layerAnimationController.get()); 786 m_layerAnimationController->removeObserver(this);
786 787 m_layerAnimationController = layerAnimationController;
787 m_layerAnimationController = layerAnimationController.Pass(); 788 m_layerAnimationController->setForceSync();
788 if (m_layerAnimationController) { 789 m_layerAnimationController->addObserver(this);
789 m_layerAnimationController->setClient(this); 790 addLayerAnimationEventObserver(m_layerAnimationController.get());
790 m_layerAnimationController->setForceSync();
791 addLayerAnimationObserver(m_layerAnimationController.get());
792 }
793 setNeedsCommit(); 791 setNeedsCommit();
794 } 792 }
795 793
796 scoped_ptr<LayerAnimationController> Layer::releaseLayerAnimationController() 794 scoped_refptr<LayerAnimationController> Layer::releaseLayerAnimationController()
797 { 795 {
798 scoped_ptr<LayerAnimationController> toReturn = m_layerAnimationController.P ass(); 796 m_layerAnimationController->removeObserver(this);
799 m_layerAnimationController = LayerAnimationController::create(this); 797 scoped_refptr<LayerAnimationController> toReturn = m_layerAnimationControlle r;
800 return toReturn.Pass(); 798 m_layerAnimationController = LayerAnimationController::create(id());
799 m_layerAnimationController->addObserver(this);
800 return toReturn;
801 } 801 }
802 802
803 bool Layer::hasActiveAnimation() const 803 bool Layer::hasActiveAnimation() const
804 { 804 {
805 return m_layerAnimationController->hasActiveAnimation(); 805 return m_layerAnimationController->hasActiveAnimation();
806 } 806 }
807 807
808 void Layer::notifyAnimationStarted(const AnimationEvent& event, double wallClock Time) 808 void Layer::notifyAnimationStarted(const AnimationEvent& event, double wallClock Time)
809 { 809 {
810 FOR_EACH_OBSERVER(LayerAnimationObserver, m_layerAnimationObservers, 810 FOR_EACH_OBSERVER(LayerAnimationEventObserver, m_layerAnimationObservers,
811 OnAnimationStarted(event)); 811 OnAnimationStarted(event));
812 if (m_layerAnimationDelegate) 812 if (m_layerAnimationDelegate)
813 m_layerAnimationDelegate->notifyAnimationStarted(wallClockTime); 813 m_layerAnimationDelegate->notifyAnimationStarted(wallClockTime);
814 } 814 }
815 815
816 void Layer::notifyAnimationFinished(double wallClockTime) 816 void Layer::notifyAnimationFinished(double wallClockTime)
817 { 817 {
818 if (m_layerAnimationDelegate) 818 if (m_layerAnimationDelegate)
819 m_layerAnimationDelegate->notifyAnimationFinished(wallClockTime); 819 m_layerAnimationDelegate->notifyAnimationFinished(wallClockTime);
820 } 820 }
821 821
822 void Layer::addLayerAnimationObserver(LayerAnimationObserver* animationObserver) 822 void Layer::addLayerAnimationEventObserver(LayerAnimationEventObserver* animatio nObserver)
823 { 823 {
824 if (!m_layerAnimationObservers.HasObserver(animationObserver)) 824 if (!m_layerAnimationObservers.HasObserver(animationObserver))
825 m_layerAnimationObservers.AddObserver(animationObserver); 825 m_layerAnimationObservers.AddObserver(animationObserver);
826 } 826 }
827 827
828 void Layer::removeLayerAnimationObserver(LayerAnimationObserver* animationObserv er) 828 void Layer::removeLayerAnimationEventObserver(LayerAnimationEventObserver* anima tionObserver)
829 { 829 {
830 m_layerAnimationObservers.RemoveObserver(animationObserver); 830 m_layerAnimationObservers.RemoveObserver(animationObserver);
831 } 831 }
832 832
833 Region Layer::visibleContentOpaqueRegion() const 833 Region Layer::visibleContentOpaqueRegion() const
834 { 834 {
835 if (contentsOpaque()) 835 if (contentsOpaque())
836 return visibleContentRect(); 836 return visibleContentRect();
837 return Region(); 837 return Region();
838 } 838 }
839 839
840 ScrollbarLayer* Layer::toScrollbarLayer() 840 ScrollbarLayer* Layer::toScrollbarLayer()
841 { 841 {
842 return 0; 842 return 0;
843 } 843 }
844 844
845 void sortLayers(std::vector<scoped_refptr<Layer> >::iterator, std::vector<scoped _refptr<Layer> >::iterator, void*) 845 void sortLayers(std::vector<scoped_refptr<Layer> >::iterator, std::vector<scoped _refptr<Layer> >::iterator, void*)
846 { 846 {
847 // Currently we don't use z-order to decide what to paint, so there's no nee d to actually sort Layers. 847 // Currently we don't use z-order to decide what to paint, so there's no nee d to actually sort Layers.
848 } 848 }
849 849
850 } // namespace cc 850 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layer.h ('k') | cc/layer_animation_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698