layer_tree_impl.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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/keyframed_animation_curve.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller.h" 10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/layers/layer.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/layers/scrollbar_layer_impl_base.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : layer_tree_host_impl_(layer_tree_host_impl), 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source_frame_number_(-1), 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hud_layer_(0), 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_(NULL), 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) currently_scrolling_layer_(NULL), 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_(NULL), 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) background_color_(0), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_transparent_background_(false), 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_(NULL), 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_(NULL), 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_(NULL), 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor_(1), 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta_(1), 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sent_page_scale_delta_(1), 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_page_scale_factor_(0), 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_page_scale_factor_(0), 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_(0), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_(false), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_(false), 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_update_draw_properties_(true), 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_full_tree_sync_(true) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeImpl::~LayerTreeImpl() { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Need to explicitly clear the tree prior to destroying this so that 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_.reset(); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static LayerImpl* FindRootScrollLayerRecursive(LayerImpl* layer) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->scrollable()) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* found = FindRootScrollLayerRecursive(layer->children()[i]); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate(NULL); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_ = layer.Pass(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = NULL; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_ = NULL; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::FindRootScrollLayer() { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_ = FindRootScrollLayerRecursive(root_layer_.get()); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) { 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UpdateMaxScrollOffset(); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate( 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (scrolling_layer_id_from_previous_tree_) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree( 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_.get(), 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 0; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear all data structures that have direct references to the layer tree. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate(NULL); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_ = NULL; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = NULL; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list_.clear(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_needs_update_draw_properties(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_layer_.Pass(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The request queue should have been processed and does not require a push. 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK_EQ(ui_resource_request_queue_.size(), 0u); 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) target_tree->SetLatencyInfo(latency_info_); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_.Clear(); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPageScaleFactorAndLimits( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor(), min_page_scale_factor(), max_page_scale_factor()); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPageScaleDelta( 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->page_scale_delta() / target_tree->sent_page_scale_delta()); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_sent_page_scale_delta(1); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (settings().use_pinch_virtual_viewport) { 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) target_tree->SetViewportLayersFromIds( 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_->id(), 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_->id(), 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : Layer::INVALID_ID); 128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should match the property synchronization in 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHost::finishCommitOnImplThread(). 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_source_frame_number(source_frame_number()); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_background_color(background_color()); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_has_transparent_background(has_transparent_background()); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ContentsTexturesPurged()) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetContentsTexturesPurged(); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->ResetContentsTexturesPurged(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ViewportSizeInvalid()) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetViewportSizeInvalid(); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->ResetViewportSizeInvalid(); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (hud_layer()) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>( 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostCommon::FindLayerInSubtree( 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->root_layer(), hud_layer()->id()))); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_hud_layer(NULL); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::RootScrollLayer() const { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochLayerImpl* LayerTreeImpl::RootContainerLayer() const { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsActiveTree()); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return currently_scrolling_layer_; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (currently_scrolling_layer_ == layer) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (currently_scrolling_layer_ && 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_->scrollbar_animation_controller()) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_->scrollbar_animation_controller()-> 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DidScrollGestureEnd(CurrentPhysicalTimeTicks()); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = layer; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer && layer->scrollbar_animation_controller()) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->scrollbar_animation_controller()->DidScrollGestureBegin(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ClearCurrentlyScrollingLayer() { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCurrentlyScrollingLayer(NULL); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 0; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float min_page_scale_factor, float max_page_scale_factor) { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_scale_factor) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_page_scale_factor_ = min_page_scale_factor; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_page_scale_factor_ = max_page_scale_factor; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor_ = page_scale_factor; 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (root_layer_scroll_offset_delegate_) 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) root_layer_scroll_offset_delegate_->SetPageScaleFactor(page_scale_factor_); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPageScaleDelta(float delta) { 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clamp to the current min/max limits. 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float total = page_scale_factor_ * delta; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (min_page_scale_factor_ && total < min_page_scale_factor_) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta = min_page_scale_factor_ / page_scale_factor_; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (max_page_scale_factor_ && total > max_page_scale_factor_) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta = max_page_scale_factor_ / page_scale_factor_; 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delta == page_scale_delta_) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta_ = delta; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsActiveTree()) { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree) { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_tree->SetPageScaleDelta( 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) page_scale_delta_ / sent_page_scale_delta_); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_needs_update_draw_properties(); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { 22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return gfx::ScaleSize(layer_tree_host_impl_->UnscaledScrollableViewportSize(), 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.0f / total_page_scale_factor()); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UpdateMaxScrollOffset() { 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* root_scroll = RootScrollLayer(); 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!root_scroll || !root_scroll->children().size()) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() - 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF(ScrollableViewportSize()).bottom_right(); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The viewport may be larger than the contents in some cases, such as 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // having a vertical scrollbar but no horizontal overflow. 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) max_scroll.SetToMax(gfx::Vector2dF()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll)); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) { 2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->ApplySentScrollDeltasFromAbortedCommit(); 245558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { 248558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(IsActiveTree()); 249558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 250558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch page_scale_factor_ *= sent_page_scale_delta_; 251558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch page_scale_delta_ /= sent_page_scale_delta_; 252558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch sent_page_scale_delta_ = 1.f; 253558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 254558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!root_layer()) 255558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LayerTreeHostCommon::CallFunctionForSubtree( 2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo)); 2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static void ApplyScrollDeltasSinceBeginFrameTo(LayerImpl* layer) { 2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->ApplyScrollDeltasSinceBeginFrame(); 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void LayerTreeImpl::ApplyScrollDeltasSinceBeginFrame() { 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(IsPendingTree()); 2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!root_layer()) 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LayerTreeHostCommon::CallFunctionForSubtree( 2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) root_layer(), base::Bind(&ApplyScrollDeltasSinceBeginFrameTo)); 272558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::SetViewportLayersFromIds( 275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int page_scale_layer_id, 276d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int inner_viewport_scroll_layer_id, 277d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int outer_viewport_scroll_layer_id) { 278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_ = LayerById(page_scale_layer_id); 279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(page_scale_layer_); 280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_ = 282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerById(inner_viewport_scroll_layer_id); 283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(inner_viewport_scroll_layer_); 284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_ = 286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerById(outer_viewport_scroll_layer_id); 287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(outer_viewport_scroll_layer_ || 288d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_id == Layer::INVALID_ID); 289d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 290d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::ClearViewportLayers() { 292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_ = NULL; 293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_ = NULL; 294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_ = NULL; 295d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(wjmaclean) This needs to go away, and be replaced with a single core 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// of login that works for both scrollbar layer types. This is already planned 29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// as part of the larger pinch-zoom re-factoring viewport. 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UpdateSolidColorScrollbars() { 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(settings().solid_color_scrollbars); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_scroll = RootScrollLayer(); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(root_scroll); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsActiveTree()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF scrollable_viewport( 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointAtOffsetFromOrigin(root_scroll->TotalScrollOffset()), 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollableViewportSize()); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float vertical_adjust = 0.0f; 3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (RootContainerLayer()) 31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) vertical_adjust = 31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->UnscaledScrollableViewportSize().height() - 31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RootContainerLayer()->bounds().height(); 31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ScrollbarLayerImplBase* horiz = 3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) root_scroll->horizontal_scrollbar_layer()) { 3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) horiz->SetVerticalAdjust(vertical_adjust); 3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) horiz->SetVisibleToTotalLengthRatio( 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollable_viewport.width() / ScrollableSize().width()); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ScrollbarLayerImplBase* vertical = 3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) root_scroll->vertical_scrollbar_layer()) { 3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) vertical->SetVerticalAdjust(vertical_adjust); 3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) vertical->SetVisibleToTotalLengthRatio( 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollable_viewport.height() / ScrollableSize().height()); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::UpdateDrawProperties() { 3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (IsActiveTree() && RootScrollLayer() && RootContainerLayer()) 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateRootScrollLayerSizeDelta(); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (settings().solid_color_scrollbars && 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsActiveTree() && 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootScrollLayer()) { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSolidColorScrollbars(); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_update_draw_properties_ = false; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list_.clear(); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For max_texture_size. 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_impl_->renderer()) 344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_layer()) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TRACE_EVENT2("cc", 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeImpl::UpdateDrawProperties", 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "IsActive", 3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IsActiveTree(), 3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "SourceFrameNumber", 3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch source_frame_number_); 356d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerImpl* page_scale_layer = 357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_ ? page_scale_layer_ : RootContainerLayer(); 358558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer(), 36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DrawViewportSize(), 36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->DrawTransform(), 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor(), 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_page_scale_factor(), 364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer, 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MaxTextureSize(), 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings().can_use_lcd_text, 367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings().layer_transforms_should_scale_layer_contents, 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &render_surface_layer_list_); 369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LayerTreeHostCommon::CalculateDrawProperties(&inputs); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!needs_update_draw_properties_) << 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "CalcDrawProperties should not set_needs_update_draw_properties()"; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If this assert triggers, then the list is dirty. 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!needs_update_draw_properties_); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_surface_layer_list_; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size LayerTreeImpl::ScrollableSize() const { 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_->children()[0]->bounds(); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::LayerById(int id) { 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIdMap::iterator iter = layer_id_map_.find(id); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter != layer_id_map_.end() ? iter->second : NULL; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!LayerById(layer->id())); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_id_map_[layer->id()] = layer; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(LayerById(layer->id())); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_id_map_.erase(layer->id()); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPersistedState(LayerTreeImpl* pending_tree) { 404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_tree->SetCurrentlyScrollingLayer( 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LayerTreeHostCommon::FindLayerInSubtree(pending_tree->root_layer(), 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0)); 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_tree->SetLatencyInfo(latency_info_); 408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) latency_info_.Clear(); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void DidBecomeActiveRecursive(LayerImpl* layer) { 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->DidBecomeActive(); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidBecomeActiveRecursive(layer->children()[i]); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::DidBecomeActive() { 418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!root_layer()) 419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DidBecomeActiveRecursive(root_layer()); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindRootScrollLayer(); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ContentsTexturesPurged() const { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return contents_textures_purged_; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetContentsTexturesPurged() { 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (contents_textures_purged_) 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_ = true; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetContentsTexturesPurged() { 4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!contents_textures_purged_) 4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_ = false; 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ViewportSizeInvalid() const { 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return viewport_size_invalid_; 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetViewportSizeInvalid() { 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_ = true; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetViewportSizeInvalid() { 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_ = false; 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Proxy* LayerTreeImpl::proxy() const { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->proxy(); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeSettings& LayerTreeImpl::settings() const { 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->settings(); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const RendererCapabilities& LayerTreeImpl::GetRendererCapabilities() const { 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->GetRendererCapabilities(); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)ContextProvider* LayerTreeImpl::context_provider() const { 4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return output_surface()->context_provider(); 4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OutputSurface* LayerTreeImpl::output_surface() const { 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->output_surface(); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceProvider* LayerTreeImpl::resource_provider() const { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->resource_provider(); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TileManager* LayerTreeImpl::tile_manager() const { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->tile_manager(); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FrameRateCounter* LayerTreeImpl::frame_rate_counter() const { 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->fps_counter(); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PaintTimeCounter* LayerTreeImpl::paint_time_counter() const { 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->paint_time_counter(); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MemoryHistory* LayerTreeImpl::memory_history() const { 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->memory_history(); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool LayerTreeImpl::device_viewport_valid_for_tile_management() const { 49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return layer_tree_host_impl_->device_viewport_valid_for_tile_management(); 49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsActiveTree() const { 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->active_tree() == this; 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsPendingTree() const { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->pending_tree() == this; 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsRecycleTree() const { 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->recycle_tree() == this; 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindActiveTreeLayerById(int id) { 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* tree = layer_tree_host_impl_->active_tree(); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tree) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tree->LayerById(id); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindPendingTreeLayerById(int id) { 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* tree = layer_tree_host_impl_->pending_tree(); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tree) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tree->LayerById(id); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int LayerTreeImpl::MaxTextureSize() const { 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->GetRendererCapabilities().max_texture_size; 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::PinchGestureActive() const { 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->pinch_gesture_active(); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::TimeTicks LayerTreeImpl::CurrentFrameTimeTicks() const { 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return layer_tree_host_impl_->CurrentFrameTimeTicks(); 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::Time LayerTreeImpl::CurrentFrameTime() const { 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->CurrentFrameTime(); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::TimeTicks LayerTreeImpl::CurrentPhysicalTimeTicks() const { 5447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return layer_tree_host_impl_->CurrentPhysicalTimeTicks(); 5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsCommit() { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->SetNeedsCommit(); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Size LayerTreeImpl::DrawViewportSize() const { 55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return layer_tree_host_impl_->DrawViewportSize(); 55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void LayerTreeImpl::StartScrollbarAnimation() { 55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->StartScrollbarAnimation(); 55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsRedraw() { 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->SetNeedsRedraw(); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeDebugState& LayerTreeImpl::debug_state() const { 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->debug_state(); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float LayerTreeImpl::device_scale_factor() const { 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->device_scale_factor(); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory* LayerTreeImpl::debug_rect_history() const { 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->debug_rect_history(); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AnimationRegistrar* LayerTreeImpl::animationRegistrar() const { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->animation_registrar(); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> LayerTreeImpl::AsValue() const { 580b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 581b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) TracedValue::MakeDictIntoImplicitSnapshot( 582b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state.get(), "cc::LayerTreeImpl", this); 583b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("root_layer", root_layer_->AsValue().release()); 585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 586b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<base::ListValue> render_surface_layer_list(new base::ListValue()); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef LayerIterator<LayerImpl, 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList, 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl, 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorActions::BackToFront> LayerIteratorType; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerIteratorType it = LayerIteratorType::Begin( 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &render_surface_layer_list_); it != end; ++it) { 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!it.represents_itself()) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_surface_layer_list->Append(TracedValue::CreateIDRef(*it).release()); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 598b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 599b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("render_surface_layer_list", 600b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_surface_layer_list.release()); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( 605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 60668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) 60768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 60868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 61068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) { 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate( 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 61568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 61668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (root_layer_scroll_offset_delegate_) { 61768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); 61868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) root_layer_scroll_offset_delegate_->SetPageScaleFactor(page_scale_factor_); 61968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_scroll = RootScrollLayer(); 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* root_container = RootContainerLayer(); 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(root_scroll); 6267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(root_container); 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsActiveTree()); 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF scrollable_viewport_size = 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF original_viewport_size = 6337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::RectF(root_container->bounds()).bottom_right() - 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(); 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_viewport_size.Scale(1 / page_scale_factor()); 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll->SetFixedContainerSizeDelta( 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollable_viewport_size - original_viewport_size); 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeImpl::SetLatencyInfo(const ui::LatencyInfo& latency_info) { 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_.MergeWith(latency_info); 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const ui::LatencyInfo& LayerTreeImpl::GetLatencyInfo() { 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return latency_info_; 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::ClearLatencyInfo() { 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_.Clear(); 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::DidModifyTilePriorities() { 654d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layer_tree_host_impl_->DidModifyTilePriorities(); 65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 657a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeImpl::set_ui_resource_request_queue( 658a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const UIResourceRequestQueue& queue) { 659a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_request_queue_ = queue; 660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 661a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ResourceProvider::ResourceId LayerTreeImpl::ResourceIdForUIResource( 663a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId uid) const { 664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return layer_tree_host_impl_->ResourceIdForUIResource(uid); 665a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeImpl::ProcessUIResourceRequestQueue() { 668a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) while (ui_resource_request_queue_.size() > 0) { 669a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceRequest req = ui_resource_request_queue_.front(); 670a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_request_queue_.pop_front(); 671a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 67268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (req.GetType()) { 673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case UIResourceRequest::UIResourceCreate: 67468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) layer_tree_host_impl_->CreateUIResource(req.GetId(), req.GetBitmap()); 675a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case UIResourceRequest::UIResourceDelete: 67768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) layer_tree_host_impl_->DeleteUIResource(req.GetId()); 678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 679424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case UIResourceRequest::UIResourceInvalidRequest: 680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NOTREACHED(); 681a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 682a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 683a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If all UI resource evictions were not recreated by processing this queue, 68658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // then another commit is required. 68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host_impl_->EvictedUIResourcesExist()) 68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->SetNeedsCommit(); 689a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 690a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeImpl::AddLayerWithCopyOutputRequest(LayerImpl* layer) { 6927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Only the active tree needs to know about layers with copy requests, as 6937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // they are aborted if not serviced during draw. 6947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsActiveTree()); 6957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 696fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch DCHECK(std::find(layers_with_copy_output_request_.begin(), 697fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch layers_with_copy_output_request_.end(), 698fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch layer) == layers_with_copy_output_request_.end()); 6997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layers_with_copy_output_request_.push_back(layer); 7007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeImpl::RemoveLayerWithCopyOutputRequest(LayerImpl* layer) { 7037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Only the active tree needs to know about layers with copy requests, as 7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // they are aborted if not serviced during draw. 7057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsActiveTree()); 7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<LayerImpl*>::iterator it = std::find( 7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layers_with_copy_output_request_.begin(), 7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layers_with_copy_output_request_.end(), 7107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer); 7117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(it != layers_with_copy_output_request_.end()); 712fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch layers_with_copy_output_request_.erase(it); 7137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst std::vector<LayerImpl*> LayerTreeImpl::LayersWithCopyOutputRequest() 7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const { 7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Only the active tree needs to know about layers with copy requests, as 7187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // they are aborted if not serviced during draw. 7197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsActiveTree()); 7207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return layers_with_copy_output_request_; 7227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 725