layer_tree_impl.cc revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_id_provider.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/keyframed_animation_curve.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller.h" 12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/pinch_zoom_scrollbar.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : layer_tree_host_impl_(layer_tree_host_impl), 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source_frame_number_(-1), 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hud_layer_(0), 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_(NULL), 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) currently_scrolling_layer_(NULL), 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_(NULL), 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) background_color_(0), 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_transparent_background_(false), 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_horizontal_layer_id_(Layer::INVALID_ID), 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_vertical_layer_id_(Layer::INVALID_ID), 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor_(1), 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta_(1), 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sent_page_scale_delta_(1), 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_page_scale_factor_(0), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_page_scale_factor_(0), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_(0), 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_(false), 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_(false), 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_update_draw_properties_(true), 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_full_tree_sync_(true) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeImpl::~LayerTreeImpl() { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Need to explicitly clear the tree prior to destroying this so that 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_.reset(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static LayerImpl* FindRootScrollLayerRecursive(LayerImpl* layer) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->scrollable()) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* found = FindRootScrollLayerRecursive(layer->children()[i]); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate(NULL); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_ = layer.Pass(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = NULL; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_ = NULL; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::FindRootScrollLayer() { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_ = FindRootScrollLayerRecursive(root_layer_.get()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) { 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate( 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_layer_ && scrolling_layer_id_from_previous_tree_) { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree( 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_.get(), 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 0; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear all data structures that have direct references to the layer tree. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate(NULL); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_ = NULL; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = NULL; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list_.clear(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_needs_update_draw_properties(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_layer_.Pass(); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) target_tree->SetLatencyInfo(latency_info_); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_.Clear(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPageScaleFactorAndLimits( 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor(), min_page_scale_factor(), max_page_scale_factor()); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPageScaleDelta( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->page_scale_delta() / target_tree->sent_page_scale_delta()); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_sent_page_scale_delta(1); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should match the property synchronization in 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHost::finishCommitOnImplThread(). 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_source_frame_number(source_frame_number()); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_background_color(background_color()); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_has_transparent_background(has_transparent_background()); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ContentsTexturesPurged()) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetContentsTexturesPurged(); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->ResetContentsTexturesPurged(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ViewportSizeInvalid()) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetViewportSizeInvalid(); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->ResetViewportSizeInvalid(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (hud_layer()) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostCommon::FindLayerInSubtree( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->root_layer(), hud_layer()->id()))); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_hud_layer(NULL); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPinchZoomHorizontalLayerId( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_horizontal_layer_id_); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPinchZoomVerticalLayerId( 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_vertical_layer_id_); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::RootScrollLayer() const { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsActiveTree()); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::RootClipLayer() const { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsActiveTree()); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return currently_scrolling_layer_; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (currently_scrolling_layer_ == layer) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (currently_scrolling_layer_ && 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_->scrollbar_animation_controller()) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_->scrollbar_animation_controller()-> 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DidScrollGestureEnd(CurrentFrameTimeTicks()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = layer; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer && layer->scrollbar_animation_controller()) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->scrollbar_animation_controller()->DidScrollGestureBegin(); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ClearCurrentlyScrollingLayer() { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCurrentlyScrollingLayer(NULL); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 0; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float min_page_scale_factor, float max_page_scale_factor) { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_scale_factor) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_page_scale_factor_ = min_page_scale_factor; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_page_scale_factor_ = max_page_scale_factor; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor_ = page_scale_factor; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPageScaleDelta(float delta) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clamp to the current min/max limits. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float total = page_scale_factor_ * delta; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (min_page_scale_factor_ && total < min_page_scale_factor_) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta = min_page_scale_factor_ / page_scale_factor_; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (max_page_scale_factor_ && total > max_page_scale_factor_) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta = max_page_scale_factor_ / page_scale_factor_; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delta == page_scale_delta_) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta_ = delta; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsActiveTree()) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_tree->SetPageScaleDelta( 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) page_scale_delta_ / sent_page_scale_delta_); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_needs_update_draw_properties(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::ScaleSize(layer_tree_host_impl_->VisibleViewportSize(), 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.0f / total_page_scale_factor()); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UpdateMaxScrollOffset() { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_scroll_layer_ || !root_scroll_layer_->children().size()) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() - 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF(ScrollableViewportSize()).bottom_right(); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The viewport may be larger than the contents in some cases, such as 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // having a vertical scrollbar but no horizontal overflow. 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_scroll.ClampToMin(gfx::Vector2dF()); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll)); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UpdateSolidColorScrollbars() { 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(settings().solid_color_scrollbars); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_scroll = RootScrollLayer(); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(root_scroll); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsActiveTree()); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF scrollable_viewport( 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointAtOffsetFromOrigin(root_scroll->TotalScrollOffset()), 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollableViewportSize()); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float vertical_adjust = 0.0f; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (RootClipLayer()) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertical_adjust = layer_tree_host_impl_->VisibleViewportSize().height() - 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootClipLayer()->bounds().height(); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ScrollbarLayerImpl* horiz = root_scroll->horizontal_scrollbar_layer()) { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) horiz->set_vertical_adjust(vertical_adjust); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) horiz->SetViewportWithinScrollableArea(scrollable_viewport, 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollableSize()); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ScrollbarLayerImpl* vertical = root_scroll->vertical_scrollbar_layer()) { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertical->set_vertical_adjust(vertical_adjust); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertical->SetViewportWithinScrollableArea(scrollable_viewport, 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollableSize()); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::UpdateDrawProperties() { 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsActiveTree() && RootScrollLayer() && RootClipLayer()) 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateRootScrollLayerSizeDelta(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (settings().solid_color_scrollbars && 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsActiveTree() && 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootScrollLayer()) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSolidColorScrollbars(); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The top controls manager is incompatible with the WebKit-created cliprect 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because it can bring into view a larger amount of content when it 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hides. It's safe to deactivate the clip rect if no non-overlay scrollbars 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are present. 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (RootClipLayer() && layer_tree_host_impl_->top_controls_manager()) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootClipLayer()->SetMasksToBounds(false); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_update_draw_properties_ = false; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list_.clear(); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For max_texture_size. 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_impl_->renderer()) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_layer()) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT1("cc", 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeImpl::UpdateDrawProperties", 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "IsActive", 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IsActiveTree()); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostCommon::CalculateDrawProperties( 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer(), 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_viewport_size(), 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor(), 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_page_scale_factor(), 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_, 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MaxTextureSize(), 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings().can_use_lcd_text, 302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings().layer_transforms_should_scale_layer_contents, 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &render_surface_layer_list_); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!needs_update_draw_properties_) << 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "CalcDrawProperties should not set_needs_update_draw_properties()"; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void ClearRenderSurfacesOnLayerImplRecursive(LayerImpl* current) { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(current); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < current->children().size(); ++i) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearRenderSurfacesOnLayerImplRecursive(current->children()[i]); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current->ClearRenderSurface(); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ClearRenderSurfaces() { 318a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (root_layer() == NULL) { 319a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(render_surface_layer_list_.empty()); 320a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return; 321a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearRenderSurfacesOnLayerImplRecursive(root_layer()); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list_.clear(); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_needs_update_draw_properties(); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::AreVisibleResourcesReady() const { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeImpl::AreVisibleResourcesReady"); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef LayerIterator<LayerImpl, 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorActions::BackToFront> LayerIteratorType; 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerIteratorType it = LayerIteratorType::Begin( 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &render_surface_layer_list_); it != end; ++it) { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it.represents_itself() && !(*it)->AreVisibleResourcesReady()) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If this assert triggers, then the list is dirty. 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!needs_update_draw_properties_); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_surface_layer_list_; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size LayerTreeImpl::ScrollableSize() const { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_->children()[0]->bounds(); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::LayerById(int id) { 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIdMap::iterator iter = layer_id_map_.find(id); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter != layer_id_map_.end() ? iter->second : NULL; 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!LayerById(layer->id())); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_id_map_[layer->id()] = layer; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(LayerById(layer->id())); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_id_map_.erase(layer->id()); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPersistedState(LayerTreeImpl* pending_tree) { 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; 373a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerImpl* pending_scrolling_layer_twin = NULL; 374a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (pending_tree->root_layer()) { 375a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) pending_scrolling_layer_twin = 376a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostCommon::FindLayerInSubtree(pending_tree->root_layer(), id); 377a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 378a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) pending_tree->SetCurrentlyScrollingLayer(pending_scrolling_layer_twin); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void DidBecomeActiveRecursive(LayerImpl* layer) { 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->DidBecomeActive(); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidBecomeActiveRecursive(layer->children()[i]); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::DidBecomeActive() { 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_layer()) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidBecomeActiveRecursive(root_layer()); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindRootScrollLayer(); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Main thread scrolls do not get handled in LayerTreeHostImpl, so after 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // each commit (and after the root scroll layer has its max scroll offset 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // set), we need to update pinch zoom scrollbars. 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdatePinchZoomScrollbars(); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ContentsTexturesPurged() const { 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return contents_textures_purged_; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetContentsTexturesPurged() { 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_ = true; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetContentsTexturesPurged() { 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_ = false; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ViewportSizeInvalid() const { 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return viewport_size_invalid_; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetViewportSizeInvalid() { 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_ = true; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetViewportSizeInvalid() { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_ = false; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Proxy* LayerTreeImpl::proxy() const { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->proxy(); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeSettings& LayerTreeImpl::settings() const { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->settings(); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const RendererCapabilities& LayerTreeImpl::GetRendererCapabilities() const { 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->GetRendererCapabilities(); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OutputSurface* LayerTreeImpl::output_surface() const { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->output_surface(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceProvider* LayerTreeImpl::resource_provider() const { 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->resource_provider(); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TileManager* LayerTreeImpl::tile_manager() const { 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->tile_manager(); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FrameRateCounter* LayerTreeImpl::frame_rate_counter() const { 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->fps_counter(); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PaintTimeCounter* LayerTreeImpl::paint_time_counter() const { 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->paint_time_counter(); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MemoryHistory* LayerTreeImpl::memory_history() const { 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->memory_history(); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsActiveTree() const { 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->active_tree() == this; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsPendingTree() const { 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->pending_tree() == this; 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsRecycleTree() const { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->recycle_tree() == this; 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindActiveTreeLayerById(int id) { 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* tree = layer_tree_host_impl_->active_tree(); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tree) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tree->LayerById(id); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindPendingTreeLayerById(int id) { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* tree = layer_tree_host_impl_->pending_tree(); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tree) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tree->LayerById(id); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int LayerTreeImpl::MaxTextureSize() const { 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->GetRendererCapabilities().max_texture_size; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::PinchGestureActive() const { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->pinch_gesture_active(); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::TimeTicks LayerTreeImpl::CurrentFrameTimeTicks() const { 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return layer_tree_host_impl_->CurrentFrameTimeTicks(); 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::Time LayerTreeImpl::CurrentFrameTime() const { 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->CurrentFrameTime(); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsCommit() { 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->SetNeedsCommit(); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsRedraw() { 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->SetNeedsRedraw(); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeDebugState& LayerTreeImpl::debug_state() const { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->debug_state(); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float LayerTreeImpl::device_scale_factor() const { 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->device_scale_factor(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size LayerTreeImpl::device_viewport_size() const { 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->device_viewport_size(); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string LayerTreeImpl::layer_tree_as_text() const { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->LayerTreeAsText(); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory* LayerTreeImpl::debug_rect_history() const { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->debug_rect_history(); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AnimationRegistrar* LayerTreeImpl::animationRegistrar() const { 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->animation_registrar(); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> LayerTreeImpl::AsValue() const { 537b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 538b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) TracedValue::MakeDictIntoImplicitSnapshot( 539b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state.get(), "cc::LayerTreeImpl", this); 540b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 541b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("root_layer", root_layer_->AsValue().release()); 542b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 543b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<base::ListValue> render_surface_layer_list(new base::ListValue()); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef LayerIterator<LayerImpl, 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList, 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl, 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorActions::BackToFront> LayerIteratorType; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerIteratorType it = LayerIteratorType::Begin( 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &render_surface_layer_list_); it != end; ++it) { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!it.represents_itself()) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 553b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_surface_layer_list->Append(TracedValue::CreateIDRef(*it).release()); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 555b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 556b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("render_surface_layer_list", 557b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_surface_layer_list.release()); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::DidBeginScroll() { 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (HasPinchZoomScrollbars()) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FadeInPinchZoomScrollbars(); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::DidUpdateScroll() { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (HasPinchZoomScrollbars()) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdatePinchZoomScrollbars(); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::DidEndScroll() { 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (HasPinchZoomScrollbars()) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FadeOutPinchZoomScrollbars(); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) { 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate( 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPinchZoomHorizontalLayerId(int layer_id) { 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_horizontal_layer_id_ = layer_id; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollbarLayerImpl* LayerTreeImpl::PinchZoomScrollbarHorizontal() { 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<ScrollbarLayerImpl*>(LayerById( 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_horizontal_layer_id_)); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPinchZoomVerticalLayerId(int layer_id) { 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_vertical_layer_id_ = layer_id; 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollbarLayerImpl* LayerTreeImpl::PinchZoomScrollbarVertical() { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<ScrollbarLayerImpl*>(LayerById( 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_vertical_layer_id_)); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UpdatePinchZoomScrollbars() { 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_scroll_layer = RootScrollLayer(); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_scroll_layer) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ScrollbarLayerImpl* scrollbar = PinchZoomScrollbarHorizontal()) { 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar->SetCurrentPos(root_scroll_layer->scroll_offset().x()); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar->SetTotalSize(root_scroll_layer->bounds().width()); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar->SetMaximum(root_scroll_layer->max_scroll_offset().x()); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ScrollbarLayerImpl* scrollbar = PinchZoomScrollbarVertical()) { 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar->SetCurrentPos(root_scroll_layer->scroll_offset().y()); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar->SetTotalSize(root_scroll_layer->bounds().height()); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar->SetMaximum(root_scroll_layer->max_scroll_offset().y()); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static scoped_ptr<Animation> MakePinchZoomFadeAnimation( 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_opacity, float end_opacity) { 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<KeyframedFloatAnimationCurve> curve = 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyframedFloatAnimationCurve::Create(); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) curve->AddKeyframe(FloatKeyframe::Create( 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, start_opacity, EaseInTimingFunction::Create())); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) curve->AddKeyframe(FloatKeyframe::Create( 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PinchZoomScrollbar::kFadeDurationInSeconds, end_opacity, 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EaseInTimingFunction::Create())); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Animation> animation = Animation::Create( 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) curve.PassAs<AnimationCurve>(), AnimationIdProvider::NextAnimationId(), 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, Animation::Opacity); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation->set_is_impl_only(true); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void StartFadeInAnimation(ScrollbarLayerImpl* layer) { 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(layer); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_opacity = layer->opacity(); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationController* controller = layer->layer_animation_controller(); 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(wjmaclean) It shouldn't be necessary to manually remove the old 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // animation. 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Animation* animation = controller->GetAnimation(Animation::Opacity)) 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->RemoveAnimation(animation->id()); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->AddAnimation(MakePinchZoomFadeAnimation(start_opacity, 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PinchZoomScrollbar::kDefaultOpacity)); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::FadeInPinchZoomScrollbars() { 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!HasPinchZoomScrollbars() || page_scale_factor_ == 1) 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartFadeInAnimation(PinchZoomScrollbarHorizontal()); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartFadeInAnimation(PinchZoomScrollbarVertical()); 656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetNeedsRedraw(); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void StartFadeOutAnimation(LayerImpl* layer) { 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float opacity = layer->opacity(); 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!opacity) 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationController* controller = layer->layer_animation_controller(); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(wjmaclean) It shouldn't be necessary to manually remove the old 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // animation. 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Animation* animation = controller->GetAnimation(Animation::Opacity)) 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->RemoveAnimation(animation->id()); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->AddAnimation(MakePinchZoomFadeAnimation(opacity, 0)); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::FadeOutPinchZoomScrollbars() { 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!HasPinchZoomScrollbars()) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartFadeOutAnimation(PinchZoomScrollbarHorizontal()); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartFadeOutAnimation(PinchZoomScrollbarVertical()); 678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetNeedsRedraw(); 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::HasPinchZoomScrollbars() const { 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pinch_zoom_scrollbar_horizontal_layer_id_ != Layer::INVALID_ID && 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_zoom_scrollbar_vertical_layer_id_ != Layer::INVALID_ID; 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_scroll = RootScrollLayer(); 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_clip = RootClipLayer(); 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(root_scroll); 690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(root_clip); 691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsActiveTree()); 692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF scrollable_viewport_size = 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); 695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF original_viewport_size = 697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF(root_clip->bounds()).bottom_right() - 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(); 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_viewport_size.Scale(1 / page_scale_factor()); 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll->SetFixedContainerSizeDelta( 702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollable_viewport_size - original_viewport_size); 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::SetLatencyInfo(const LatencyInfo& latency_info) { 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_.MergeWith(latency_info); 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const LatencyInfo& LayerTreeImpl::GetLatencyInfo() { 710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return latency_info_; 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::ClearLatencyInfo() { 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_.Clear(); 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 718