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 "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/animation/keyframed_animation_curve.h" | 8 #include "cc/animation/keyframed_animation_curve.h" |
9 #include "cc/animation/scrollbar_animation_controller.h" | 9 #include "cc/animation/scrollbar_animation_controller.h" |
10 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" | 10 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "cc/trees/layer_tree_host_common.h" | 21 #include "cc/trees/layer_tree_host_common.h" |
22 #include "cc/trees/layer_tree_host_impl.h" | 22 #include "cc/trees/layer_tree_host_impl.h" |
23 #include "ui/gfx/size_conversions.h" | 23 #include "ui/gfx/size_conversions.h" |
24 #include "ui/gfx/vector2d_conversions.h" | 24 #include "ui/gfx/vector2d_conversions.h" |
25 | 25 |
26 namespace cc { | 26 namespace cc { |
27 | 27 |
28 // This class exists to split the LayerScrollOffsetDelegate between the | 28 // This class exists to split the LayerScrollOffsetDelegate between the |
29 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner | 29 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner |
30 // that never requires the embedder or LayerImpl to know about. | 30 // that never requires the embedder or LayerImpl to know about. |
31 class LayerScrollOffsetDelegateProxy : public LayerScrollOffsetDelegate { | 31 class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { |
32 public: | 32 public: |
33 LayerScrollOffsetDelegateProxy(LayerImpl* layer, | 33 LayerScrollOffsetDelegateProxy(LayerImpl* layer, |
34 LayerScrollOffsetDelegate* delegate, | 34 LayerScrollOffsetDelegate* delegate, |
35 LayerTreeImpl* layer_tree) | 35 LayerTreeImpl* layer_tree) |
36 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} | 36 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} |
| 37 virtual ~LayerScrollOffsetDelegateProxy() {} |
37 | 38 |
38 gfx::Vector2dF last_set_scroll_offset() const { | 39 gfx::Vector2dF last_set_scroll_offset() const { |
39 return last_set_scroll_offset_; | 40 return last_set_scroll_offset_; |
40 } | 41 } |
41 | 42 |
42 // LayerScrollOffsetDelegate implementation. | 43 // LayerScrollOffsetDelegate implementation. |
43 | |
44 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE { | 44 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE { |
45 last_set_scroll_offset_ = new_offset; | 45 last_set_scroll_offset_ = new_offset; |
46 layer_tree_impl_->UpdateScrollOffsetDelegate(); | 46 layer_tree_impl_->UpdateScrollOffsetDelegate(); |
47 } | 47 } |
48 | 48 |
49 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE { | 49 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE { |
50 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); | 50 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); |
51 } | 51 } |
52 | 52 |
53 virtual bool IsExternalFlingActive() const OVERRIDE { | 53 virtual bool IsExternalFlingActive() const OVERRIDE { |
54 return delegate_->IsExternalFlingActive(); | 54 return delegate_->IsExternalFlingActive(); |
55 } | 55 } |
56 | 56 |
57 // Functions below this point are never called by LayerImpl on its | |
58 // LayerScrollOffsetDelegate, and so are not implemented. | |
59 virtual void SetMaxScrollOffset(const gfx::Vector2dF&) OVERRIDE { | |
60 NOTIMPLEMENTED(); | |
61 } | |
62 | |
63 virtual void SetTotalPageScaleFactorAndLimits(float, float, float) OVERRIDE { | |
64 NOTIMPLEMENTED(); | |
65 } | |
66 | |
67 virtual void SetScrollableSize(const gfx::SizeF& scrollable_size) OVERRIDE { | |
68 NOTIMPLEMENTED(); | |
69 } | |
70 | |
71 private: | 57 private: |
72 LayerImpl* layer_; | 58 LayerImpl* layer_; |
73 LayerScrollOffsetDelegate* delegate_; | 59 LayerScrollOffsetDelegate* delegate_; |
74 LayerTreeImpl* layer_tree_impl_; | 60 LayerTreeImpl* layer_tree_impl_; |
75 gfx::Vector2dF last_set_scroll_offset_; | 61 gfx::Vector2dF last_set_scroll_offset_; |
76 }; | 62 }; |
77 | 63 |
78 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) | 64 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) |
79 : layer_tree_host_impl_(layer_tree_host_impl), | 65 : layer_tree_host_impl_(layer_tree_host_impl), |
80 source_frame_number_(-1), | 66 source_frame_number_(-1), |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 if (min_page_scale_factor == min_page_scale_factor_ && | 285 if (min_page_scale_factor == min_page_scale_factor_ && |
300 max_page_scale_factor == max_page_scale_factor_ && | 286 max_page_scale_factor == max_page_scale_factor_ && |
301 page_scale_factor == page_scale_factor_) | 287 page_scale_factor == page_scale_factor_) |
302 return; | 288 return; |
303 | 289 |
304 min_page_scale_factor_ = min_page_scale_factor; | 290 min_page_scale_factor_ = min_page_scale_factor; |
305 max_page_scale_factor_ = max_page_scale_factor; | 291 max_page_scale_factor_ = max_page_scale_factor; |
306 page_scale_factor_ = page_scale_factor; | 292 page_scale_factor_ = page_scale_factor; |
307 | 293 |
308 if (root_layer_scroll_offset_delegate_) { | 294 if (root_layer_scroll_offset_delegate_) { |
309 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits( | 295 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
| 296 TotalScrollOffset(), |
| 297 TotalMaxScrollOffset(), |
| 298 ScrollableSize(), |
310 total_page_scale_factor(), | 299 total_page_scale_factor(), |
311 this->min_page_scale_factor(), | 300 this->min_page_scale_factor(), |
312 this->max_page_scale_factor()); | 301 this->max_page_scale_factor()); |
313 } | 302 } |
314 | 303 |
315 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer()); | 304 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer()); |
316 } | 305 } |
317 | 306 |
318 void LayerTreeImpl::SetPageScaleDelta(float delta) { | 307 void LayerTreeImpl::SetPageScaleDelta(float delta) { |
319 // Clamp to the current min/max limits. | 308 // Clamp to the current min/max limits. |
(...skipping 13 matching lines...) Expand all Loading... |
333 if (pending_tree) { | 322 if (pending_tree) { |
334 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); | 323 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); |
335 pending_tree->SetPageScaleDelta( | 324 pending_tree->SetPageScaleDelta( |
336 page_scale_delta_ / sent_page_scale_delta_); | 325 page_scale_delta_ / sent_page_scale_delta_); |
337 } | 326 } |
338 } | 327 } |
339 | 328 |
340 set_needs_update_draw_properties(); | 329 set_needs_update_draw_properties(); |
341 | 330 |
342 if (root_layer_scroll_offset_delegate_) { | 331 if (root_layer_scroll_offset_delegate_) { |
343 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits( | 332 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
| 333 TotalScrollOffset(), |
| 334 TotalMaxScrollOffset(), |
| 335 ScrollableSize(), |
344 total_page_scale_factor(), | 336 total_page_scale_factor(), |
345 min_page_scale_factor(), | 337 min_page_scale_factor(), |
346 max_page_scale_factor()); | 338 max_page_scale_factor()); |
347 } | 339 } |
348 } | 340 } |
349 | 341 |
350 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { | 342 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { |
351 if (outer_viewport_scroll_layer_) | 343 if (outer_viewport_scroll_layer_) |
352 return layer_tree_host_impl_->UnscaledScrollableViewportSize(); | 344 return layer_tree_host_impl_->UnscaledScrollableViewportSize(); |
353 else | 345 else |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | 772 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL); |
781 if (OuterViewportScrollLayer()) | 773 if (OuterViewportScrollLayer()) |
782 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | 774 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL); |
783 inner_viewport_scroll_delegate_proxy_.reset(); | 775 inner_viewport_scroll_delegate_proxy_.reset(); |
784 outer_viewport_scroll_delegate_proxy_.reset(); | 776 outer_viewport_scroll_delegate_proxy_.reset(); |
785 } | 777 } |
786 | 778 |
787 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; | 779 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; |
788 | 780 |
789 if (root_layer_scroll_offset_delegate_) { | 781 if (root_layer_scroll_offset_delegate_) { |
790 root_layer_scroll_offset_delegate_->SetTotalScrollOffset( | 782 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
791 TotalScrollOffset()); | 783 TotalScrollOffset(), |
792 root_layer_scroll_offset_delegate_->SetMaxScrollOffset( | 784 TotalMaxScrollOffset(), |
793 TotalMaxScrollOffset()); | 785 ScrollableSize(), |
794 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); | |
795 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits( | |
796 total_page_scale_factor(), | 786 total_page_scale_factor(), |
797 min_page_scale_factor(), | 787 min_page_scale_factor(), |
798 max_page_scale_factor()); | 788 max_page_scale_factor()); |
799 | 789 |
800 if (inner_viewport_scroll_layer_) { | 790 if (inner_viewport_scroll_layer_) { |
801 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | 791 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( |
802 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(), | 792 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(), |
803 root_layer_scroll_offset_delegate_, | 793 root_layer_scroll_offset_delegate_, |
804 this)); | 794 this)); |
805 inner_viewport_scroll_layer_->SetScrollOffsetDelegate( | 795 inner_viewport_scroll_layer_->SetScrollOffsetDelegate( |
(...skipping 14 matching lines...) Expand all Loading... |
820 void LayerTreeImpl::UpdateScrollOffsetDelegate() { | 810 void LayerTreeImpl::UpdateScrollOffsetDelegate() { |
821 DCHECK(InnerViewportScrollLayer()); | 811 DCHECK(InnerViewportScrollLayer()); |
822 DCHECK(root_layer_scroll_offset_delegate_); | 812 DCHECK(root_layer_scroll_offset_delegate_); |
823 | 813 |
824 gfx::Vector2dF offset = | 814 gfx::Vector2dF offset = |
825 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 815 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
826 | 816 |
827 if (OuterViewportScrollLayer()) | 817 if (OuterViewportScrollLayer()) |
828 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 818 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
829 | 819 |
830 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(offset); | 820 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
831 root_layer_scroll_offset_delegate_->SetMaxScrollOffset( | 821 offset, |
832 TotalMaxScrollOffset()); | 822 TotalMaxScrollOffset(), |
| 823 ScrollableSize(), |
| 824 total_page_scale_factor(), |
| 825 min_page_scale_factor(), |
| 826 max_page_scale_factor()); |
833 } | 827 } |
834 | 828 |
835 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { | 829 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { |
836 DCHECK(root_layer_scroll_offset_delegate_); | 830 DCHECK(root_layer_scroll_offset_delegate_); |
837 DCHECK(InnerViewportScrollLayer()); | 831 DCHECK(InnerViewportScrollLayer()); |
838 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) | 832 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) |
839 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 833 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); |
840 | 834 |
841 // If we get here, we have both inner/outer viewports, and need to distribute | 835 // If we get here, we have both inner/outer viewports, and need to distribute |
842 // the scroll offset between them. | 836 // the scroll offset between them. |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest() | 972 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest() |
979 const { | 973 const { |
980 // Only the active tree needs to know about layers with copy requests, as | 974 // Only the active tree needs to know about layers with copy requests, as |
981 // they are aborted if not serviced during draw. | 975 // they are aborted if not serviced during draw. |
982 DCHECK(IsActiveTree()); | 976 DCHECK(IsActiveTree()); |
983 | 977 |
984 return layers_with_copy_output_request_; | 978 return layers_with_copy_output_request_; |
985 } | 979 } |
986 | 980 |
987 } // namespace cc | 981 } // namespace cc |
OLD | NEW |