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