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)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <limits>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <set>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/debug/trace_event_argument.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/keyframed_animation_curve.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller_linear_fade.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller_thinning.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/base/math_util.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/base/util.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "cc/debug/devtools_instrumentation.h"
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h"
201675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#include "cc/input/page_scale_animation.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h"
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/layers/layer.h"
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "cc/layers/layer_iterator.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h"
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/layers/scrollbar_layer_impl_base.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/resources/ui_resource_request.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/trees/occlusion_tracker.h"
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/point_conversions.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This class exists to split the LayerScrollOffsetDelegate between the
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// that never requires the embedder or LayerImpl to know about.
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerScrollOffsetDelegateProxy(LayerImpl* layer,
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 LayerScrollOffsetDelegate* delegate,
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 LayerTreeImpl* layer_tree)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {}
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~LayerScrollOffsetDelegateProxy() {}
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF last_set_scroll_offset() const {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return last_set_scroll_offset_;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // LayerScrollOffsetDelegate implementation.
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE {
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    last_set_scroll_offset_ = new_offset;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    layer_tree_impl_->UpdateScrollOffsetDelegate();
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return layer_tree_impl_->GetDelegatedScrollOffset(layer_);
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsExternalFlingActive() const OVERRIDE {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return delegate_->IsExternalFlingActive();
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerImpl* layer_;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerScrollOffsetDelegate* delegate_;
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeImpl* layer_tree_impl_;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF last_set_scroll_offset_;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : layer_tree_host_impl_(layer_tree_host_impl),
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      source_frame_number_(-1),
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      hud_layer_(0),
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      currently_scrolling_layer_(NULL),
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer_scroll_offset_delegate_(NULL),
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      background_color_(0),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_transparent_background_(false),
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      page_scale_layer_(NULL),
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      inner_viewport_scroll_layer_(NULL),
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      outer_viewport_scroll_layer_(NULL),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor_(1),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_delta_(1),
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sent_page_scale_delta_(1),
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_page_scale_factor_(0),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_page_scale_factor_(0),
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scrolling_layer_id_from_previous_tree_(0),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      contents_textures_purged_(false),
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      requires_high_res_to_draw_(false),
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      viewport_size_invalid_(false),
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_update_draw_properties_(true),
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      needs_full_tree_sync_(true),
940de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      next_activation_forces_redraw_(false),
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      has_ever_been_drawn_(false),
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      render_surface_layer_list_id_(0),
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      top_controls_layout_height_(0),
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      top_controls_content_offset_(0),
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      top_controls_delta_(0),
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sent_top_controls_delta_(0) {
1010de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeImpl::~LayerTreeImpl() {
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BreakSwapPromises(SwapPromise::SWAP_FAILS);
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Need to explicitly clear the tree prior to destroying this so that
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the LayerTreeImpl pointer is still valid in the LayerImpl dtor.
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!root_layer_);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(layers_with_copy_output_request_.empty());
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeImpl::Shutdown() { root_layer_.reset(); }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeImpl::ReleaseResources() {
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (root_layer_)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ReleaseResourcesRecursive(root_layer_.get());
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (inner_viewport_scroll_layer_)
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (outer_viewport_scroll_layer_)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  inner_viewport_scroll_delegate_proxy_.reset();
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outer_viewport_scroll_delegate_proxy_.reset();
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer_ = layer.Pass();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  currently_scrolling_layer_ = NULL;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  inner_viewport_scroll_layer_ = NULL;
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outer_viewport_scroll_layer_ = NULL;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  page_scale_layer_ = NULL;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_impl_->OnCanDrawStateChangedForTree();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const {
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return inner_viewport_scroll_layer_;
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const {
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return outer_viewport_scroll_layer_;
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Vector2dF LayerTreeImpl::TotalScrollOffset() const {
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF offset;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (inner_viewport_scroll_layer_)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    offset += inner_viewport_scroll_layer_->TotalScrollOffset();
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (outer_viewport_scroll_layer_)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    offset += outer_viewport_scroll_layer_->TotalScrollOffset();
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return offset;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Vector2dF LayerTreeImpl::TotalMaxScrollOffset() const {
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF offset;
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (inner_viewport_scroll_layer_)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    offset += inner_viewport_scroll_layer_->MaxScrollOffset();
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (outer_viewport_scroll_layer_)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    offset += outer_viewport_scroll_layer_->MaxScrollOffset();
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return offset;
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const {
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(inner_viewport_scroll_layer_);
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF delta = inner_viewport_scroll_layer_->ScrollDelta();
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (outer_viewport_scroll_layer_)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delta += outer_viewport_scroll_layer_->ScrollDelta();
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return delta;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clear all data structures that have direct references to the layer tree.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scrolling_layer_id_from_previous_tree_ =
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0;
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (inner_viewport_scroll_layer_)
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (outer_viewport_scroll_layer_)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  inner_viewport_scroll_delegate_proxy_.reset();
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outer_viewport_scroll_delegate_proxy_.reset();
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  inner_viewport_scroll_layer_ = NULL;
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outer_viewport_scroll_layer_ = NULL;
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  page_scale_layer_ = NULL;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  currently_scrolling_layer_ = NULL;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_surface_layer_list_.clear();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_needs_update_draw_properties();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return root_layer_.Pass();
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The request queue should have been processed and does not require a push.
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK_EQ(ui_resource_request_queue_.size(), 0u);
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (next_activation_forces_redraw_) {
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    target_tree->ForceRedrawNextActivation();
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    next_activation_forces_redraw_ = false;
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  target_tree->PassSwapPromises(&swap_promise_list_);
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target_tree->top_controls_layout_height_ = top_controls_layout_height_;
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target_tree->top_controls_content_offset_ = top_controls_content_offset_;
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target_tree->top_controls_delta_ =
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      target_tree->top_controls_delta_ -
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          target_tree->sent_top_controls_delta_;
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target_tree->sent_top_controls_delta_ = 0.f;
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  target_tree->SetPageScaleValues(
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_scale_factor(), min_page_scale_factor(), max_page_scale_factor(),
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      target_tree->page_scale_delta() / target_tree->sent_page_scale_delta());
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target_tree->set_sent_page_scale_delta(1);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2201675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  target_tree->page_scale_animation_ = page_scale_animation_.Pass();
2211675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (page_scale_layer_ && inner_viewport_scroll_layer_) {
223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    target_tree->SetViewportLayersFromIds(
224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        page_scale_layer_->id(),
225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        inner_viewport_scroll_layer_->id(),
226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                     : Layer::INVALID_ID);
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    target_tree->ClearViewportLayers();
230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  target_tree->RegisterSelection(selection_start_, selection_end_);
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should match the property synchronization in
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // LayerTreeHost::finishCommitOnImplThread().
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target_tree->set_source_frame_number(source_frame_number());
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target_tree->set_background_color(background_color());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target_tree->set_has_transparent_background(has_transparent_background());
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ContentsTexturesPurged())
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_tree->SetContentsTexturesPurged();
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_tree->ResetContentsTexturesPurged();
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ViewportSizeInvalid())
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_tree->SetViewportSizeInvalid();
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_tree->ResetViewportSizeInvalid();
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (hud_layer())
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostCommon::FindLayerInSubtree(
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            target_tree->root_layer(), hud_layer()->id())));
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_tree->set_hud_layer(NULL);
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  target_tree->has_ever_been_drawn_ = false;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const {
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return inner_viewport_scroll_layer_
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             ? inner_viewport_scroll_layer_->scroll_clip_layer()
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             : NULL;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(IsActiveTree());
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return currently_scrolling_layer_;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) {
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (currently_scrolling_layer_ == layer)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (currently_scrolling_layer_ &&
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      currently_scrolling_layer_->scrollbar_animation_controller())
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    currently_scrolling_layer_->scrollbar_animation_controller()
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ->DidScrollEnd();
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  currently_scrolling_layer_ = layer;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer && layer->scrollbar_animation_controller())
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layer->scrollbar_animation_controller()->DidScrollBegin();
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ClearCurrentlyScrollingLayer() {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCurrentlyScrollingLayer(NULL);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scrolling_layer_id_from_previous_tree_ = 0;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ForceScrollbarParameterUpdateAfterScaleChange(LayerImpl* current_layer) {
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!current_layer)
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (current_layer) {
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current_layer->ScrollbarParametersDidChange();
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current_layer = current_layer->parent();
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor,
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float min_page_scale_factor, float max_page_scale_factor) {
305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetPageScaleValues(page_scale_factor, min_page_scale_factor,
306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      max_page_scale_factor, page_scale_delta_);
307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LayerTreeImpl::SetPageScaleDelta(float delta) {
310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetPageScaleValues(page_scale_factor_, min_page_scale_factor_,
311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      max_page_scale_factor_, delta);
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LayerTreeImpl::SetPageScaleValues(float page_scale_factor,
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      float min_page_scale_factor, float max_page_scale_factor,
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      float page_scale_delta) {
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool page_scale_changed =
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      min_page_scale_factor != min_page_scale_factor_ ||
319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      max_page_scale_factor != max_page_scale_factor_ ||
320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_scale_factor != page_scale_factor_;
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  min_page_scale_factor_ = min_page_scale_factor;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  max_page_scale_factor_ = max_page_scale_factor;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  page_scale_factor_ = page_scale_factor;
32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float total = page_scale_factor_ * page_scale_delta;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (min_page_scale_factor_ && total < min_page_scale_factor_)
328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    page_scale_delta = min_page_scale_factor_ / page_scale_factor_;
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (max_page_scale_factor_ && total > max_page_scale_factor_)
330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    page_scale_delta = max_page_scale_factor_ / page_scale_factor_;
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (page_scale_delta_ == page_scale_delta && !page_scale_changed)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (page_scale_delta_ != page_scale_delta) {
336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    page_scale_delta_ = page_scale_delta;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (IsActiveTree()) {
339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree();
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (pending_tree) {
341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        DCHECK_EQ(1, pending_tree->sent_page_scale_delta());
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        pending_tree->SetPageScaleDelta(
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            page_scale_delta_ / sent_page_scale_delta_);
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      }
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    set_needs_update_draw_properties();
348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (root_layer_scroll_offset_delegate_) {
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    root_layer_scroll_offset_delegate_->UpdateRootLayerState(
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        TotalScrollOffset(),
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        TotalMaxScrollOffset(),
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ScrollableSize(),
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        total_page_scale_factor(),
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        min_page_scale_factor_,
357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        max_page_scale_factor_);
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer());
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const {
36403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!InnerViewportContainerLayer())
36503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return gfx::SizeF();
36603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
36703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return gfx::ScaleSize(InnerViewportContainerLayer()->bounds(),
36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        1.0f / total_page_scale_factor());
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerImpl* root_scroll_layer = OuterViewportScrollLayer()
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     ? OuterViewportScrollLayer()
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     : InnerViewportScrollLayer();
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!root_scroll_layer || root_scroll_layer->children().empty())
376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return gfx::Rect();
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerImpl* layer = root_scroll_layer->children()[0];
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MathUtil::MapEnclosingClippedRect(layer->screen_space_transform(),
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           gfx::Rect(layer->content_bounds()));
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  layer->ApplySentScrollDeltasFromAbortedCommit();
384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(IsActiveTree());
388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  page_scale_factor_ *= sent_page_scale_delta_;
390558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  page_scale_delta_ /= sent_page_scale_delta_;
391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  sent_page_scale_delta_ = 1.f;
392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  top_controls_content_offset_ += sent_top_controls_delta_;
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  top_controls_delta_ -= sent_top_controls_delta_;
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sent_top_controls_delta_ = 0.f;
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!root_layer())
398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CallFunctionForSubtree(
4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo));
4023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void ApplyScrollDeltasSinceBeginMainFrameTo(LayerImpl* layer) {
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  layer->ApplyScrollDeltasSinceBeginMainFrame();
4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void LayerTreeImpl::ApplyScrollDeltasSinceBeginMainFrame() {
4093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(IsPendingTree());
4103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!root_layer())
4113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
4123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LayerTreeHostCommon::CallFunctionForSubtree(
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      root_layer(), base::Bind(&ApplyScrollDeltasSinceBeginMainFrameTo));
415558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
416558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::SetViewportLayersFromIds(
418d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int page_scale_layer_id,
419d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int inner_viewport_scroll_layer_id,
420d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int outer_viewport_scroll_layer_id) {
421d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  page_scale_layer_ = LayerById(page_scale_layer_id);
422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(page_scale_layer_);
423d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  inner_viewport_scroll_layer_ =
425d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LayerById(inner_viewport_scroll_layer_id);
426d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(inner_viewport_scroll_layer_);
427d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
428d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  outer_viewport_scroll_layer_ =
429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LayerById(outer_viewport_scroll_layer_id);
430d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(outer_viewport_scroll_layer_ ||
431d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)         outer_viewport_scroll_layer_id == Layer::INVALID_ID);
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!root_layer_scroll_offset_delegate_)
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_,
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         root_layer_scroll_offset_delegate_,
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         this));
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (outer_viewport_scroll_layer_)
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new LayerScrollOffsetDelegateProxy(outer_viewport_scroll_layer_,
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           root_layer_scroll_offset_delegate_,
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           this));
446d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
447d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
448d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::ClearViewportLayers() {
449d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  page_scale_layer_ = NULL;
450d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  inner_viewport_scroll_layer_ = NULL;
451d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  outer_viewport_scroll_layer_ = NULL;
452d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
453d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool LayerTreeImpl::UpdateDrawProperties() {
455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!needs_update_draw_properties_)
456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For max_texture_size.
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_tree_host_impl_->renderer())
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!root_layer())
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  needs_update_draw_properties_ = false;
466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  render_surface_layer_list_.clear();
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    TRACE_EVENT2("cc",
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 "LayerTreeImpl::UpdateDrawProperties",
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 "IsActive",
4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 IsActiveTree(),
4737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 "SourceFrameNumber",
4747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 source_frame_number_);
475d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    LayerImpl* page_scale_layer =
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        page_scale_layer_ ? page_scale_layer_ : InnerViewportContainerLayer();
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool can_render_to_separate_surface =
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (layer_tree_host_impl_->GetDrawMode() !=
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         DRAW_MODE_RESOURCELESS_SOFTWARE);
4800de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4810de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    ++render_surface_layer_list_id_;
482558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    LayerTreeHostCommon::CalcDrawPropsImplInputs inputs(
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root_layer(),
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        DrawViewportSize(),
48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        layer_tree_host_impl_->DrawTransform(),
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_scale_factor(),
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        total_page_scale_factor(),
488d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        page_scale_layer,
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        resource_provider()->max_texture_size(),
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings().can_use_lcd_text,
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        can_render_to_separate_surface,
492b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        settings().layer_transforms_should_scale_layer_contents,
4930de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)        &render_surface_layer_list_,
4940de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)        render_surface_layer_list_id_);
495558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  {
4998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TRACE_EVENT2("cc",
5008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 "LayerTreeImpl::UpdateTilePriorities",
5018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 "IsActive",
5028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 IsActiveTree(),
5038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 "SourceFrameNumber",
5048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 source_frame_number_);
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<OcclusionTracker<LayerImpl> > occlusion_tracker;
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (settings().use_occlusion_for_tile_prioritization) {
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      occlusion_tracker.reset(new OcclusionTracker<LayerImpl>(
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          root_layer()->render_surface()->content_rect()));
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      occlusion_tracker->set_minimum_tracking_size(
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          settings().minimum_occlusion_tracking_size);
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    bool resourceless_software_draw = (layer_tree_host_impl_->GetDrawMode() ==
51434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                       DRAW_MODE_RESOURCELESS_SOFTWARE);
51534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // LayerIterator is used here instead of CallFunctionForSubtree to only
5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // UpdateTilePriorities on layers that will be visible (and thus have valid
5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // draw properties) and not because any ordering is required.
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    typedef LayerIterator<LayerImpl> LayerIteratorType;
5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_);
5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    for (LayerIteratorType it =
5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)             LayerIteratorType::Begin(&render_surface_layer_list_);
5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         it != end;
5248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         ++it) {
525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (occlusion_tracker)
526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        occlusion_tracker->EnterLayer(it);
527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      LayerImpl* layer = *it;
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const Occlusion& occlusion_in_content_space =
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          occlusion_tracker ? occlusion_tracker->GetCurrentOcclusionForLayer(
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  layer->draw_transform())
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            : Occlusion();
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      if (it.represents_itself()) {
53534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        layer->UpdateTiles(occlusion_in_content_space,
53634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                           resourceless_software_draw);
53734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      }
538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (!it.represents_contributing_render_surface()) {
540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        if (occlusion_tracker)
541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          occlusion_tracker->LeaveLayer(it);
542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        continue;
543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      }
5448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
54534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      if (layer->mask_layer()) {
54634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        layer->mask_layer()->UpdateTiles(occlusion_in_content_space,
54734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                         resourceless_software_draw);
54834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      }
54934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      if (layer->replica_layer() && layer->replica_layer()->mask_layer()) {
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        layer->replica_layer()->mask_layer()->UpdateTiles(
55134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)            occlusion_in_content_space, resourceless_software_draw);
55234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      }
553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (occlusion_tracker)
555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        occlusion_tracker->LeaveLayer(it);
5568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
5578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
5588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!needs_update_draw_properties_) <<
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "CalcDrawProperties should not set_needs_update_draw_properties()";
561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return true;
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If this assert triggers, then the list is dirty.
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!needs_update_draw_properties_);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return render_surface_layer_list_;
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size LayerTreeImpl::ScrollableSize() const {
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerImpl* root_scroll_layer = OuterViewportScrollLayer()
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     ? OuterViewportScrollLayer()
5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     : InnerViewportScrollLayer();
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!root_scroll_layer || root_scroll_layer->children().empty())
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return root_scroll_layer->children()[0]->bounds();
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::LayerById(int id) {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerIdMap::iterator iter = layer_id_map_.find(id);
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return iter != layer_id_map_.end() ? iter->second : NULL;
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::RegisterLayer(LayerImpl* layer) {
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!LayerById(layer->id()));
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_id_map_[layer->id()] = layer;
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) {
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(LayerById(layer->id()));
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_id_map_.erase(layer->id());
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsize_t LayerTreeImpl::NumLayers() {
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return layer_id_map_.size();
596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::PushPersistedState(LayerTreeImpl* pending_tree) {
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pending_tree->SetCurrentlyScrollingLayer(
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      LayerTreeHostCommon::FindLayerInSubtree(pending_tree->root_layer(),
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0));
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void DidBecomeActiveRecursive(LayerImpl* layer) {
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->DidBecomeActive();
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (layer->mask_layer())
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    layer->mask_layer()->DidBecomeActive();
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (layer->replica_layer() && layer->replica_layer()->mask_layer())
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    layer->replica_layer()->mask_layer()->DidBecomeActive();
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < layer->children().size(); ++i)
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DidBecomeActiveRecursive(layer->children()[i]);
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::DidBecomeActive() {
616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (next_activation_forces_redraw_) {
617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    layer_tree_host_impl_->SetFullRootLayerDamage();
618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    next_activation_forces_redraw_ = false;
619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (scrolling_layer_id_from_previous_tree_) {
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree(
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        root_layer(), scrolling_layer_id_from_previous_tree_);
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Always reset this flag on activation, as we would only have activated
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // if we were in a good state.
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ResetRequiresHighResToDraw();
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (root_layer())
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DidBecomeActiveRecursive(root_layer());
632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  devtools_instrumentation::DidActivateLayerTree(layer_tree_host_impl_->id(),
634f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                 source_frame_number_);
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ContentsTexturesPurged() const {
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return contents_textures_purged_;
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetContentsTexturesPurged() {
6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (contents_textures_purged_)
6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_textures_purged_ = true;
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_impl_->OnCanDrawStateChangedForTree();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetContentsTexturesPurged() {
6497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!contents_textures_purged_)
6507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_textures_purged_ = false;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_impl_->OnCanDrawStateChangedForTree();
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeImpl::SetRequiresHighResToDraw() {
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  requires_high_res_to_draw_ = true;
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeImpl::ResetRequiresHighResToDraw() {
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  requires_high_res_to_draw_ = false;
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool LayerTreeImpl::RequiresHighResToDraw() const {
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return requires_high_res_to_draw_;
6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::ViewportSizeInvalid() const {
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return viewport_size_invalid_;
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetViewportSizeInvalid() {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  viewport_size_invalid_ = true;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_impl_->OnCanDrawStateChangedForTree();
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::ResetViewportSizeInvalid() {
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  viewport_size_invalid_ = false;
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_impl_->OnCanDrawStateChangedForTree();
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Proxy* LayerTreeImpl::proxy() const {
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->proxy();
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeSettings& LayerTreeImpl::settings() const {
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->settings();
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const RendererCapabilitiesImpl& LayerTreeImpl::GetRendererCapabilities() const {
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->GetRendererCapabilities();
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)ContextProvider* LayerTreeImpl::context_provider() const {
6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return output_surface()->context_provider();
6953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OutputSurface* LayerTreeImpl::output_surface() const {
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->output_surface();
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceProvider* LayerTreeImpl::resource_provider() const {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->resource_provider();
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TileManager* LayerTreeImpl::tile_manager() const {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->tile_manager();
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FrameRateCounter* LayerTreeImpl::frame_rate_counter() const {
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->fps_counter();
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PaintTimeCounter* LayerTreeImpl::paint_time_counter() const {
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->paint_time_counter();
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MemoryHistory* LayerTreeImpl::memory_history() const {
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->memory_history();
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liugfx::Size LayerTreeImpl::device_viewport_size() const {
7225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return layer_tree_host_impl_->device_viewport_size();
7235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsActiveTree() const {
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->active_tree() == this;
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsPendingTree() const {
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->pending_tree() == this;
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::IsRecycleTree() const {
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->recycle_tree() == this;
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindActiveTreeLayerById(int id) {
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeImpl* tree = layer_tree_host_impl_->active_tree();
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tree)
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tree->LayerById(id);
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindPendingTreeLayerById(int id) {
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeImpl* tree = layer_tree_host_impl_->pending_tree();
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tree)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tree->LayerById(id);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LayerImpl* LayerTreeImpl::FindRecycleTreeLayerById(int id) {
7525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  LayerTreeImpl* tree = layer_tree_host_impl_->recycle_tree();
7535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!tree)
7545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return NULL;
7555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return tree->LayerById(id);
7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeImpl::PinchGestureActive() const {
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->pinch_gesture_active();
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)BeginFrameArgs LayerTreeImpl::CurrentBeginFrameArgs() const {
76303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return layer_tree_host_impl_->CurrentBeginFrameArgs();
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)base::TimeDelta LayerTreeImpl::begin_impl_frame_interval() const {
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return layer_tree_host_impl_->begin_impl_frame_interval();
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsCommit() {
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_impl_->SetNeedsCommit();
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::Rect LayerTreeImpl::DeviceViewport() const {
7755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return layer_tree_host_impl_->DeviceViewport();
7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Size LayerTreeImpl::DrawViewportSize() const {
77958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return layer_tree_host_impl_->DrawViewportSize();
78058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
78158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const gfx::Rect LayerTreeImpl::ViewportRectForTilePriority() const {
7835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return layer_tree_host_impl_->ViewportRectForTilePriority();
7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_ptr<ScrollbarAnimationController>
787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)LayerTreeImpl::CreateScrollbarAnimationController(LayerImpl* scrolling_layer) {
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(settings().scrollbar_fade_delay_ms);
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(settings().scrollbar_fade_duration_ms);
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeDelta delay =
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(settings().scrollbar_fade_delay_ms);
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeDelta duration =
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(settings().scrollbar_fade_duration_ms);
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switch (settings().scrollbar_animator) {
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case LayerTreeSettings::LinearFade: {
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return ScrollbarAnimationControllerLinearFade::Create(
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 scrolling_layer, layer_tree_host_impl_, delay, duration)
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .PassAs<ScrollbarAnimationController>();
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case LayerTreeSettings::Thinning: {
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return ScrollbarAnimationControllerThinning::Create(
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 scrolling_layer, layer_tree_host_impl_, delay, duration)
803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .PassAs<ScrollbarAnimationController>();
804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case LayerTreeSettings::NoAnimator:
806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      NOTREACHED();
807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return scoped_ptr<ScrollbarAnimationController>();
81058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
81158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
812a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeImpl::DidAnimateScrollOffset() {
813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  layer_tree_host_impl_->DidAnimateScrollOffset();
814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LayerTreeImpl::use_gpu_rasterization() const {
817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return layer_tree_host_impl_->use_gpu_rasterization();
818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LayerTreeImpl::create_low_res_tiling() const {
821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return layer_tree_host_impl_->create_low_res_tiling();
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeImpl::SetNeedsRedraw() {
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_impl_->SetNeedsRedraw();
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeDebugState& LayerTreeImpl::debug_state() const {
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->debug_state();
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float LayerTreeImpl::device_scale_factor() const {
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->device_scale_factor();
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory* LayerTreeImpl::debug_rect_history() const {
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->debug_rect_history();
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AnimationRegistrar* LayerTreeImpl::animationRegistrar() const {
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_impl_->animation_registrar();
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LayerTreeImpl::GetAllTilesForTracing(std::set<const Tile*>* tiles) const {
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef LayerIterator<LayerImpl> LayerIteratorType;
8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_);
8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (LayerIteratorType it =
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           LayerIteratorType::Begin(&render_surface_layer_list_);
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != end;
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++it) {
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!it.represents_itself())
8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LayerImpl* layer_impl = *it;
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    layer_impl->GetAllTilesForTracing(tiles);
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LayerTreeImpl::AsValueInto(base::debug::TracedValue* state) const {
8595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TracedValue::MakeDictIntoImplicitSnapshot(state, "cc::LayerTreeImpl", this);
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->SetInteger("source_frame_number", source_frame_number_);
861b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
8625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->BeginDictionary("root_layer");
8635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  root_layer_->AsValueInto(state);
8645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->EndDictionary();
865b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
8665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->BeginArray("render_surface_layer_list");
8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef LayerIterator<LayerImpl> LayerIteratorType;
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_);
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (LayerIteratorType it = LayerIteratorType::Begin(
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           &render_surface_layer_list_); it != end; ++it) {
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!it.represents_itself())
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
8735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TracedValue::AppendIDRef(*it, state);
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->EndArray();
8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->BeginArray("swap_promise_trace_ids");
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < swap_promise_list_.size(); i++)
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    state->AppendDouble(swap_promise_list_[i]->TraceId());
8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->EndArray();
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
884a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
88568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate)
88668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
88768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!root_layer_scroll_offset_delegate) {
8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make sure we remove the proxies from their layers before
8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // releasing them.
8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (InnerViewportScrollLayer())
8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (OuterViewportScrollLayer())
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    inner_viewport_scroll_delegate_proxy_.reset();
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    outer_viewport_scroll_delegate_proxy_.reset();
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
89868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
90168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (root_layer_scroll_offset_delegate_) {
902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    root_layer_scroll_offset_delegate_->UpdateRootLayerState(
903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        TotalScrollOffset(),
904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        TotalMaxScrollOffset(),
905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ScrollableSize(),
9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        total_page_scale_factor(),
9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        min_page_scale_factor(),
9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        max_page_scale_factor());
9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (inner_viewport_scroll_layer_) {
9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(),
9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             root_layer_scroll_offset_delegate_,
9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             this));
9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      inner_viewport_scroll_layer_->SetScrollOffsetDelegate(
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          inner_viewport_scroll_delegate_proxy_.get());
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (outer_viewport_scroll_layer_) {
9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(),
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             root_layer_scroll_offset_delegate_,
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             this));
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          outer_viewport_scroll_delegate_proxy_.get());
9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
92768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeImpl::UpdateScrollOffsetDelegate() {
9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(InnerViewportScrollLayer());
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(root_layer_scroll_offset_delegate_);
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF offset =
9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (OuterViewportScrollLayer())
9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  root_layer_scroll_offset_delegate_->UpdateRootLayerState(
941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      offset,
942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      TotalMaxScrollOffset(),
943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ScrollableSize(),
944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      total_page_scale_factor(),
945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      min_page_scale_factor(),
946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      max_page_scale_factor());
9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) {
9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(root_layer_scroll_offset_delegate_);
9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(InnerViewportScrollLayer());
9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer())
9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If we get here, we have both inner/outer viewports, and need to distribute
9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the scroll offset between them.
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(inner_viewport_scroll_delegate_proxy_);
9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(outer_viewport_scroll_delegate_proxy_);
9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF inner_viewport_offset =
9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF outer_viewport_offset =
9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It may be nothing has changed.
9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF delegate_offset =
9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (inner_viewport_offset + outer_viewport_offset == delegate_offset) {
9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (layer == InnerViewportScrollLayer())
9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return inner_viewport_offset;
9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return outer_viewport_offset;
9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2d max_outer_viewport_scroll_offset =
9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OuterViewportScrollLayer()->MaxScrollOffset();
9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outer_viewport_offset = delegate_offset - inner_viewport_offset;
9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outer_viewport_offset.SetToMax(gfx::Vector2d());
9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (layer == OuterViewportScrollLayer())
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return outer_viewport_offset;
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  inner_viewport_offset = delegate_offset - outer_viewport_offset;
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return inner_viewport_offset;
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
989f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) {
990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(swap_promise);
991f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  swap_promise_list_.push_back(swap_promise.Pass());
992f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeImpl::PassSwapPromises(
995f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ScopedPtrVector<SwapPromise>* new_swap_promise) {
996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  swap_promise_list_.insert_and_take(swap_promise_list_.end(),
9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     new_swap_promise);
998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  new_swap_promise->clear();
999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeImpl::FinishSwapPromises(CompositorFrameMetadata* metadata) {
1002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < swap_promise_list_.size(); i++)
1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    swap_promise_list_[i]->DidSwap(metadata);
1004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  swap_promise_list_.clear();
1005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeImpl::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) {
1008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < swap_promise_list_.size(); i++)
1009f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    swap_promise_list_[i]->DidNotSwap(reason);
1010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  swap_promise_list_.clear();
1011f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1012f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1013d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeImpl::DidModifyTilePriorities() {
1014d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  layer_tree_host_impl_->DidModifyTilePriorities();
101590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
101690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1017a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeImpl::set_ui_resource_request_queue(
1018a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const UIResourceRequestQueue& queue) {
1019a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ui_resource_request_queue_ = queue;
1020a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1021a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1022a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ResourceProvider::ResourceId LayerTreeImpl::ResourceIdForUIResource(
1023a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    UIResourceId uid) const {
1024a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return layer_tree_host_impl_->ResourceIdForUIResource(uid);
1025a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1026a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
10271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool LayerTreeImpl::IsUIResourceOpaque(UIResourceId uid) const {
10281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return layer_tree_host_impl_->IsUIResourceOpaque(uid);
10291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
10301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1031a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeImpl::ProcessUIResourceRequestQueue() {
1032a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  while (ui_resource_request_queue_.size() > 0) {
1033a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    UIResourceRequest req = ui_resource_request_queue_.front();
1034a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ui_resource_request_queue_.pop_front();
1035a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
103668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    switch (req.GetType()) {
1037a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case UIResourceRequest::UIResourceCreate:
103868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        layer_tree_host_impl_->CreateUIResource(req.GetId(), req.GetBitmap());
1039a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1040a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      case UIResourceRequest::UIResourceDelete:
104168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        layer_tree_host_impl_->DeleteUIResource(req.GetId());
1042a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1043424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case UIResourceRequest::UIResourceInvalidRequest:
1044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        NOTREACHED();
1045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
1046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
1047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
104858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
104958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // If all UI resource evictions were not recreated by processing this queue,
105058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // then another commit is required.
105158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (layer_tree_host_impl_->EvictedUIResourcesExist())
105258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    layer_tree_host_impl_->SetNeedsCommit();
1053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
10557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeImpl::AddLayerWithCopyOutputRequest(LayerImpl* layer) {
10567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Only the active tree needs to know about layers with copy requests, as
10577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // they are aborted if not serviced during draw.
10587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(IsActiveTree());
10597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // DCHECK(std::find(layers_with_copy_output_request_.begin(),
10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //                 layers_with_copy_output_request_.end(),
10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //                 layer) == layers_with_copy_output_request_.end());
10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(danakj): Remove this once crash is found crbug.com/309777
10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < layers_with_copy_output_request_.size(); ++i) {
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK(layers_with_copy_output_request_[i] != layer)
10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        << i << " of " << layers_with_copy_output_request_.size();
10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
10687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  layers_with_copy_output_request_.push_back(layer);
10697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
10707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeImpl::RemoveLayerWithCopyOutputRequest(LayerImpl* layer) {
10727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Only the active tree needs to know about layers with copy requests, as
10737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // they are aborted if not serviced during draw.
10747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(IsActiveTree());
10757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<LayerImpl*>::iterator it = std::find(
10777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      layers_with_copy_output_request_.begin(),
10787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      layers_with_copy_output_request_.end(),
10797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      layer);
10807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(it != layers_with_copy_output_request_.end());
1081fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  layers_with_copy_output_request_.erase(it);
10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(danakj): Remove this once crash is found crbug.com/309777
10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < layers_with_copy_output_request_.size(); ++i) {
10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK(layers_with_copy_output_request_[i] != layer)
10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        << i << " of " << layers_with_copy_output_request_.size();
10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
10887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
10897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1090a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest()
10917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const {
10927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Only the active tree needs to know about layers with copy requests, as
10937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // they are aborted if not serviced during draw.
10947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(IsActiveTree());
10957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return layers_with_copy_output_request_;
10977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
10987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeImpl::ReleaseResourcesRecursive(LayerImpl* current) {
1100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(current);
1101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  current->ReleaseResources();
1102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (current->mask_layer())
1103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ReleaseResourcesRecursive(current->mask_layer());
1104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (current->replica_layer())
1105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ReleaseResourcesRecursive(current->replica_layer());
1106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < current->children().size(); ++i)
1107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ReleaseResourcesRecursive(current->children()[i]);
1108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)template <typename LayerType>
1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static inline bool LayerClipsSubtree(LayerType* layer) {
1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return layer->masks_to_bounds() || layer->mask_layer();
1113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static bool PointHitsRect(
1116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::PointF& screen_space_point,
1117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Transform& local_space_to_screen_space_transform,
1118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::RectF& local_space_rect,
1119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    float* distance_to_camera) {
1120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If the transform is not invertible, then assume that this point doesn't hit
1121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // this rect.
1122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Transform inverse_local_space_to_screen_space(
1123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::Transform::kSkipInitialization);
1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!local_space_to_screen_space_transform.GetInverse(
1125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &inverse_local_space_to_screen_space))
1126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Transform the hit test point from screen space to the local space of the
1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // given rect.
1130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool clipped = false;
1131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Point3F planar_point = MathUtil::ProjectPoint3D(
1132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      inverse_local_space_to_screen_space, screen_space_point, &clipped);
1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::PointF hit_test_point_in_local_space =
1134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::PointF(planar_point.x(), planar_point.y());
1135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If ProjectPoint could not project to a valid value, then we assume that
1137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // this point doesn't hit this rect.
1138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (clipped)
1139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!local_space_rect.Contains(hit_test_point_in_local_space))
1142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (distance_to_camera) {
1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // To compute the distance to the camera, we have to take the planar point
1146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // and pull it back to world space and compute the displacement along the
1147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // z-axis.
1148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Point3F planar_point_in_screen_space(planar_point);
1149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    local_space_to_screen_space_transform.TransformPoint(
1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        &planar_point_in_screen_space);
1151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    *distance_to_camera = planar_point_in_screen_space.z();
1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
1155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static bool PointHitsRegion(const gfx::PointF& screen_space_point,
1158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            const gfx::Transform& screen_space_transform,
1159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            const Region& layer_space_region,
1160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            float layer_content_scale_x,
1161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            float layer_content_scale_y) {
1162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If the transform is not invertible, then assume that this point doesn't hit
1163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // this region.
1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Transform inverse_screen_space_transform(
1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::Transform::kSkipInitialization);
1166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!screen_space_transform.GetInverse(&inverse_screen_space_transform))
1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Transform the hit test point from screen space to the local space of the
1170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // given region.
1171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool clipped = false;
1172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::PointF hit_test_point_in_content_space = MathUtil::ProjectPoint(
1173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      inverse_screen_space_transform, screen_space_point, &clipped);
1174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::PointF hit_test_point_in_layer_space =
1175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::ScalePoint(hit_test_point_in_content_space,
1176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      1.f / layer_content_scale_x,
1177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      1.f / layer_content_scale_y);
1178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If ProjectPoint could not project to a valid value, then we assume that
1180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // this point doesn't hit this region.
1181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (clipped)
1182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return layer_space_region.Contains(
1185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::ToRoundedPoint(hit_test_point_in_layer_space));
1186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1188116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic const LayerImpl* GetNextClippingLayer(const LayerImpl* layer) {
1189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (layer->scroll_parent())
1190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return layer->scroll_parent();
1191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (layer->clip_parent())
1192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return layer->clip_parent();
1193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return layer->parent();
1194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static bool PointIsClippedBySurfaceOrClipRect(
1197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::PointF& screen_space_point,
1198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const LayerImpl* layer) {
1199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Walk up the layer tree and hit-test any render_surfaces and any layer
1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // clip rects that are active.
1201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (; layer; layer = GetNextClippingLayer(layer)) {
1202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (layer->render_surface() &&
1203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        !PointHitsRect(screen_space_point,
1204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       layer->render_surface()->screen_space_transform(),
1205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       layer->render_surface()->content_rect(),
1206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       NULL))
1207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
1208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (LayerClipsSubtree(layer) &&
1210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        !PointHitsRect(screen_space_point,
1211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       layer->screen_space_transform(),
1212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       gfx::Rect(layer->content_bounds()),
1213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       NULL))
1214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
1215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If we have finished walking all ancestors without having already exited,
1218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // then the point is not clipped by any ancestors.
1219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
1220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1222116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic bool PointHitsLayer(const LayerImpl* layer,
1223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           const gfx::PointF& screen_space_point,
1224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           float* distance_to_intersection) {
1225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::RectF content_rect(layer->content_bounds());
1226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!PointHitsRect(screen_space_point,
1227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     layer->screen_space_transform(),
1228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     content_rect,
1229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     distance_to_intersection))
1230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // At this point, we think the point does hit the layer, but we need to walk
1233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // up the parents to ensure that the layer was not clipped in such a way
1234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // that the hit point actually should not hit the layer.
1235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer))
1236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Skip the HUD layer.
1239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (layer == layer->layer_tree_impl()->hud_layer())
1240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
1243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct FindClosestMatchingLayerDataForRecursion {
1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindClosestMatchingLayerDataForRecursion()
1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : closest_match(NULL),
1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        closest_distance(-std::numeric_limits<float>::infinity()) {}
1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LayerImpl* closest_match;
1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Note that the positive z-axis points towards the camera, so bigger means
1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // closer in this case, counterintuitively.
1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  float closest_distance;
1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)template <typename Functor>
1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static void FindClosestMatchingLayer(
1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::PointF& screen_space_point,
1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LayerImpl* layer,
1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const Functor& func,
1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FindClosestMatchingLayerDataForRecursion* data_for_recursion) {
1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (int i = layer->children().size() - 1; i >= 0; --i) {
1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FindClosestMatchingLayer(
1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        screen_space_point, layer->children()[i], func, data_for_recursion);
1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  float distance_to_intersection = 0.f;
1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (func(layer) &&
1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PointHitsLayer(layer, screen_space_point, &distance_to_intersection) &&
1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ((!data_for_recursion->closest_match ||
1270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        distance_to_intersection > data_for_recursion->closest_distance))) {
1271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_for_recursion->closest_distance = distance_to_intersection;
1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_for_recursion->closest_match = layer;
1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static bool ScrollsAnyDrawnRenderSurfaceLayerListMember(LayerImpl* layer) {
1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!layer->scrollable())
1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (layer->IsDrawnRenderSurfaceLayerListMember())
1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
1281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!layer->scroll_children())
1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (std::set<LayerImpl*>::const_iterator it =
1284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           layer->scroll_children()->begin();
1285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       it != layer->scroll_children()->end();
1286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ++it) {
1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if ((*it)->IsDrawnRenderSurfaceLayerListMember())
1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
1289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
1291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct FindScrollingLayerFunctor {
1294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool operator()(LayerImpl* layer) const {
1295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return ScrollsAnyDrawnRenderSurfaceLayerListMember(layer);
1296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
1298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)LayerImpl* LayerTreeImpl::FindFirstScrollingLayerThatIsHitByPoint(
1300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::PointF& screen_space_point) {
1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindClosestMatchingLayerDataForRecursion data_for_recursion;
1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindClosestMatchingLayer(screen_space_point,
1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           root_layer(),
1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           FindScrollingLayerFunctor(),
1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           &data_for_recursion);
1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return data_for_recursion.closest_match;
1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct HitTestVisibleScrollableOrTouchableFunctor {
1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool operator()(LayerImpl* layer) const {
1311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return layer->IsDrawnRenderSurfaceLayerListMember() ||
1312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           ScrollsAnyDrawnRenderSurfaceLayerListMember(layer) ||
1313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           !layer->touch_event_handler_region().IsEmpty() ||
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           layer->have_wheel_event_handlers();
1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
1317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPoint(
1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::PointF& screen_space_point) {
1320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!root_layer())
1321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return NULL;
1322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!UpdateDrawProperties())
1323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return NULL;
1324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindClosestMatchingLayerDataForRecursion data_for_recursion;
1325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindClosestMatchingLayer(screen_space_point,
1326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           root_layer(),
1327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           HitTestVisibleScrollableOrTouchableFunctor(),
1328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           &data_for_recursion);
1329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return data_for_recursion.closest_match;
1330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static bool LayerHasTouchEventHandlersAt(const gfx::PointF& screen_space_point,
1333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         LayerImpl* layer_impl) {
1334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (layer_impl->touch_event_handler_region().IsEmpty())
1335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!PointHitsRegion(screen_space_point,
1338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       layer_impl->screen_space_transform(),
1339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       layer_impl->touch_event_handler_region(),
1340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       layer_impl->contents_scale_x(),
1341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       layer_impl->contents_scale_y()))
1342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // At this point, we think the point does hit the touch event handler region
1345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // on the layer, but we need to walk up the parents to ensure that the layer
1346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // was not clipped in such a way that the hit point actually should not hit
1347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the layer.
1348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl))
1349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
1352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct FindTouchEventLayerFunctor {
1355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool operator()(LayerImpl* layer) const {
1356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return LayerHasTouchEventHandlersAt(screen_space_point, layer);
1357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const gfx::PointF screen_space_point;
1359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
1360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion(
1362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::PointF& screen_space_point) {
1363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!root_layer())
1364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return NULL;
1365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!UpdateDrawProperties())
1366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return NULL;
1367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindTouchEventLayerFunctor func = {screen_space_point};
1368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindClosestMatchingLayerDataForRecursion data_for_recursion;
1369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FindClosestMatchingLayer(
1370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      screen_space_point, root_layer(), func, &data_for_recursion);
1371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return data_for_recursion.closest_match;
1372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1374116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid LayerTreeImpl::RegisterSelection(const LayerSelectionBound& start,
1375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      const LayerSelectionBound& end) {
1376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  selection_start_ = start;
1377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  selection_end_ = end;
1378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1380116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic ViewportSelectionBound ComputeViewportSelection(
138103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const LayerSelectionBound& layer_bound,
1382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LayerImpl* layer,
1383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    float device_scale_factor) {
138403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ViewportSelectionBound viewport_bound;
138503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  viewport_bound.type = layer_bound.type;
1386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
138703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!layer || layer_bound.type == SELECTION_BOUND_EMPTY)
138803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return viewport_bound;
1389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
139003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::PointF layer_scaled_top = gfx::ScalePoint(layer_bound.edge_top,
139103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                 layer->contents_scale_x(),
139203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                 layer->contents_scale_y());
139303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::PointF layer_scaled_bottom = gfx::ScalePoint(layer_bound.edge_bottom,
139403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                    layer->contents_scale_x(),
139503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                    layer->contents_scale_y());
1396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
139703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool clipped = false;
139803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::PointF screen_top = MathUtil::MapPoint(
139903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      layer->screen_space_transform(), layer_scaled_top, &clipped);
140003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::PointF screen_bottom = MathUtil::MapPoint(
140103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      layer->screen_space_transform(), layer_scaled_bottom, &clipped);
140203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
140303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const float inv_scale = 1.f / device_scale_factor;
140403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  viewport_bound.edge_top = gfx::ScalePoint(screen_top, inv_scale);
140503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  viewport_bound.edge_bottom = gfx::ScalePoint(screen_bottom, inv_scale);
140603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
140703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // The bottom edge point is used for visibility testing as it is the logical
1408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // focal point for bound selection handles (this may change in the future).
140903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Shifting the visibility point fractionally inward ensures that neighboring
141003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // or logically coincident layers aligned to integral DPI coordinates will not
141103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // spuriously occlude the bound.
141203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Vector2dF visibility_offset = layer_scaled_top - layer_scaled_bottom;
141303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  visibility_offset.Scale(device_scale_factor / visibility_offset.Length());
141403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::PointF visibility_point = layer_scaled_bottom + visibility_offset;
141503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (visibility_point.x() <= 0)
141603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    visibility_point.set_x(visibility_point.x() + device_scale_factor);
141703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  visibility_point = MathUtil::MapPoint(
141803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      layer->screen_space_transform(), visibility_point, &clipped);
1419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
142003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  float intersect_distance = 0.f;
142103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  viewport_bound.visible =
142203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      PointHitsLayer(layer, visibility_point, &intersect_distance);
1423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
142403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return viewport_bound;
1425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1427116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid LayerTreeImpl::GetViewportSelection(ViewportSelectionBound* start,
1428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         ViewportSelectionBound* end) {
1429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(start);
1430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(end);
1431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *start = ComputeViewportSelection(
1433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      selection_start_,
1434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      selection_start_.layer_id ? LayerById(selection_start_.layer_id) : NULL,
1435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      device_scale_factor());
1436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (start->type == SELECTION_BOUND_CENTER ||
1437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      start->type == SELECTION_BOUND_EMPTY) {
1438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *end = *start;
1439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
1440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *end = ComputeViewportSelection(
1441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        selection_end_,
1442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        selection_end_.layer_id ? LayerById(selection_end_.layer_id) : NULL,
1443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        device_scale_factor());
1444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LayerTreeImpl::RegisterPictureLayerImpl(PictureLayerImpl* layer) {
1448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  layer_tree_host_impl_->RegisterPictureLayerImpl(layer);
1449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LayerTreeImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
1452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  layer_tree_host_impl_->UnregisterPictureLayerImpl(layer);
1453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1455116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid LayerTreeImpl::InputScrollAnimationFinished() {
1456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  layer_tree_host_impl_->ScrollEnd();
1457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
14591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBlockingTaskRunner* LayerTreeImpl::BlockingMainThreadTaskRunner() const {
14601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return proxy()->blocking_main_thread_task_runner();
14611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14631675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochvoid LayerTreeImpl::SetPageScaleAnimation(const gfx::Vector2d& target_offset,
14641675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                                          bool anchor_point,
14651675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                                          float page_scale,
14661675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                                          base::TimeDelta duration) {
14671675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  if (!InnerViewportScrollLayer())
14681675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    return;
14691675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
14701675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  gfx::Vector2dF scroll_total = TotalScrollOffset();
14711675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  gfx::SizeF scaled_scrollable_size = ScrollableSize();
14721675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  gfx::SizeF viewport_size = InnerViewportContainerLayer()->bounds();
14731675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
14741675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  // Easing constants experimentally determined.
14751675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  scoped_ptr<TimingFunction> timing_function =
14761675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>();
14771675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
14781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  // TODO(miletus) : Pass in ScrollOffset.
14791675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  page_scale_animation_ = PageScaleAnimation::Create(scroll_total,
14801675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                                                     total_page_scale_factor(),
14811675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                                                     viewport_size,
14821675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                                                     scaled_scrollable_size,
14831675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                                                     timing_function.Pass());
14841675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
14851675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  if (anchor_point) {
14861675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    gfx::Vector2dF anchor(target_offset);
14871675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    page_scale_animation_->ZoomWithAnchor(
14881675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch        anchor, page_scale, duration.InSecondsF());
14891675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  } else {
14901675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    gfx::Vector2dF scaled_target_offset = target_offset;
14911675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    page_scale_animation_->ZoomTo(
14921675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch        scaled_target_offset, page_scale, duration.InSecondsF());
14931675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  }
14941675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
14951675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
14961675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochscoped_ptr<PageScaleAnimation> LayerTreeImpl::TakePageScaleAnimation() {
14971675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  return page_scale_animation_.Pass();
14981675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
14991675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
1501