Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: cc/trees/layer_tree_impl.cc

Issue 895853003: Update from https://crrev.com/314320 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | cc/trees/layer_tree_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/trace_event/trace_event.h"
11 #include "base/debug/trace_event_argument.h" 11 #include "base/trace_event/trace_event_argument.h"
12 #include "cc/animation/keyframed_animation_curve.h" 12 #include "cc/animation/keyframed_animation_curve.h"
13 #include "cc/animation/scrollbar_animation_controller.h" 13 #include "cc/animation/scrollbar_animation_controller.h"
14 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" 14 #include "cc/animation/scrollbar_animation_controller_linear_fade.h"
15 #include "cc/animation/scrollbar_animation_controller_thinning.h" 15 #include "cc/animation/scrollbar_animation_controller_thinning.h"
16 #include "cc/base/math_util.h" 16 #include "cc/base/math_util.h"
17 #include "cc/base/synced_property.h" 17 #include "cc/base/synced_property.h"
18 #include "cc/base/util.h" 18 #include "cc/base/util.h"
19 #include "cc/debug/devtools_instrumentation.h" 19 #include "cc/debug/devtools_instrumentation.h"
20 #include "cc/debug/traced_value.h" 20 #include "cc/debug/traced_value.h"
21 #include "cc/input/page_scale_animation.h" 21 #include "cc/input/page_scale_animation.h"
(...skipping 21 matching lines...) Expand all
43 LayerScrollOffsetDelegate* delegate, 43 LayerScrollOffsetDelegate* delegate,
44 LayerTreeImpl* layer_tree) 44 LayerTreeImpl* layer_tree)
45 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} 45 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {}
46 virtual ~LayerScrollOffsetDelegateProxy() {} 46 virtual ~LayerScrollOffsetDelegateProxy() {}
47 47
48 gfx::ScrollOffset last_set_scroll_offset() const { 48 gfx::ScrollOffset last_set_scroll_offset() const {
49 return last_set_scroll_offset_; 49 return last_set_scroll_offset_;
50 } 50 }
51 51
52 // LayerScrollOffsetDelegate implementation. 52 // LayerScrollOffsetDelegate implementation.
53 void SetTotalScrollOffset(const gfx::ScrollOffset& new_offset) override { 53 void SetCurrentScrollOffset(const gfx::ScrollOffset& new_offset) override {
54 last_set_scroll_offset_ = new_offset; 54 last_set_scroll_offset_ = new_offset;
55 } 55 }
56 56
57 gfx::ScrollOffset GetTotalScrollOffset() override { 57 gfx::ScrollOffset GetCurrentScrollOffset() override {
58 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); 58 return layer_tree_impl_->GetDelegatedScrollOffset(layer_);
59 } 59 }
60 60
61 bool IsExternalFlingActive() const override { 61 bool IsExternalFlingActive() const override {
62 return delegate_->IsExternalFlingActive(); 62 return delegate_->IsExternalFlingActive();
63 } 63 }
64 64
65 void Update() const override { 65 void Update() const override {
66 layer_tree_impl_->UpdateScrollOffsetDelegate(); 66 layer_tree_impl_->UpdateScrollOffsetDelegate();
67 } 67 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 } 147 }
148 148
149 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const { 149 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const {
150 return outer_viewport_scroll_layer_; 150 return outer_viewport_scroll_layer_;
151 } 151 }
152 152
153 gfx::ScrollOffset LayerTreeImpl::TotalScrollOffset() const { 153 gfx::ScrollOffset LayerTreeImpl::TotalScrollOffset() const {
154 gfx::ScrollOffset offset; 154 gfx::ScrollOffset offset;
155 155
156 if (inner_viewport_scroll_layer_) 156 if (inner_viewport_scroll_layer_)
157 offset += inner_viewport_scroll_layer_->TotalScrollOffset(); 157 offset += inner_viewport_scroll_layer_->CurrentScrollOffset();
158 158
159 if (outer_viewport_scroll_layer_) 159 if (outer_viewport_scroll_layer_)
160 offset += outer_viewport_scroll_layer_->TotalScrollOffset(); 160 offset += outer_viewport_scroll_layer_->CurrentScrollOffset();
161 161
162 return offset; 162 return offset;
163 } 163 }
164 164
165 gfx::ScrollOffset LayerTreeImpl::TotalMaxScrollOffset() const { 165 gfx::ScrollOffset LayerTreeImpl::TotalMaxScrollOffset() const {
166 gfx::ScrollOffset offset; 166 gfx::ScrollOffset offset;
167 167
168 if (inner_viewport_scroll_layer_) 168 if (inner_viewport_scroll_layer_)
169 offset += inner_viewport_scroll_layer_->MaxScrollOffset(); 169 offset += inner_viewport_scroll_layer_->MaxScrollOffset();
170 170
171 if (outer_viewport_scroll_layer_) 171 if (outer_viewport_scroll_layer_)
172 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); 172 offset += outer_viewport_scroll_layer_->MaxScrollOffset();
173 173
174 return offset; 174 return offset;
175 } 175 }
176 gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const {
177 DCHECK(inner_viewport_scroll_layer_);
178 gfx::Vector2dF delta = inner_viewport_scroll_layer_->ScrollDelta();
179
180 if (outer_viewport_scroll_layer_)
181 delta += outer_viewport_scroll_layer_->ScrollDelta();
182
183 return delta;
184 }
185 176
186 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { 177 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() {
187 // Clear all data structures that have direct references to the layer tree. 178 // Clear all data structures that have direct references to the layer tree.
188 scrolling_layer_id_from_previous_tree_ = 179 scrolling_layer_id_from_previous_tree_ =
189 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; 180 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0;
190 if (inner_viewport_scroll_layer_) 181 if (inner_viewport_scroll_layer_)
191 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); 182 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
192 if (outer_viewport_scroll_layer_) 183 if (outer_viewport_scroll_layer_)
193 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); 184 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
194 inner_viewport_scroll_delegate_proxy_ = nullptr; 185 inner_viewport_scroll_delegate_proxy_ = nullptr;
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 set_needs_update_draw_properties(); 379 set_needs_update_draw_properties();
389 380
390 if (root_layer_scroll_offset_delegate_) { 381 if (root_layer_scroll_offset_delegate_) {
391 root_layer_scroll_offset_delegate_->UpdateRootLayerState( 382 root_layer_scroll_offset_delegate_->UpdateRootLayerState(
392 TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(), 383 TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(),
393 current_page_scale_factor(), min_page_scale_factor_, 384 current_page_scale_factor(), min_page_scale_factor_,
394 max_page_scale_factor_); 385 max_page_scale_factor_);
395 } 386 }
396 387
397 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer()); 388 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer());
389
390 HideInnerViewportScrollbarsIfNearMinimumScale();
391 }
392
393 void LayerTreeImpl::HideInnerViewportScrollbarsIfNearMinimumScale() {
394 if (!InnerViewportContainerLayer())
395 return;
396
397 LayerImpl::ScrollbarSet* scrollbars =
398 InnerViewportContainerLayer()->scrollbars();
399
400 if (!scrollbars)
401 return;
402
403 for (LayerImpl::ScrollbarSet::iterator it = scrollbars->begin();
404 it != scrollbars->end();
405 ++it) {
406 ScrollbarLayerImplBase* scrollbar = *it;
407 float minimum_scale_to_show_at =
408 min_page_scale_factor() * settings().scrollbar_show_scale_threshold;
409 scrollbar->SetHideLayerAndSubtree(
410 current_page_scale_factor() < minimum_scale_to_show_at);
411 }
398 } 412 }
399 413
400 SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() { 414 SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() {
401 return page_scale_factor_.get(); 415 return page_scale_factor_.get();
402 } 416 }
403 417
404 const SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() const { 418 const SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() const {
405 return page_scale_factor_.get(); 419 return page_scale_factor_.get();
406 } 420 }
407 421
(...skipping 30 matching lines...) Expand all
438 top_controls_delta_ -= sent_top_controls_delta_; 452 top_controls_delta_ -= sent_top_controls_delta_;
439 sent_top_controls_delta_ = 0.f; 453 sent_top_controls_delta_ = 0.f;
440 454
441 if (!root_layer()) 455 if (!root_layer())
442 return; 456 return;
443 457
444 LayerTreeHostCommon::CallFunctionForSubtree( 458 LayerTreeHostCommon::CallFunctionForSubtree(
445 root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo)); 459 root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo));
446 } 460 }
447 461
448 static void ApplyScrollDeltasSinceBeginMainFrameTo(LayerImpl* layer) {
449 layer->ApplyScrollDeltasSinceBeginMainFrame();
450 }
451
452 void LayerTreeImpl::ApplyScrollDeltasSinceBeginMainFrame() {
453 DCHECK(IsPendingTree());
454 if (!root_layer())
455 return;
456
457 LayerTreeHostCommon::CallFunctionForSubtree(
458 root_layer(), base::Bind(&ApplyScrollDeltasSinceBeginMainFrameTo));
459 }
460
461 void LayerTreeImpl::SetViewportLayersFromIds( 462 void LayerTreeImpl::SetViewportLayersFromIds(
462 int overscroll_elasticity_layer_id, 463 int overscroll_elasticity_layer_id,
463 int page_scale_layer_id, 464 int page_scale_layer_id,
464 int inner_viewport_scroll_layer_id, 465 int inner_viewport_scroll_layer_id,
465 int outer_viewport_scroll_layer_id) { 466 int outer_viewport_scroll_layer_id) {
466 overscroll_elasticity_layer_ = LayerById(overscroll_elasticity_layer_id); 467 overscroll_elasticity_layer_ = LayerById(overscroll_elasticity_layer_id);
467 page_scale_layer_ = LayerById(page_scale_layer_id); 468 page_scale_layer_ = LayerById(page_scale_layer_id);
468 DCHECK(page_scale_layer_); 469 DCHECK(page_scale_layer_);
469 470
470 inner_viewport_scroll_layer_ = 471 inner_viewport_scroll_layer_ =
471 LayerById(inner_viewport_scroll_layer_id); 472 LayerById(inner_viewport_scroll_layer_id);
472 DCHECK(inner_viewport_scroll_layer_); 473 DCHECK(inner_viewport_scroll_layer_);
473 474
474 outer_viewport_scroll_layer_ = 475 outer_viewport_scroll_layer_ =
475 LayerById(outer_viewport_scroll_layer_id); 476 LayerById(outer_viewport_scroll_layer_id);
476 DCHECK(outer_viewport_scroll_layer_ || 477 DCHECK(outer_viewport_scroll_layer_ ||
477 outer_viewport_scroll_layer_id == Layer::INVALID_ID); 478 outer_viewport_scroll_layer_id == Layer::INVALID_ID);
478 479
480 HideInnerViewportScrollbarsIfNearMinimumScale();
481
479 if (!root_layer_scroll_offset_delegate_) 482 if (!root_layer_scroll_offset_delegate_)
480 return; 483 return;
481 484
482 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( 485 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
483 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_, 486 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_,
484 root_layer_scroll_offset_delegate_, 487 root_layer_scroll_offset_delegate_,
485 this)); 488 this));
486 489
487 if (outer_viewport_scroll_layer_) 490 if (outer_viewport_scroll_layer_)
488 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr( 491 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 if (outer_viewport_scroll_layer_) { 968 if (outer_viewport_scroll_layer_) {
966 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr( 969 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
967 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(), 970 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(),
968 root_layer_scroll_offset_delegate_, 971 root_layer_scroll_offset_delegate_,
969 this)); 972 this));
970 outer_viewport_scroll_layer_->SetScrollOffsetDelegate( 973 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
971 outer_viewport_scroll_delegate_proxy_.get()); 974 outer_viewport_scroll_delegate_proxy_.get());
972 } 975 }
973 976
974 if (inner_viewport_scroll_layer_) 977 if (inner_viewport_scroll_layer_)
978 inner_viewport_scroll_layer_->RefreshFromScrollDelegate();
979 if (outer_viewport_scroll_layer_)
980 outer_viewport_scroll_layer_->RefreshFromScrollDelegate();
981
982 if (inner_viewport_scroll_layer_)
975 UpdateScrollOffsetDelegate(); 983 UpdateScrollOffsetDelegate();
976 } 984 }
977 } 985 }
978 986
979 void LayerTreeImpl::OnRootLayerDelegatedScrollOffsetChanged() { 987 void LayerTreeImpl::OnRootLayerDelegatedScrollOffsetChanged() {
980 DCHECK(root_layer_scroll_offset_delegate_); 988 DCHECK(root_layer_scroll_offset_delegate_);
981 if (inner_viewport_scroll_layer_) { 989 if (inner_viewport_scroll_layer_) {
982 inner_viewport_scroll_layer_->DidScroll(); 990 inner_viewport_scroll_layer_->RefreshFromScrollDelegate();
983 } 991 }
984 if (outer_viewport_scroll_layer_) { 992 if (outer_viewport_scroll_layer_) {
985 outer_viewport_scroll_layer_->DidScroll(); 993 outer_viewport_scroll_layer_->RefreshFromScrollDelegate();
986 } 994 }
987 } 995 }
988 996
989 void LayerTreeImpl::UpdateScrollOffsetDelegate() { 997 void LayerTreeImpl::UpdateScrollOffsetDelegate() {
990 DCHECK(InnerViewportScrollLayer()); 998 DCHECK(InnerViewportScrollLayer());
991 DCHECK(!OuterViewportScrollLayer() || outer_viewport_scroll_delegate_proxy_); 999 DCHECK(!OuterViewportScrollLayer() || outer_viewport_scroll_delegate_proxy_);
992 DCHECK(root_layer_scroll_offset_delegate_); 1000 DCHECK(root_layer_scroll_offset_delegate_);
993 1001
994 gfx::ScrollOffset offset = 1002 gfx::ScrollOffset offset =
995 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); 1003 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1399 // At this point, we think the point does hit the touch event handler region 1407 // At this point, we think the point does hit the touch event handler region
1400 // on the layer, but we need to walk up the parents to ensure that the layer 1408 // on the layer, but we need to walk up the parents to ensure that the layer
1401 // was not clipped in such a way that the hit point actually should not hit 1409 // was not clipped in such a way that the hit point actually should not hit
1402 // the layer. 1410 // the layer.
1403 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) 1411 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl))
1404 return false; 1412 return false;
1405 1413
1406 return true; 1414 return true;
1407 } 1415 }
1408 1416
1417 struct FindWheelEventLayerFunctor {
1418 bool operator()(LayerImpl* layer) const {
1419 return layer->have_wheel_event_handlers();
1420 }
1421 };
1422
1423 LayerImpl* LayerTreeImpl::FindLayerWithWheelHandlerThatIsHitByPoint(
1424 const gfx::PointF& screen_space_point) {
1425 if (!root_layer())
1426 return NULL;
1427 if (!UpdateDrawProperties())
1428 return NULL;
1429 FindWheelEventLayerFunctor func;
1430 FindClosestMatchingLayerDataForRecursion data_for_recursion;
1431 FindClosestMatchingLayer(screen_space_point, root_layer(), func,
1432 &data_for_recursion);
1433 return data_for_recursion.closest_match;
1434 }
1435
1409 struct FindTouchEventLayerFunctor { 1436 struct FindTouchEventLayerFunctor {
1410 bool operator()(LayerImpl* layer) const { 1437 bool operator()(LayerImpl* layer) const {
1411 return LayerHasTouchEventHandlersAt(screen_space_point, layer); 1438 return LayerHasTouchEventHandlersAt(screen_space_point, layer);
1412 } 1439 }
1413 const gfx::PointF screen_space_point; 1440 const gfx::PointF screen_space_point;
1414 }; 1441 };
1415 1442
1416 LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion( 1443 LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion(
1417 const gfx::PointF& screen_space_point) { 1444 const gfx::PointF& screen_space_point) {
1418 if (!root_layer()) 1445 if (!root_layer())
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1523 scoped_ptr<PendingPageScaleAnimation> pending_animation) { 1550 scoped_ptr<PendingPageScaleAnimation> pending_animation) {
1524 pending_page_scale_animation_ = pending_animation.Pass(); 1551 pending_page_scale_animation_ = pending_animation.Pass();
1525 } 1552 }
1526 1553
1527 scoped_ptr<PendingPageScaleAnimation> 1554 scoped_ptr<PendingPageScaleAnimation>
1528 LayerTreeImpl::TakePendingPageScaleAnimation() { 1555 LayerTreeImpl::TakePendingPageScaleAnimation() {
1529 return pending_page_scale_animation_.Pass(); 1556 return pending_page_scale_animation_.Pass();
1530 } 1557 }
1531 1558
1532 } // namespace cc 1559 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | cc/trees/layer_tree_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698