compositor_animation_runner.cc 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/views/animation/compositor_animation_runner.h"
  5. #include "ui/views/widget/widget.h"
  6. namespace views {
  7. ////////////////////////////////////////////////////////////////////////////////
  8. // CompositorAnimationRunner
  9. //
  10. CompositorAnimationRunner::CompositorAnimationRunner(
  11. Widget* widget,
  12. const base::Location& location)
  13. : ui::CompositorAnimationObserver(location), widget_(widget) {
  14. widget_->AddObserver(this);
  15. }
  16. CompositorAnimationRunner::~CompositorAnimationRunner() {
  17. // Make sure we're not observing |compositor_|.
  18. if (widget_)
  19. OnWidgetDestroying(widget_);
  20. DCHECK(!compositor_ || !compositor_->HasAnimationObserver(this));
  21. CHECK(!IsInObserverList());
  22. }
  23. void CompositorAnimationRunner::Stop() {
  24. StopInternal();
  25. }
  26. void CompositorAnimationRunner::OnAnimationStep(base::TimeTicks timestamp) {
  27. if (timestamp - last_tick_ < min_interval_)
  28. return;
  29. last_tick_ = timestamp;
  30. Step(last_tick_);
  31. }
  32. void CompositorAnimationRunner::OnCompositingShuttingDown(
  33. ui::Compositor* compositor) {
  34. StopInternal();
  35. }
  36. void CompositorAnimationRunner::OnWidgetDestroying(Widget* widget) {
  37. StopInternal();
  38. widget_->RemoveObserver(this);
  39. widget_ = nullptr;
  40. }
  41. void CompositorAnimationRunner::OnStart(base::TimeDelta min_interval,
  42. base::TimeDelta elapsed) {
  43. if (!widget_)
  44. return;
  45. ui::Compositor* current_compositor = widget_->GetCompositor();
  46. if (!current_compositor) {
  47. StopInternal();
  48. return;
  49. }
  50. if (current_compositor != compositor_) {
  51. if (compositor_ && compositor_->HasAnimationObserver(this))
  52. compositor_->RemoveAnimationObserver(this);
  53. compositor_ = current_compositor;
  54. }
  55. last_tick_ = base::TimeTicks::Now() - elapsed;
  56. min_interval_ = min_interval;
  57. DCHECK(!compositor_->HasAnimationObserver(this));
  58. compositor_->AddAnimationObserver(this);
  59. }
  60. void CompositorAnimationRunner::StopInternal() {
  61. if (compositor_ && compositor_->HasAnimationObserver(this))
  62. compositor_->RemoveAnimationObserver(this);
  63. min_interval_ = base::TimeDelta::Max();
  64. compositor_ = nullptr;
  65. }
  66. } // namespace views