layer_animation_sequence.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iterator> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/animation/animation_id_provider.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_delegate.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationSequence::LayerAnimationSequence() 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : is_cyclic_(false), 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_element_(0), 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_(false), 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(0), 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(0.0) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationSequence::LayerAnimationSequence(LayerAnimationElement* element) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : is_cyclic_(false), 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_element_(0), 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_(false), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(0), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(0.0) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddElement(element); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationSequence::~LayerAnimationSequence() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachedFromSequence(this, true)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::Start(LayerAnimationDelegate* delegate) { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(start_time_ != base::TimeTicks()); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[0]->set_requested_start_time(start_time_); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[0]->Start(delegate, animation_group_id_); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::Progress(base::TimeTicks now, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationDelegate* delegate) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(start_time_ != base::TimeTicks()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool redraw_required = false; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elements_.empty()) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_element_ == 0) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_start_ = start_time_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (is_cyclic_ || last_element_ < elements_.size()) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->set_requested_start_time(last_start_); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!elements_[current_index]->IsFinished(now, &element_duration)) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the element we're passing finish. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_[current_index]->ProgressToEnd(delegate)) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redraw_required = true; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_start_ += element_duration; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++last_element_; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->last_progressed_fraction(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_index = last_element_ % elements_.size(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_cyclic_ || last_element_ < elements_.size()) { 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!elements_[current_index]->Started()) { 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) animation_group_id_ = cc::AnimationIdProvider::NextGroupId(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->Start(delegate, animation_group_id_); 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_[current_index]->Progress(now, delegate)) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redraw_required = true; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->last_progressed_fraction(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since the delegate may be deleted due to the notifications below, it is 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // important that we schedule a draw before sending them. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (redraw_required) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->ScheduleDrawForAnimation(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_cyclic_ && last_element_ == elements_.size()) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_element_ = 0; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_ = false; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_ = 0; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyEnded(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationSequence::IsFinished(base::TimeTicks time) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_cyclic_ || waiting_for_group_start_) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_element_ == 0) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_start_ = start_time_; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks current_start = last_start_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (current_index < elements_.size()) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->set_requested_start_time(current_start); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!elements_[current_index]->IsFinished(time, &element_duration)) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_start += element_duration; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++current_index; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (current_index == elements_.size()); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::ProgressToEnd(LayerAnimationDelegate* delegate) { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool redraw_required = false; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (current_index < elements_.size()) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_[current_index]->ProgressToEnd(delegate)) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) redraw_required = true; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->last_progressed_fraction(); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++current_index; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++last_element_; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (redraw_required) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->ScheduleDrawForAnimation(); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_cyclic_) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_element_ = 0; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_ = false; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_ = 0; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyEnded(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::GetTargetValue( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue* target) const { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_cyclic_) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = last_element_; i < elements_.size(); ++i) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[i]->GetTargetValue(target); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::Abort(LayerAnimationDelegate* delegate) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (current_index < elements_.size()) { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->Abort(delegate); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++current_index; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_element_ = 0; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_ = false; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyAborted(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::AddElement(LayerAnimationElement* element) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties_.insert(element->properties().begin(), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->properties().end()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_.push_back(make_linked_ptr(element)); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationSequence::HasConflictingProperty( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LayerAnimationElement::AnimatableProperties& other) const { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::AnimatableProperties intersection; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::insert_iterator<LayerAnimationElement::AnimatableProperties> ii( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intersection, intersection.begin()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set_intersection(properties_.begin(), properties_.end(), 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.begin(), other.end(), 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ii); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (intersection.size() > 0); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationSequence::IsFirstElementThreaded() const { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!elements_.empty()) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return elements_[0]->IsThreaded(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::AddObserver(LayerAnimationObserver* observer) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!observers_.HasObserver(observer)) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->AttachedToSequence(this); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::RemoveObserver(LayerAnimationObserver* observer) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->DetachedFromSequence(this, true); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::OnThreadedAnimationStarted( 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const cc::AnimationEvent& event) { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty() || event.group_id != animation_group_id_) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerAnimationElement::AnimatableProperties& element_properties = 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->properties(); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationElement::AnimatableProperty event_property = 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationElement::ToAnimatableProperty(event.target_property); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(element_properties.find(event_property) != element_properties.end()); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->set_effective_start_time( 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks::FromInternalValue( 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.monotonic_time * base::Time::kMicrosecondsPerSecond)); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::OnScheduled() { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyScheduled(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::OnAnimatorDestroyed() { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observers_.might_have_observers()) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<LayerAnimationObserver>::Iterator it(observers_); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationObserver* obs; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((obs = it.GetNext()) != NULL) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!obs->RequiresNotificationWhenAnimatorDestroyed()) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the observer, but do not allow notifications to be sent. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(obs); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obs->DetachedFromSequence(this, false); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)size_t LayerAnimationSequence::size() const { 246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return elements_.size(); 247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)LayerAnimationElement* LayerAnimationSequence::FirstElement() const { 250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (elements_.empty()) { 251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return NULL; 252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return elements_[0].get(); 255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::NotifyScheduled() { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLayerAnimationScheduled(this)); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::NotifyEnded() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLayerAnimationEnded(this)); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::NotifyAborted() { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLayerAnimationAborted(this)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)LayerAnimationElement* LayerAnimationSequence::CurrentElement() const { 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return elements_[current_index].get(); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 284