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