layer_tree_impl.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/base/math_util.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/base/util.h" 12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/layers/layer.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/layers/scrollbar_layer_impl_base.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/resources/ui_resource_request.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), 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_(NULL), 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_(NULL), 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_(NULL), 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor_(1), 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta_(1), 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sent_page_scale_delta_(1), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_page_scale_factor_(0), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_page_scale_factor_(0), 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_(0), 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_(false), 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_(false), 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_update_draw_properties_(true), 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) needs_full_tree_sync_(true), 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) next_activation_forces_redraw_(false) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeImpl::~LayerTreeImpl() { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Need to explicitly clear the tree prior to destroying this so that 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_.reset(); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static LayerImpl* FindRootScrollLayerRecursive(LayerImpl* layer) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->scrollable()) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* found = FindRootScrollLayerRecursive(layer->children()[i]); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate(NULL); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_ = layer.Pass(); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = NULL; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_ = NULL; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::FindRootScrollLayer() { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_ = FindRootScrollLayerRecursive(root_layer_.get()); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) { 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UpdateMaxScrollOffset(); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate( 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (scrolling_layer_id_from_previous_tree_) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree( 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer_.get(), 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 0; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear all data structures that have direct references to the layer tree. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate(NULL); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_ = NULL; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = NULL; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list_.clear(); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_needs_update_draw_properties(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_layer_.Pass(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The request queue should have been processed and does not require a push. 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK_EQ(ui_resource_request_queue_.size(), 0u); 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (next_activation_forces_redraw_) { 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host_impl_->SetFullRootLayerDamage(); 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) next_activation_forces_redraw_ = false; 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_tree->PassSwapPromises(&swap_promise_list_); 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPageScaleFactorAndLimits( 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor(), min_page_scale_factor(), max_page_scale_factor()); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetPageScaleDelta( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->page_scale_delta() / target_tree->sent_page_scale_delta()); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_sent_page_scale_delta(1); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (settings().use_pinch_virtual_viewport) { 132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) target_tree->SetViewportLayersFromIds( 133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_->id(), 134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_->id(), 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() 136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : Layer::INVALID_ID); 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should match the property synchronization in 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHost::finishCommitOnImplThread(). 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_source_frame_number(source_frame_number()); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_background_color(background_color()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_has_transparent_background(has_transparent_background()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ContentsTexturesPurged()) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetContentsTexturesPurged(); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->ResetContentsTexturesPurged(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ViewportSizeInvalid()) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->SetViewportSizeInvalid(); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->ResetViewportSizeInvalid(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (hud_layer()) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>( 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostCommon::FindLayerInSubtree( 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->root_layer(), hud_layer()->id()))); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_tree->set_hud_layer(NULL); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::RootScrollLayer() const { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochLayerImpl* LayerTreeImpl::RootContainerLayer() const { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsActiveTree()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return currently_scrolling_layer_; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (currently_scrolling_layer_ == layer) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (currently_scrolling_layer_ && 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_->scrollbar_animation_controller()) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_->scrollbar_animation_controller()-> 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DidScrollGestureEnd(CurrentPhysicalTimeTicks()); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) currently_scrolling_layer_ = layer; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer && layer->scrollbar_animation_controller()) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->scrollbar_animation_controller()->DidScrollGestureBegin(); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ClearCurrentlyScrollingLayer() { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCurrentlyScrollingLayer(NULL); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrolling_layer_id_from_previous_tree_ = 0; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float min_page_scale_factor, float max_page_scale_factor) { 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_scale_factor) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_page_scale_factor_ = min_page_scale_factor; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_page_scale_factor_ = max_page_scale_factor; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_factor_ = page_scale_factor; 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (root_layer_scroll_offset_delegate_) { 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) total_page_scale_factor()); 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPageScaleDelta(float delta) { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clamp to the current min/max limits. 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float total = page_scale_factor_ * delta; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (min_page_scale_factor_ && total < min_page_scale_factor_) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta = min_page_scale_factor_ / page_scale_factor_; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (max_page_scale_factor_ && total > max_page_scale_factor_) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta = max_page_scale_factor_ / page_scale_factor_; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delta == page_scale_delta_) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta_ = delta; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsActiveTree()) { 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree) { 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_tree->SetPageScaleDelta( 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) page_scale_delta_ / sent_page_scale_delta_); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_needs_update_draw_properties(); 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (root_layer_scroll_offset_delegate_) { 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) total_page_scale_factor()); 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return gfx::ScaleSize(layer_tree_host_impl_->UnscaledScrollableViewportSize(), 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.0f / total_page_scale_factor()); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const { 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return gfx::Rect(); 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerImpl* layer = root_scroll_layer_->children()[0]; 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return MathUtil::MapClippedRect( 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer->screen_space_transform(), 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(layer->content_bounds())); 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UpdateMaxScrollOffset() { 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* root_scroll = RootScrollLayer(); 2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!root_scroll || !root_scroll->children().size()) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() - 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF(ScrollableViewportSize()).bottom_right(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The viewport may be larger than the contents in some cases, such as 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // having a vertical scrollbar but no horizontal overflow. 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) max_scroll.SetToMax(gfx::Vector2dF()); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll)); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) { 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->ApplySentScrollDeltasFromAbortedCommit(); 270558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { 273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(IsActiveTree()); 274558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 275558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch page_scale_factor_ *= sent_page_scale_delta_; 276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch page_scale_delta_ /= sent_page_scale_delta_; 277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch sent_page_scale_delta_ = 1.f; 278558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 279558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!root_layer()) 280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LayerTreeHostCommon::CallFunctionForSubtree( 2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo)); 2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void ApplyScrollDeltasSinceBeginMainFrameTo(LayerImpl* layer) { 2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) layer->ApplyScrollDeltasSinceBeginMainFrame(); 2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void LayerTreeImpl::ApplyScrollDeltasSinceBeginMainFrame() { 2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(IsPendingTree()); 2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!root_layer()) 2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LayerTreeHostCommon::CallFunctionForSubtree( 2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_layer(), base::Bind(&ApplyScrollDeltasSinceBeginMainFrameTo)); 297558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 298558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 299d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::SetViewportLayersFromIds( 300d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int page_scale_layer_id, 301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int inner_viewport_scroll_layer_id, 302d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int outer_viewport_scroll_layer_id) { 303d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_ = LayerById(page_scale_layer_id); 304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(page_scale_layer_); 305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_ = 307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerById(inner_viewport_scroll_layer_id); 308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(inner_viewport_scroll_layer_); 309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_ = 311d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerById(outer_viewport_scroll_layer_id); 312d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(outer_viewport_scroll_layer_ || 313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_id == Layer::INVALID_ID); 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::ClearViewportLayers() { 317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_ = NULL; 318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) inner_viewport_scroll_layer_ = NULL; 319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) outer_viewport_scroll_layer_ = NULL; 320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(wjmaclean) This needs to go away, and be replaced with a single core 32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// of login that works for both scrollbar layer types. This is already planned 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// as part of the larger pinch-zoom re-factoring viewport. 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UpdateSolidColorScrollbars() { 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_scroll = RootScrollLayer(); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(root_scroll); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsActiveTree()); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF scrollable_viewport( 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointAtOffsetFromOrigin(root_scroll->TotalScrollOffset()), 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollableViewportSize()); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float vertical_adjust = 0.0f; 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (RootContainerLayer()) 33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) vertical_adjust = 33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->UnscaledScrollableViewportSize().height() - 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RootContainerLayer()->bounds().height(); 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ScrollbarLayerImplBase* horiz = 3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) root_scroll->horizontal_scrollbar_layer()) { 3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) horiz->SetVerticalAdjust(vertical_adjust); 3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) horiz->SetVisibleToTotalLengthRatio( 34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollable_viewport.width() / ScrollableSize().width()); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ScrollbarLayerImplBase* vertical = 3453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) root_scroll->vertical_scrollbar_layer()) { 3463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) vertical->SetVerticalAdjust(vertical_adjust); 3473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) vertical->SetVisibleToTotalLengthRatio( 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollable_viewport.height() / ScrollableSize().height()); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::UpdateDrawProperties() { 3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (IsActiveTree() && RootScrollLayer() && RootContainerLayer()) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateRootScrollLayerSizeDelta(); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (IsActiveTree() && 3578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RootContainerLayer() 3588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) && !RootContainerLayer()->masks_to_bounds()) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSolidColorScrollbars(); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_update_draw_properties_ = false; 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list_.clear(); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For max_texture_size. 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_impl_->renderer()) 367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_layer()) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TRACE_EVENT2("cc", 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeImpl::UpdateDrawProperties", 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "IsActive", 3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IsActiveTree(), 3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "SourceFrameNumber", 3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch source_frame_number_); 379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LayerImpl* page_scale_layer = 380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer_ ? page_scale_layer_ : RootContainerLayer(); 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool can_render_to_separate_surface = 3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) !output_surface()->ForcedDrawToSoftwareDevice(); 383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer(), 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DrawViewportSize(), 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->DrawTransform(), 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor(), 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_page_scale_factor(), 389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) page_scale_layer, 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MaxTextureSize(), 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings().can_use_lcd_text, 3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) can_render_to_separate_surface, 393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings().layer_transforms_should_scale_layer_contents, 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &render_surface_layer_list_); 395558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LayerTreeHostCommon::CalculateDrawProperties(&inputs); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 3998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TRACE_EVENT2("cc", 4008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "LayerTreeImpl::UpdateTilePriorities", 4018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "IsActive", 4028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IsActiveTree(), 4038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "SourceFrameNumber", 4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) source_frame_number_); 4058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // LayerIterator is used here instead of CallFunctionForSubtree to only 4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // UpdateTilePriorities on layers that will be visible (and thus have valid 4078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // draw properties) and not because any ordering is required. 4088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) typedef LayerIterator<LayerImpl, 4098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LayerImplList, 4108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderSurfaceImpl, 4118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LayerIteratorActions::FrontToBack> LayerIteratorType; 4128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_); 4138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (LayerIteratorType it = 4148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LayerIteratorType::Begin(&render_surface_layer_list_); 4158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) it != end; 4168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ++it) { 4178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!it.represents_itself()) 4188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) continue; 4198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LayerImpl* layer = *it; 4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) layer->UpdateTilePriorities(); 4228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (layer->mask_layer()) 4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) layer->mask_layer()->UpdateTilePriorities(); 4248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (layer->replica_layer() && layer->replica_layer()->mask_layer()) 4258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) layer->replica_layer()->mask_layer()->UpdateTilePriorities(); 4268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 4288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!needs_update_draw_properties_) << 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "CalcDrawProperties should not set_needs_update_draw_properties()"; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If this assert triggers, then the list is dirty. 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!needs_update_draw_properties_); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_surface_layer_list_; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size LayerTreeImpl::ScrollableSize() const { 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return root_scroll_layer_->children()[0]->bounds(); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::LayerById(int id) { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIdMap::iterator iter = layer_id_map_.find(id); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter != layer_id_map_.end() ? iter->second : NULL; 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!LayerById(layer->id())); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_id_map_[layer->id()] = layer; 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(LayerById(layer->id())); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_id_map_.erase(layer->id()); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPersistedState(LayerTreeImpl* pending_tree) { 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_tree->SetCurrentlyScrollingLayer( 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LayerTreeHostCommon::FindLayerInSubtree(pending_tree->root_layer(), 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0)); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void DidBecomeActiveRecursive(LayerImpl* layer) { 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->DidBecomeActive(); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidBecomeActiveRecursive(layer->children()[i]); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::DidBecomeActive() { 473a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!root_layer()) 474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 476a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DidBecomeActiveRecursive(root_layer()); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindRootScrollLayer(); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ContentsTexturesPurged() const { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return contents_textures_purged_; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetContentsTexturesPurged() { 4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (contents_textures_purged_) 4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_ = true; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetContentsTexturesPurged() { 4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!contents_textures_purged_) 4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_textures_purged_ = false; 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ViewportSizeInvalid() const { 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return viewport_size_invalid_; 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetViewportSizeInvalid() { 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_ = true; 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetViewportSizeInvalid() { 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size_invalid_ = false; 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Proxy* LayerTreeImpl::proxy() const { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->proxy(); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeSettings& LayerTreeImpl::settings() const { 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->settings(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const RendererCapabilities& LayerTreeImpl::GetRendererCapabilities() const { 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->GetRendererCapabilities(); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)ContextProvider* LayerTreeImpl::context_provider() const { 5253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return output_surface()->context_provider(); 5263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OutputSurface* LayerTreeImpl::output_surface() const { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->output_surface(); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceProvider* LayerTreeImpl::resource_provider() const { 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->resource_provider(); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TileManager* LayerTreeImpl::tile_manager() const { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->tile_manager(); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FrameRateCounter* LayerTreeImpl::frame_rate_counter() const { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->fps_counter(); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PaintTimeCounter* LayerTreeImpl::paint_time_counter() const { 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->paint_time_counter(); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MemoryHistory* LayerTreeImpl::memory_history() const { 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->memory_history(); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool LayerTreeImpl::device_viewport_valid_for_tile_management() const { 55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return layer_tree_host_impl_->device_viewport_valid_for_tile_management(); 55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsActiveTree() const { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->active_tree() == this; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsPendingTree() const { 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->pending_tree() == this; 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsRecycleTree() const { 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->recycle_tree() == this; 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindActiveTreeLayerById(int id) { 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* tree = layer_tree_host_impl_->active_tree(); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tree) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tree->LayerById(id); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindPendingTreeLayerById(int id) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* tree = layer_tree_host_impl_->pending_tree(); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tree) 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tree->LayerById(id); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int LayerTreeImpl::MaxTextureSize() const { 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->GetRendererCapabilities().max_texture_size; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::PinchGestureActive() const { 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->pinch_gesture_active(); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::TimeTicks LayerTreeImpl::CurrentFrameTimeTicks() const { 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return layer_tree_host_impl_->CurrentFrameTimeTicks(); 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::Time LayerTreeImpl::CurrentFrameTime() const { 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->CurrentFrameTime(); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::TimeTicks LayerTreeImpl::CurrentPhysicalTimeTicks() const { 5997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return layer_tree_host_impl_->CurrentPhysicalTimeTicks(); 6007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsCommit() { 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->SetNeedsCommit(); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Size LayerTreeImpl::DrawViewportSize() const { 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return layer_tree_host_impl_->DrawViewportSize(); 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void LayerTreeImpl::StartScrollbarAnimation() { 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->StartScrollbarAnimation(); 61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeImpl::DidAnimateScrollOffset() { 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host_impl_->DidAnimateScrollOffset(); 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsRedraw() { 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->SetNeedsRedraw(); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeDebugState& LayerTreeImpl::debug_state() const { 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->debug_state(); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float LayerTreeImpl::device_scale_factor() const { 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->device_scale_factor(); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory* LayerTreeImpl::debug_rect_history() const { 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->debug_rect_history(); 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AnimationRegistrar* LayerTreeImpl::animationRegistrar() const { 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_tree_host_impl_->animation_registrar(); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> LayerTreeImpl::AsValue() const { 639b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 640b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) TracedValue::MakeDictIntoImplicitSnapshot( 641b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state.get(), "cc::LayerTreeImpl", this); 642b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 643b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("root_layer", root_layer_->AsValue().release()); 644b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 645b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<base::ListValue> render_surface_layer_list(new base::ListValue()); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef LayerIterator<LayerImpl, 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList, 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl, 6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerIteratorActions::FrontToBack> LayerIteratorType; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_); 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerIteratorType it = LayerIteratorType::Begin( 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &render_surface_layer_list_); it != end; ++it) { 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!it.represents_itself()) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 655b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_surface_layer_list->Append(TracedValue::CreateIDRef(*it).release()); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 657b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 658b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("render_surface_layer_list", 659b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_surface_layer_list.release()); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( 664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 66568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) 66668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 66768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 66968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_scroll_layer_) { 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll_layer_->SetScrollOffsetDelegate( 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 67468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 67568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (root_layer_scroll_offset_delegate_) { 67668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); 6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) total_page_scale_factor()); 67968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { 683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_scroll = RootScrollLayer(); 6847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* root_container = RootContainerLayer(); 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(root_scroll); 6867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(root_container); 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsActiveTree()); 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF scrollable_viewport_size = 690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); 691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF original_viewport_size = 6937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::RectF(root_container->bounds()).bottom_right() - 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(); 695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_viewport_size.Scale(1 / page_scale_factor()); 696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_scroll->SetFixedContainerSizeDelta( 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollable_viewport_size - original_viewport_size); 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(swap_promise); 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (swap_promise_list_.size() > kMaxQueuedSwapPromiseNumber) 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BreakSwapPromises(SwapPromise::SWAP_PROMISE_LIST_OVERFLOW); 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) swap_promise_list_.push_back(swap_promise.Pass()); 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeImpl::PassSwapPromises( 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedPtrVector<SwapPromise>* new_swap_promise) { 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) swap_promise_list_.insert_and_take(swap_promise_list_.end(), 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *new_swap_promise); 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new_swap_promise->clear(); 713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeImpl::FinishSwapPromises(CompositorFrameMetadata* metadata) { 716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < swap_promise_list_.size(); i++) 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) swap_promise_list_[i]->DidSwap(metadata); 718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) swap_promise_list_.clear(); 719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeImpl::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { 722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < swap_promise_list_.size(); i++) 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) swap_promise_list_[i]->DidNotSwap(reason); 724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) swap_promise_list_.clear(); 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 727d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::DidModifyTilePriorities() { 728d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layer_tree_host_impl_->DidModifyTilePriorities(); 72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeImpl::set_ui_resource_request_queue( 732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const UIResourceRequestQueue& queue) { 733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_request_queue_ = queue; 734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ResourceProvider::ResourceId LayerTreeImpl::ResourceIdForUIResource( 737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId uid) const { 738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return layer_tree_host_impl_->ResourceIdForUIResource(uid); 739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool LayerTreeImpl::IsUIResourceOpaque(UIResourceId uid) const { 7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return layer_tree_host_impl_->IsUIResourceOpaque(uid); 7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 7441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeImpl::ProcessUIResourceRequestQueue() { 746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) while (ui_resource_request_queue_.size() > 0) { 747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceRequest req = ui_resource_request_queue_.front(); 748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_request_queue_.pop_front(); 749a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 75068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (req.GetType()) { 751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case UIResourceRequest::UIResourceCreate: 75268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) layer_tree_host_impl_->CreateUIResource(req.GetId(), req.GetBitmap()); 753a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 754a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case UIResourceRequest::UIResourceDelete: 75568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) layer_tree_host_impl_->DeleteUIResource(req.GetId()); 756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 757424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case UIResourceRequest::UIResourceInvalidRequest: 758a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NOTREACHED(); 759a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 76258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 76358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If all UI resource evictions were not recreated by processing this queue, 76458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // then another commit is required. 76558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host_impl_->EvictedUIResourcesExist()) 76658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host_impl_->SetNeedsCommit(); 767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeImpl::AddLayerWithCopyOutputRequest(LayerImpl* layer) { 7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Only the active tree needs to know about layers with copy requests, as 7717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // they are aborted if not serviced during draw. 7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsActiveTree()); 7737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 774fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch DCHECK(std::find(layers_with_copy_output_request_.begin(), 775fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch layers_with_copy_output_request_.end(), 776fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch layer) == layers_with_copy_output_request_.end()); 7777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layers_with_copy_output_request_.push_back(layer); 7787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeImpl::RemoveLayerWithCopyOutputRequest(LayerImpl* layer) { 7817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Only the active tree needs to know about layers with copy requests, as 7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // they are aborted if not serviced during draw. 7837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsActiveTree()); 7847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<LayerImpl*>::iterator it = std::find( 7867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layers_with_copy_output_request_.begin(), 7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layers_with_copy_output_request_.end(), 7887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer); 7897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(it != layers_with_copy_output_request_.end()); 790fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch layers_with_copy_output_request_.erase(it); 7917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest() 7947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const { 7957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Only the active tree needs to know about layers with copy requests, as 7967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // they are aborted if not serviced during draw. 7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsActiveTree()); 7987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return layers_with_copy_output_request_; 8007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 8017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 803