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" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_delegate.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_observer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationSequence::LayerAnimationSequence() 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : is_cyclic_(false), 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_element_(0), 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_(false), 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(0), 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(0.0) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationSequence::LayerAnimationSequence(LayerAnimationElement* element) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : is_cyclic_(false), 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_element_(0), 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_(false), 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(0), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(0.0) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddElement(element); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationSequence::~LayerAnimationSequence() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachedFromSequence(this, true)); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::Start(LayerAnimationDelegate* delegate) { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(start_time_ != base::TimeTicks()); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[0]->set_requested_start_time(start_time_); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[0]->Start(delegate, animation_group_id_); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::Progress(base::TimeTicks now, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationDelegate* delegate) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(start_time_ != base::TimeTicks()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool redraw_required = false; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elements_.empty()) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_element_ == 0) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_start_ = start_time_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (is_cyclic_ || last_element_ < elements_.size()) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->set_requested_start_time(last_start_); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!elements_[current_index]->IsFinished(now, &element_duration)) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the element we're passing finish. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_[current_index]->ProgressToEnd(delegate)) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redraw_required = true; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_start_ += element_duration; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++last_element_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->last_progressed_fraction(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_index = last_element_ % elements_.size(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_cyclic_ || last_element_ < elements_.size()) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!elements_[current_index]->Started()) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->Start(delegate, animation_group_id_); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_[current_index]->Progress(now, delegate)) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redraw_required = true; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->last_progressed_fraction(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since the delegate may be deleted due to the notifications below, it is 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // important that we schedule a draw before sending them. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (redraw_required) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->ScheduleDrawForAnimation(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_cyclic_ && last_element_ == elements_.size()) { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_element_ = 0; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_ = false; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_ = 0; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyEnded(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationSequence::IsFinished(base::TimeTicks time) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_cyclic_ || waiting_for_group_start_) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_element_ == 0) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_start_ = start_time_; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks current_start = last_start_; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta element_duration; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (current_index < elements_.size()) { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->set_requested_start_time(current_start); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!elements_[current_index]->IsFinished(time, &element_duration)) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_start += element_duration; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++current_index; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (current_index == elements_.size()); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::ProgressToEnd(LayerAnimationDelegate* delegate) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool redraw_required = false; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (current_index < elements_.size()) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_[current_index]->ProgressToEnd(delegate)) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) redraw_required = true; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->last_progressed_fraction(); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++current_index; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++last_element_; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (redraw_required) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->ScheduleDrawForAnimation(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_cyclic_) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_element_ = 0; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_ = false; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_ = 0; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyEnded(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::GetTargetValue( 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::TargetValue* target) const { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_cyclic_) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = last_element_; i < elements_.size(); ++i) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[i]->GetTargetValue(target); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::Abort(LayerAnimationDelegate* delegate) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (current_index < elements_.size()) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->Abort(delegate); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++current_index; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_element_ = 0; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_group_start_ = false; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyAborted(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::AddElement(LayerAnimationElement* element) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties_.insert(element->properties().begin(), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element->properties().end()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_.push_back(make_linked_ptr(element)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationSequence::HasConflictingProperty( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LayerAnimationElement::AnimatableProperties& other) const { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::AnimatableProperties intersection; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::insert_iterator<LayerAnimationElement::AnimatableProperties> ii( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intersection, intersection.begin()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set_intersection(properties_.begin(), properties_.end(), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.begin(), other.end(), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ii); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (intersection.size() > 0); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationSequence::IsFirstElementThreaded() const { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!elements_.empty()) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return elements_[0]->IsThreaded(); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::AddObserver(LayerAnimationObserver* observer) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!observers_.HasObserver(observer)) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->AttachedToSequence(this); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::RemoveObserver(LayerAnimationObserver* observer) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->DetachedFromSequence(this, true); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationSequence::OnThreadedAnimationStarted( 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const cc::AnimationEvent& event) { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty() || event.group_id != animation_group_id_) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerAnimationElement::AnimatableProperties& element_properties = 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->properties(); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationElement::AnimatableProperty event_property = 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationElement::ToAnimatableProperty(event.target_property); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(element_properties.find(event_property) != element_properties.end()); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[current_index]->set_effective_start_time( 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks::FromInternalValue( 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.monotonic_time * base::Time::kMicrosecondsPerSecond)); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::OnScheduled() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyScheduled(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::OnAnimatorDestroyed() { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observers_.might_have_observers()) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<LayerAnimationObserver>::Iterator it(observers_); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationObserver* obs; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((obs = it.GetNext()) != NULL) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!obs->RequiresNotificationWhenAnimatorDestroyed()) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the observer, but do not allow notifications to be sent. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(obs); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obs->DetachedFromSequence(this, false); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::NotifyScheduled() { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLayerAnimationScheduled(this)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::NotifyEnded() { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLayerAnimationEnded(this)); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationSequence::NotifyAborted() { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(LayerAnimationObserver, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLayerAnimationAborted(this)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement* LayerAnimationSequence::CurrentElement() { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.empty()) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t current_index = last_element_ % elements_.size(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return elements_[current_index].get(); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 269