| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner | 36 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner |
| 37 // that never requires the embedder or LayerImpl to know about. | 37 // that never requires the embedder or LayerImpl to know about. |
| 38 class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { | 38 class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { |
| 39 public: | 39 public: |
| 40 LayerScrollOffsetDelegateProxy(LayerImpl* layer, | 40 LayerScrollOffsetDelegateProxy(LayerImpl* layer, |
| 41 LayerScrollOffsetDelegate* delegate, | 41 LayerScrollOffsetDelegate* delegate, |
| 42 LayerTreeImpl* layer_tree) | 42 LayerTreeImpl* layer_tree) |
| 43 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} | 43 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} |
| 44 virtual ~LayerScrollOffsetDelegateProxy() {} | 44 virtual ~LayerScrollOffsetDelegateProxy() {} |
| 45 | 45 |
| 46 gfx::Vector2dF last_set_scroll_offset() const { | 46 gfx::ScrollOffset last_set_scroll_offset() const { |
| 47 return last_set_scroll_offset_; | 47 return last_set_scroll_offset_; |
| 48 } | 48 } |
| 49 | 49 |
| 50 // LayerScrollOffsetDelegate implementation. | 50 // LayerScrollOffsetDelegate implementation. |
| 51 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE { | 51 virtual void SetTotalScrollOffset( |
| 52 const gfx::ScrollOffset& new_offset) OVERRIDE { |
| 52 last_set_scroll_offset_ = new_offset; | 53 last_set_scroll_offset_ = new_offset; |
| 53 layer_tree_impl_->UpdateScrollOffsetDelegate(); | 54 layer_tree_impl_->UpdateScrollOffsetDelegate(); |
| 54 } | 55 } |
| 55 | 56 |
| 56 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE { | 57 virtual gfx::ScrollOffset GetTotalScrollOffset() OVERRIDE { |
| 57 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); | 58 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); |
| 58 } | 59 } |
| 59 | 60 |
| 60 virtual bool IsExternalFlingActive() const OVERRIDE { | 61 virtual bool IsExternalFlingActive() const OVERRIDE { |
| 61 return delegate_->IsExternalFlingActive(); | 62 return delegate_->IsExternalFlingActive(); |
| 62 } | 63 } |
| 63 | 64 |
| 64 private: | 65 private: |
| 65 LayerImpl* layer_; | 66 LayerImpl* layer_; |
| 66 LayerScrollOffsetDelegate* delegate_; | 67 LayerScrollOffsetDelegate* delegate_; |
| 67 LayerTreeImpl* layer_tree_impl_; | 68 LayerTreeImpl* layer_tree_impl_; |
| 68 gfx::Vector2dF last_set_scroll_offset_; | 69 gfx::ScrollOffset last_set_scroll_offset_; |
| 69 }; | 70 }; |
| 70 | 71 |
| 71 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) | 72 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) |
| 72 : layer_tree_host_impl_(layer_tree_host_impl), | 73 : layer_tree_host_impl_(layer_tree_host_impl), |
| 73 source_frame_number_(-1), | 74 source_frame_number_(-1), |
| 74 hud_layer_(0), | 75 hud_layer_(0), |
| 75 currently_scrolling_layer_(NULL), | 76 currently_scrolling_layer_(NULL), |
| 76 root_layer_scroll_offset_delegate_(NULL), | 77 root_layer_scroll_offset_delegate_(NULL), |
| 77 background_color_(0), | 78 background_color_(0), |
| 78 has_transparent_background_(false), | 79 has_transparent_background_(false), |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 } | 136 } |
| 136 | 137 |
| 137 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const { | 138 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const { |
| 138 return inner_viewport_scroll_layer_; | 139 return inner_viewport_scroll_layer_; |
| 139 } | 140 } |
| 140 | 141 |
| 141 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const { | 142 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const { |
| 142 return outer_viewport_scroll_layer_; | 143 return outer_viewport_scroll_layer_; |
| 143 } | 144 } |
| 144 | 145 |
| 145 gfx::Vector2dF LayerTreeImpl::TotalScrollOffset() const { | 146 gfx::ScrollOffset LayerTreeImpl::TotalScrollOffset() const { |
| 146 gfx::Vector2dF offset; | 147 gfx::ScrollOffset offset; |
| 147 | 148 |
| 148 if (inner_viewport_scroll_layer_) | 149 if (inner_viewport_scroll_layer_) |
| 149 offset += inner_viewport_scroll_layer_->TotalScrollOffset(); | 150 offset += inner_viewport_scroll_layer_->TotalScrollOffset(); |
| 150 | 151 |
| 151 if (outer_viewport_scroll_layer_) | 152 if (outer_viewport_scroll_layer_) |
| 152 offset += outer_viewport_scroll_layer_->TotalScrollOffset(); | 153 offset += outer_viewport_scroll_layer_->TotalScrollOffset(); |
| 153 | 154 |
| 154 return offset; | 155 return offset; |
| 155 } | 156 } |
| 156 | 157 |
| 157 gfx::Vector2dF LayerTreeImpl::TotalMaxScrollOffset() const { | 158 gfx::ScrollOffset LayerTreeImpl::TotalMaxScrollOffset() const { |
| 158 gfx::Vector2dF offset; | 159 gfx::ScrollOffset offset; |
| 159 | 160 |
| 160 if (inner_viewport_scroll_layer_) | 161 if (inner_viewport_scroll_layer_) |
| 161 offset += inner_viewport_scroll_layer_->MaxScrollOffset(); | 162 offset += inner_viewport_scroll_layer_->MaxScrollOffset(); |
| 162 | 163 |
| 163 if (outer_viewport_scroll_layer_) | 164 if (outer_viewport_scroll_layer_) |
| 164 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); | 165 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); |
| 165 | 166 |
| 166 return offset; | 167 return offset; |
| 167 } | 168 } |
| 168 gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const { | 169 gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const { |
| (...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 outer_viewport_scroll_layer_->SetScrollOffsetDelegate( | 914 outer_viewport_scroll_layer_->SetScrollOffsetDelegate( |
| 914 outer_viewport_scroll_delegate_proxy_.get()); | 915 outer_viewport_scroll_delegate_proxy_.get()); |
| 915 } | 916 } |
| 916 } | 917 } |
| 917 } | 918 } |
| 918 | 919 |
| 919 void LayerTreeImpl::UpdateScrollOffsetDelegate() { | 920 void LayerTreeImpl::UpdateScrollOffsetDelegate() { |
| 920 DCHECK(InnerViewportScrollLayer()); | 921 DCHECK(InnerViewportScrollLayer()); |
| 921 DCHECK(root_layer_scroll_offset_delegate_); | 922 DCHECK(root_layer_scroll_offset_delegate_); |
| 922 | 923 |
| 923 gfx::Vector2dF offset = | 924 gfx::ScrollOffset offset = |
| 924 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 925 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
| 925 | 926 |
| 926 if (OuterViewportScrollLayer()) | 927 if (OuterViewportScrollLayer()) |
| 927 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 928 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
| 928 | 929 |
| 929 root_layer_scroll_offset_delegate_->UpdateRootLayerState( | 930 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
| 930 offset, | 931 offset, |
| 931 TotalMaxScrollOffset(), | 932 TotalMaxScrollOffset(), |
| 932 ScrollableSize(), | 933 ScrollableSize(), |
| 933 total_page_scale_factor(), | 934 total_page_scale_factor(), |
| 934 min_page_scale_factor(), | 935 min_page_scale_factor(), |
| 935 max_page_scale_factor()); | 936 max_page_scale_factor()); |
| 936 } | 937 } |
| 937 | 938 |
| 938 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { | 939 gfx::ScrollOffset LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { |
| 939 DCHECK(root_layer_scroll_offset_delegate_); | 940 DCHECK(root_layer_scroll_offset_delegate_); |
| 940 DCHECK(InnerViewportScrollLayer()); | 941 DCHECK(InnerViewportScrollLayer()); |
| 941 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) | 942 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) |
| 942 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 943 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); |
| 943 | 944 |
| 944 // If we get here, we have both inner/outer viewports, and need to distribute | 945 // If we get here, we have both inner/outer viewports, and need to distribute |
| 945 // the scroll offset between them. | 946 // the scroll offset between them. |
| 946 DCHECK(inner_viewport_scroll_delegate_proxy_); | 947 DCHECK(inner_viewport_scroll_delegate_proxy_); |
| 947 DCHECK(outer_viewport_scroll_delegate_proxy_); | 948 DCHECK(outer_viewport_scroll_delegate_proxy_); |
| 948 gfx::Vector2dF inner_viewport_offset = | 949 gfx::ScrollOffset inner_viewport_offset = |
| 949 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 950 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
| 950 gfx::Vector2dF outer_viewport_offset = | 951 gfx::ScrollOffset outer_viewport_offset = |
| 951 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 952 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
| 952 | 953 |
| 953 // It may be nothing has changed. | 954 // It may be nothing has changed. |
| 954 gfx::Vector2dF delegate_offset = | 955 gfx::ScrollOffset delegate_offset = |
| 955 root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 956 root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); |
| 956 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) { | 957 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) { |
| 957 if (layer == InnerViewportScrollLayer()) | 958 if (layer == InnerViewportScrollLayer()) |
| 958 return inner_viewport_offset; | 959 return inner_viewport_offset; |
| 959 else | 960 else |
| 960 return outer_viewport_offset; | 961 return outer_viewport_offset; |
| 961 } | 962 } |
| 962 | 963 |
| 963 gfx::Vector2d max_outer_viewport_scroll_offset = | 964 gfx::ScrollOffset max_outer_viewport_scroll_offset = |
| 964 OuterViewportScrollLayer()->MaxScrollOffset(); | 965 OuterViewportScrollLayer()->MaxScrollOffset(); |
| 965 | 966 |
| 966 outer_viewport_offset = delegate_offset - inner_viewport_offset; | 967 outer_viewport_offset = delegate_offset - inner_viewport_offset; |
| 967 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); | 968 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); |
| 968 outer_viewport_offset.SetToMax(gfx::Vector2d()); | 969 outer_viewport_offset.SetToMax(gfx::ScrollOffset()); |
| 969 | 970 |
| 970 if (layer == OuterViewportScrollLayer()) | 971 if (layer == OuterViewportScrollLayer()) |
| 971 return outer_viewport_offset; | 972 return outer_viewport_offset; |
| 972 | 973 |
| 973 inner_viewport_offset = delegate_offset - outer_viewport_offset; | 974 inner_viewport_offset = delegate_offset - outer_viewport_offset; |
| 974 | 975 |
| 975 return inner_viewport_offset; | 976 return inner_viewport_offset; |
| 976 } | 977 } |
| 977 | 978 |
| 978 void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { | 979 void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1443 | 1444 |
| 1444 void LayerTreeImpl::InputScrollAnimationFinished() { | 1445 void LayerTreeImpl::InputScrollAnimationFinished() { |
| 1445 layer_tree_host_impl_->ScrollEnd(); | 1446 layer_tree_host_impl_->ScrollEnd(); |
| 1446 } | 1447 } |
| 1447 | 1448 |
| 1448 BlockingTaskRunner* LayerTreeImpl::BlockingMainThreadTaskRunner() const { | 1449 BlockingTaskRunner* LayerTreeImpl::BlockingMainThreadTaskRunner() const { |
| 1449 return proxy()->blocking_main_thread_task_runner(); | 1450 return proxy()->blocking_main_thread_task_runner(); |
| 1450 } | 1451 } |
| 1451 | 1452 |
| 1452 } // namespace cc | 1453 } // namespace cc |
| OLD | NEW |