| Index: cc/trees/layer_tree_impl.cc
|
| diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
|
| index 52203129e4847b5437ef6559bf254f034eb4f9bb..47c71cb8756a8149f31a95b55e91023034b1e214 100644
|
| --- a/cc/trees/layer_tree_impl.cc
|
| +++ b/cc/trees/layer_tree_impl.cc
|
| @@ -23,7 +23,6 @@ LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
|
| : layer_tree_host_impl_(layer_tree_host_impl),
|
| source_frame_number_(-1),
|
| hud_layer_(0),
|
| - root_scroll_layer_(NULL),
|
| currently_scrolling_layer_(NULL),
|
| root_layer_scroll_offset_delegate_(NULL),
|
| background_color_(0),
|
| @@ -50,57 +49,73 @@ LayerTreeImpl::~LayerTreeImpl() {
|
| root_layer_.reset();
|
| }
|
|
|
| -static LayerImpl* FindRootScrollLayerRecursive(LayerImpl* layer) {
|
| - if (!layer)
|
| - return NULL;
|
| +void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
|
| + if (inner_viewport_scroll_layer_)
|
| + inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| + if (outer_viewport_scroll_layer_)
|
| + outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
|
|
| - if (layer->scrollable())
|
| - return layer;
|
| + root_layer_ = layer.Pass();
|
| + currently_scrolling_layer_ = NULL;
|
| + inner_viewport_scroll_layer_ = NULL;
|
| + outer_viewport_scroll_layer_ = NULL;
|
| + page_scale_layer_ = NULL;
|
|
|
| - for (size_t i = 0; i < layer->children().size(); ++i) {
|
| - LayerImpl* found = FindRootScrollLayerRecursive(layer->children()[i]);
|
| - if (found)
|
| - return found;
|
| - }
|
| + layer_tree_host_impl_->OnCanDrawStateChangedForTree();
|
| +}
|
|
|
| - return NULL;
|
| +LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const {
|
| + return inner_viewport_scroll_layer_;
|
| }
|
|
|
| -void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
|
| - if (root_scroll_layer_)
|
| - root_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| - root_layer_ = layer.Pass();
|
| - currently_scrolling_layer_ = NULL;
|
| - root_scroll_layer_ = NULL;
|
| +LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const {
|
| + return outer_viewport_scroll_layer_;
|
| +}
|
|
|
| - layer_tree_host_impl_->OnCanDrawStateChangedForTree();
|
| +gfx::Vector2dF LayerTreeImpl::TotalScrollOffset() const {
|
| + gfx::Vector2dF offset;
|
| +
|
| + if (inner_viewport_scroll_layer_)
|
| + offset += inner_viewport_scroll_layer_->TotalScrollOffset();
|
| +
|
| + if (outer_viewport_scroll_layer_)
|
| + offset += outer_viewport_scroll_layer_->TotalScrollOffset();
|
| +
|
| + return offset;
|
| }
|
|
|
| -void LayerTreeImpl::FindRootScrollLayer() {
|
| - root_scroll_layer_ = FindRootScrollLayerRecursive(root_layer_.get());
|
| +gfx::Vector2dF LayerTreeImpl::TotalMaxScrollOffset() const {
|
| + gfx::Vector2dF offset;
|
|
|
| - if (root_scroll_layer_) {
|
| - UpdateMaxScrollOffset();
|
| - root_scroll_layer_->SetScrollOffsetDelegate(
|
| - root_layer_scroll_offset_delegate_);
|
| - }
|
| + if (inner_viewport_scroll_layer_)
|
| + offset += inner_viewport_scroll_layer_->MaxScrollOffset();
|
|
|
| - if (scrolling_layer_id_from_previous_tree_) {
|
| - currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree(
|
| - root_layer_.get(),
|
| - scrolling_layer_id_from_previous_tree_);
|
| - }
|
| + if (outer_viewport_scroll_layer_)
|
| + offset += outer_viewport_scroll_layer_->MaxScrollOffset();
|
|
|
| - scrolling_layer_id_from_previous_tree_ = 0;
|
| + return offset;
|
| +}
|
| +gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const {
|
| + DCHECK(inner_viewport_scroll_layer_);
|
| + gfx::Vector2dF delta = inner_viewport_scroll_layer_->ScrollDelta();
|
| +
|
| + if (outer_viewport_scroll_layer_)
|
| + delta += outer_viewport_scroll_layer_->ScrollDelta();
|
| +
|
| + return delta;
|
| }
|
|
|
| scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() {
|
| // Clear all data structures that have direct references to the layer tree.
|
| scrolling_layer_id_from_previous_tree_ =
|
| currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0;
|
| - if (root_scroll_layer_)
|
| - root_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| - root_scroll_layer_ = NULL;
|
| + if (inner_viewport_scroll_layer_)
|
| + inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| + if (outer_viewport_scroll_layer_)
|
| + outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| + inner_viewport_scroll_layer_ = NULL;
|
| + outer_viewport_scroll_layer_ = NULL;
|
| + page_scale_layer_ = NULL;
|
| currently_scrolling_layer_ = NULL;
|
|
|
| render_surface_layer_list_.clear();
|
| @@ -125,12 +140,14 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
|
| target_tree->page_scale_delta() / target_tree->sent_page_scale_delta());
|
| target_tree->set_sent_page_scale_delta(1);
|
|
|
| - if (settings().use_pinch_virtual_viewport) {
|
| + if (page_scale_layer_ && inner_viewport_scroll_layer_) {
|
| target_tree->SetViewportLayersFromIds(
|
| page_scale_layer_->id(),
|
| inner_viewport_scroll_layer_->id(),
|
| outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
|
| : Layer::INVALID_ID);
|
| + } else {
|
| + target_tree->ClearViewportLayers();
|
| }
|
| // This should match the property synchronization in
|
| // LayerTreeHost::finishCommitOnImplThread().
|
| @@ -156,12 +173,9 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
|
| target_tree->set_hud_layer(NULL);
|
| }
|
|
|
| -LayerImpl* LayerTreeImpl::RootScrollLayer() const {
|
| - return root_scroll_layer_;
|
| -}
|
| -
|
| LayerImpl* LayerTreeImpl::RootContainerLayer() const {
|
| - return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL;
|
| + return inner_viewport_scroll_layer_ ? inner_viewport_scroll_layer_->parent()
|
| + : NULL;
|
| }
|
|
|
| LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const {
|
| @@ -224,7 +238,6 @@ void LayerTreeImpl::SetPageScaleDelta(float delta) {
|
| }
|
| }
|
|
|
| - UpdateMaxScrollOffset();
|
| set_needs_update_draw_properties();
|
|
|
| if (root_layer_scroll_offset_delegate_) {
|
| @@ -234,23 +247,12 @@ void LayerTreeImpl::SetPageScaleDelta(float delta) {
|
| }
|
|
|
| gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const {
|
| - return gfx::ScaleSize(layer_tree_host_impl_->UnscaledScrollableViewportSize(),
|
| - 1.0f / total_page_scale_factor());
|
| -}
|
| -
|
| -void LayerTreeImpl::UpdateMaxScrollOffset() {
|
| - LayerImpl* root_scroll = RootScrollLayer();
|
| - if (!root_scroll || !root_scroll->children().size())
|
| - return;
|
| -
|
| - gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() -
|
| - gfx::RectF(ScrollableViewportSize()).bottom_right();
|
| -
|
| - // The viewport may be larger than the contents in some cases, such as
|
| - // having a vertical scrollbar but no horizontal overflow.
|
| - max_scroll.SetToMax(gfx::Vector2dF());
|
| -
|
| - root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll));
|
| + if (page_scale_layer_)
|
| + return layer_tree_host_impl_->UnscaledScrollableViewportSize();
|
| + else
|
| + return gfx::ScaleSize(
|
| + layer_tree_host_impl_->UnscaledScrollableViewportSize(),
|
| + 1.0f / total_page_scale_factor());
|
| }
|
|
|
| static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
|
| @@ -307,46 +309,10 @@ void LayerTreeImpl::ClearViewportLayers() {
|
| outer_viewport_scroll_layer_ = NULL;
|
| }
|
|
|
| -// TODO(wjmaclean) This needs to go away, and be replaced with a single core
|
| -// of login that works for both scrollbar layer types. This is already planned
|
| -// as part of the larger pinch-zoom re-factoring viewport.
|
| -void LayerTreeImpl::UpdateSolidColorScrollbars() {
|
| - LayerImpl* root_scroll = RootScrollLayer();
|
| - DCHECK(root_scroll);
|
| - DCHECK(IsActiveTree());
|
| -
|
| - gfx::RectF scrollable_viewport(
|
| - gfx::PointAtOffsetFromOrigin(root_scroll->TotalScrollOffset()),
|
| - ScrollableViewportSize());
|
| - float vertical_adjust = 0.0f;
|
| - if (RootContainerLayer())
|
| - vertical_adjust =
|
| - layer_tree_host_impl_->UnscaledScrollableViewportSize().height() -
|
| - RootContainerLayer()->bounds().height();
|
| - if (ScrollbarLayerImplBase* horiz =
|
| - root_scroll->horizontal_scrollbar_layer()) {
|
| - horiz->SetVerticalAdjust(vertical_adjust);
|
| - horiz->SetVisibleToTotalLengthRatio(
|
| - scrollable_viewport.width() / ScrollableSize().width());
|
| - }
|
| - if (ScrollbarLayerImplBase* vertical =
|
| - root_scroll->vertical_scrollbar_layer()) {
|
| - vertical->SetVerticalAdjust(vertical_adjust);
|
| - vertical->SetVisibleToTotalLengthRatio(
|
| - scrollable_viewport.height() / ScrollableSize().height());
|
| - }
|
| -}
|
| -
|
| void LayerTreeImpl::UpdateDrawProperties() {
|
| - if (IsActiveTree() && RootScrollLayer() && RootContainerLayer())
|
| + if (IsActiveTree() && RootContainerLayer())
|
| UpdateRootScrollLayerSizeDelta();
|
|
|
| - if (IsActiveTree() &&
|
| - RootContainerLayer()
|
| - && !RootContainerLayer()->masks_to_bounds()) {
|
| - UpdateSolidColorScrollbars();
|
| - }
|
| -
|
| needs_update_draw_properties_ = false;
|
| render_surface_layer_list_.clear();
|
|
|
| @@ -425,9 +391,11 @@ const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const {
|
| }
|
|
|
| gfx::Size LayerTreeImpl::ScrollableSize() const {
|
| - if (!root_scroll_layer_ || root_scroll_layer_->children().empty())
|
| + LayerImpl* root_scroll_layer = OuterViewportScrollLayer() ?
|
| + OuterViewportScrollLayer() : InnerViewportScrollLayer();
|
| + if (!root_scroll_layer || root_scroll_layer->children().empty())
|
| return gfx::Size();
|
| - return root_scroll_layer_->children()[0]->bounds();
|
| + return root_scroll_layer->children()[0]->bounds();
|
| }
|
|
|
| LayerImpl* LayerTreeImpl::LayerById(int id) {
|
| @@ -463,8 +431,13 @@ void LayerTreeImpl::DidBecomeActive() {
|
| if (!root_layer())
|
| return;
|
|
|
| + if (scrolling_layer_id_from_previous_tree_) {
|
| + currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree(
|
| + root_layer_.get(),
|
| + scrolling_layer_id_from_previous_tree_);
|
| + }
|
| +
|
| DidBecomeActiveRecursive(root_layer());
|
| - FindRootScrollLayer();
|
| }
|
|
|
| bool LayerTreeImpl::ContentsTexturesPurged() const {
|
| @@ -653,8 +626,19 @@ void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
|
|
|
| root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
|
|
|
| - if (root_scroll_layer_) {
|
| - root_scroll_layer_->SetScrollOffsetDelegate(
|
| + if (root_layer_scroll_offset_delegate_) {
|
| + root_layer_scroll_offset_delegate_->SetTotalScrollOffset(TotalScrollOffset());
|
| + root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
|
| + TotalMaxScrollOffset());
|
| + }
|
| +
|
| + if (inner_viewport_scroll_layer_) {
|
| + inner_viewport_scroll_layer_->SetScrollOffsetDelegate(
|
| + root_layer_scroll_offset_delegate_);
|
| + }
|
| +
|
| + if (outer_viewport_scroll_layer_) {
|
| + outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
|
| root_layer_scroll_offset_delegate_);
|
| }
|
|
|
| @@ -665,8 +649,12 @@ void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
|
| }
|
| }
|
|
|
| +// TODO(wjmaclean) Rename this function, as we no longer have a
|
| +// "RootScrollLayer".
|
| void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() {
|
| - LayerImpl* root_scroll = RootScrollLayer();
|
| + // TODO(wjmaclean) verify this is really the right thing to do in cases where
|
| + // the pinch virtual viewport is active.
|
| + LayerImpl* root_scroll = InnerViewportScrollLayer();
|
| LayerImpl* root_container = RootContainerLayer();
|
| DCHECK(root_scroll);
|
| DCHECK(root_container);
|
|
|