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 14 matching lines...) Expand all Loading... |
25 #include "cc/trees/layer_tree_host_impl.h" | 25 #include "cc/trees/layer_tree_host_impl.h" |
26 #include "ui/gfx/point_conversions.h" | 26 #include "ui/gfx/point_conversions.h" |
27 #include "ui/gfx/size_conversions.h" | 27 #include "ui/gfx/size_conversions.h" |
28 #include "ui/gfx/vector2d_conversions.h" | 28 #include "ui/gfx/vector2d_conversions.h" |
29 | 29 |
30 namespace cc { | 30 namespace cc { |
31 | 31 |
32 // This class exists to split the LayerScrollOffsetDelegate between the | 32 // This class exists to split the LayerScrollOffsetDelegate between the |
33 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner | 33 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner |
34 // that never requires the embedder or LayerImpl to know about. | 34 // that never requires the embedder or LayerImpl to know about. |
35 class LayerScrollOffsetDelegateProxy : public LayerScrollOffsetDelegate { | 35 class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { |
36 public: | 36 public: |
37 LayerScrollOffsetDelegateProxy(LayerImpl* layer, | 37 LayerScrollOffsetDelegateProxy(LayerImpl* layer, |
38 LayerScrollOffsetDelegate* delegate, | 38 LayerScrollOffsetDelegate* delegate, |
39 LayerTreeImpl* layer_tree) | 39 LayerTreeImpl* layer_tree) |
40 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} | 40 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} |
| 41 virtual ~LayerScrollOffsetDelegateProxy() {} |
41 | 42 |
42 gfx::Vector2dF last_set_scroll_offset() const { | 43 gfx::Vector2dF last_set_scroll_offset() const { |
43 return last_set_scroll_offset_; | 44 return last_set_scroll_offset_; |
44 } | 45 } |
45 | 46 |
46 // LayerScrollOffsetDelegate implementation. | 47 // LayerScrollOffsetDelegate implementation. |
47 | |
48 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE { | 48 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE { |
49 last_set_scroll_offset_ = new_offset; | 49 last_set_scroll_offset_ = new_offset; |
50 layer_tree_impl_->UpdateScrollOffsetDelegate(); | 50 layer_tree_impl_->UpdateScrollOffsetDelegate(); |
51 } | 51 } |
52 | 52 |
53 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE { | 53 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE { |
54 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); | 54 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); |
55 } | 55 } |
56 | 56 |
57 virtual bool IsExternalFlingActive() const OVERRIDE { | 57 virtual bool IsExternalFlingActive() const OVERRIDE { |
58 return delegate_->IsExternalFlingActive(); | 58 return delegate_->IsExternalFlingActive(); |
59 } | 59 } |
60 | 60 |
61 // Functions below this point are never called by LayerImpl on its | |
62 // LayerScrollOffsetDelegate, and so are not implemented. | |
63 virtual void SetMaxScrollOffset(const gfx::Vector2dF&) OVERRIDE { | |
64 NOTIMPLEMENTED(); | |
65 } | |
66 | |
67 virtual void SetTotalPageScaleFactorAndLimits(float, float, float) OVERRIDE { | |
68 NOTIMPLEMENTED(); | |
69 } | |
70 | |
71 virtual void SetScrollableSize(const gfx::SizeF& scrollable_size) OVERRIDE { | |
72 NOTIMPLEMENTED(); | |
73 } | |
74 | |
75 private: | 61 private: |
76 LayerImpl* layer_; | 62 LayerImpl* layer_; |
77 LayerScrollOffsetDelegate* delegate_; | 63 LayerScrollOffsetDelegate* delegate_; |
78 LayerTreeImpl* layer_tree_impl_; | 64 LayerTreeImpl* layer_tree_impl_; |
79 gfx::Vector2dF last_set_scroll_offset_; | 65 gfx::Vector2dF last_set_scroll_offset_; |
80 }; | 66 }; |
81 | 67 |
82 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) | 68 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) |
83 : layer_tree_host_impl_(layer_tree_host_impl), | 69 : layer_tree_host_impl_(layer_tree_host_impl), |
84 source_frame_number_(-1), | 70 source_frame_number_(-1), |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 if (min_page_scale_factor == min_page_scale_factor_ && | 299 if (min_page_scale_factor == min_page_scale_factor_ && |
314 max_page_scale_factor == max_page_scale_factor_ && | 300 max_page_scale_factor == max_page_scale_factor_ && |
315 page_scale_factor == page_scale_factor_) | 301 page_scale_factor == page_scale_factor_) |
316 return; | 302 return; |
317 | 303 |
318 min_page_scale_factor_ = min_page_scale_factor; | 304 min_page_scale_factor_ = min_page_scale_factor; |
319 max_page_scale_factor_ = max_page_scale_factor; | 305 max_page_scale_factor_ = max_page_scale_factor; |
320 page_scale_factor_ = page_scale_factor; | 306 page_scale_factor_ = page_scale_factor; |
321 | 307 |
322 if (root_layer_scroll_offset_delegate_) { | 308 if (root_layer_scroll_offset_delegate_) { |
323 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits( | 309 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
| 310 TotalScrollOffset(), |
| 311 TotalMaxScrollOffset(), |
| 312 ScrollableSize(), |
324 total_page_scale_factor(), | 313 total_page_scale_factor(), |
325 this->min_page_scale_factor(), | 314 this->min_page_scale_factor(), |
326 this->max_page_scale_factor()); | 315 this->max_page_scale_factor()); |
327 } | 316 } |
328 | 317 |
329 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer()); | 318 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer()); |
330 } | 319 } |
331 | 320 |
332 void LayerTreeImpl::SetPageScaleDelta(float delta) { | 321 void LayerTreeImpl::SetPageScaleDelta(float delta) { |
333 // Clamp to the current min/max limits. | 322 // Clamp to the current min/max limits. |
(...skipping 13 matching lines...) Expand all Loading... |
347 if (pending_tree) { | 336 if (pending_tree) { |
348 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); | 337 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); |
349 pending_tree->SetPageScaleDelta( | 338 pending_tree->SetPageScaleDelta( |
350 page_scale_delta_ / sent_page_scale_delta_); | 339 page_scale_delta_ / sent_page_scale_delta_); |
351 } | 340 } |
352 } | 341 } |
353 | 342 |
354 set_needs_update_draw_properties(); | 343 set_needs_update_draw_properties(); |
355 | 344 |
356 if (root_layer_scroll_offset_delegate_) { | 345 if (root_layer_scroll_offset_delegate_) { |
357 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits( | 346 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
| 347 TotalScrollOffset(), |
| 348 TotalMaxScrollOffset(), |
| 349 ScrollableSize(), |
358 total_page_scale_factor(), | 350 total_page_scale_factor(), |
359 min_page_scale_factor(), | 351 min_page_scale_factor(), |
360 max_page_scale_factor()); | 352 max_page_scale_factor()); |
361 } | 353 } |
362 } | 354 } |
363 | 355 |
364 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { | 356 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { |
365 if (outer_viewport_scroll_layer_) | 357 if (outer_viewport_scroll_layer_) |
366 return layer_tree_host_impl_->UnscaledScrollableViewportSize(); | 358 return layer_tree_host_impl_->UnscaledScrollableViewportSize(); |
367 else | 359 else |
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | 803 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL); |
812 if (OuterViewportScrollLayer()) | 804 if (OuterViewportScrollLayer()) |
813 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | 805 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL); |
814 inner_viewport_scroll_delegate_proxy_.reset(); | 806 inner_viewport_scroll_delegate_proxy_.reset(); |
815 outer_viewport_scroll_delegate_proxy_.reset(); | 807 outer_viewport_scroll_delegate_proxy_.reset(); |
816 } | 808 } |
817 | 809 |
818 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; | 810 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; |
819 | 811 |
820 if (root_layer_scroll_offset_delegate_) { | 812 if (root_layer_scroll_offset_delegate_) { |
821 root_layer_scroll_offset_delegate_->SetTotalScrollOffset( | 813 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
822 TotalScrollOffset()); | 814 TotalScrollOffset(), |
823 root_layer_scroll_offset_delegate_->SetMaxScrollOffset( | 815 TotalMaxScrollOffset(), |
824 TotalMaxScrollOffset()); | 816 ScrollableSize(), |
825 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); | |
826 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits( | |
827 total_page_scale_factor(), | 817 total_page_scale_factor(), |
828 min_page_scale_factor(), | 818 min_page_scale_factor(), |
829 max_page_scale_factor()); | 819 max_page_scale_factor()); |
830 | 820 |
831 if (inner_viewport_scroll_layer_) { | 821 if (inner_viewport_scroll_layer_) { |
832 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | 822 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( |
833 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(), | 823 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(), |
834 root_layer_scroll_offset_delegate_, | 824 root_layer_scroll_offset_delegate_, |
835 this)); | 825 this)); |
836 inner_viewport_scroll_layer_->SetScrollOffsetDelegate( | 826 inner_viewport_scroll_layer_->SetScrollOffsetDelegate( |
(...skipping 14 matching lines...) Expand all Loading... |
851 void LayerTreeImpl::UpdateScrollOffsetDelegate() { | 841 void LayerTreeImpl::UpdateScrollOffsetDelegate() { |
852 DCHECK(InnerViewportScrollLayer()); | 842 DCHECK(InnerViewportScrollLayer()); |
853 DCHECK(root_layer_scroll_offset_delegate_); | 843 DCHECK(root_layer_scroll_offset_delegate_); |
854 | 844 |
855 gfx::Vector2dF offset = | 845 gfx::Vector2dF offset = |
856 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 846 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
857 | 847 |
858 if (OuterViewportScrollLayer()) | 848 if (OuterViewportScrollLayer()) |
859 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 849 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |
860 | 850 |
861 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(offset); | 851 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
862 root_layer_scroll_offset_delegate_->SetMaxScrollOffset( | 852 offset, |
863 TotalMaxScrollOffset()); | 853 TotalMaxScrollOffset(), |
| 854 ScrollableSize(), |
| 855 total_page_scale_factor(), |
| 856 min_page_scale_factor(), |
| 857 max_page_scale_factor()); |
864 } | 858 } |
865 | 859 |
866 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { | 860 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { |
867 DCHECK(root_layer_scroll_offset_delegate_); | 861 DCHECK(root_layer_scroll_offset_delegate_); |
868 DCHECK(InnerViewportScrollLayer()); | 862 DCHECK(InnerViewportScrollLayer()); |
869 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) | 863 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) |
870 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 864 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); |
871 | 865 |
872 // If we get here, we have both inner/outer viewports, and need to distribute | 866 // If we get here, we have both inner/outer viewports, and need to distribute |
873 // the scroll offset between them. | 867 // the scroll offset between them. |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1278 LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion( | 1272 LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion( |
1279 const gfx::PointF& screen_space_point) { | 1273 const gfx::PointF& screen_space_point) { |
1280 FindTouchEventLayerFunctor func = {screen_space_point}; | 1274 FindTouchEventLayerFunctor func = {screen_space_point}; |
1281 FindClosestMatchingLayerDataForRecursion data_for_recursion; | 1275 FindClosestMatchingLayerDataForRecursion data_for_recursion; |
1282 FindClosestMatchingLayer( | 1276 FindClosestMatchingLayer( |
1283 screen_space_point, root_layer(), func, &data_for_recursion); | 1277 screen_space_point, root_layer(), func, &data_for_recursion); |
1284 return data_for_recursion.closest_match; | 1278 return data_for_recursion.closest_match; |
1285 } | 1279 } |
1286 | 1280 |
1287 } // namespace cc | 1281 } // namespace cc |
OLD | NEW |