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 <algorithm> |
7 #include <limits> | 8 #include <limits> |
8 #include <set> | 9 #include <set> |
9 | 10 |
10 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
11 #include "base/trace_event/trace_event_argument.h" | 12 #include "base/trace_event/trace_event_argument.h" |
12 #include "cc/animation/keyframed_animation_curve.h" | 13 #include "cc/animation/keyframed_animation_curve.h" |
13 #include "cc/animation/scrollbar_animation_controller.h" | 14 #include "cc/animation/scrollbar_animation_controller.h" |
14 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" | 15 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" |
15 #include "cc/animation/scrollbar_animation_controller_thinning.h" | 16 #include "cc/animation/scrollbar_animation_controller_thinning.h" |
16 #include "cc/base/math_util.h" | 17 #include "cc/base/math_util.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 private: | 70 private: |
70 LayerImpl* layer_; | 71 LayerImpl* layer_; |
71 LayerScrollOffsetDelegate* delegate_; | 72 LayerScrollOffsetDelegate* delegate_; |
72 LayerTreeImpl* layer_tree_impl_; | 73 LayerTreeImpl* layer_tree_impl_; |
73 gfx::ScrollOffset last_set_scroll_offset_; | 74 gfx::ScrollOffset last_set_scroll_offset_; |
74 }; | 75 }; |
75 | 76 |
76 LayerTreeImpl::LayerTreeImpl( | 77 LayerTreeImpl::LayerTreeImpl( |
77 LayerTreeHostImpl* layer_tree_host_impl, | 78 LayerTreeHostImpl* layer_tree_host_impl, |
78 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, | 79 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, |
| 80 scoped_refptr<SyncedTopControls> top_controls_shown_ratio, |
79 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) | 81 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) |
80 : layer_tree_host_impl_(layer_tree_host_impl), | 82 : layer_tree_host_impl_(layer_tree_host_impl), |
81 source_frame_number_(-1), | 83 source_frame_number_(-1), |
82 hud_layer_(0), | 84 hud_layer_(0), |
83 currently_scrolling_layer_(NULL), | 85 currently_scrolling_layer_(NULL), |
84 root_layer_scroll_offset_delegate_(NULL), | 86 root_layer_scroll_offset_delegate_(NULL), |
85 background_color_(0), | 87 background_color_(0), |
86 has_transparent_background_(false), | 88 has_transparent_background_(false), |
87 overscroll_elasticity_layer_(NULL), | 89 overscroll_elasticity_layer_(NULL), |
88 page_scale_layer_(NULL), | 90 page_scale_layer_(NULL), |
89 inner_viewport_scroll_layer_(NULL), | 91 inner_viewport_scroll_layer_(NULL), |
90 outer_viewport_scroll_layer_(NULL), | 92 outer_viewport_scroll_layer_(NULL), |
91 page_scale_factor_(page_scale_factor), | 93 page_scale_factor_(page_scale_factor), |
92 min_page_scale_factor_(0), | 94 min_page_scale_factor_(0), |
93 max_page_scale_factor_(0), | 95 max_page_scale_factor_(0), |
94 elastic_overscroll_(elastic_overscroll), | 96 elastic_overscroll_(elastic_overscroll), |
95 scrolling_layer_id_from_previous_tree_(0), | 97 scrolling_layer_id_from_previous_tree_(0), |
96 contents_textures_purged_(false), | 98 contents_textures_purged_(false), |
97 viewport_size_invalid_(false), | 99 viewport_size_invalid_(false), |
98 needs_update_draw_properties_(true), | 100 needs_update_draw_properties_(true), |
99 needs_full_tree_sync_(true), | 101 needs_full_tree_sync_(true), |
100 next_activation_forces_redraw_(false), | 102 next_activation_forces_redraw_(false), |
101 has_ever_been_drawn_(false), | 103 has_ever_been_drawn_(false), |
102 render_surface_layer_list_id_(0), | 104 render_surface_layer_list_id_(0), |
103 top_controls_shrink_blink_size_(false), | 105 top_controls_shrink_blink_size_(false), |
104 top_controls_height_(0), | 106 top_controls_height_(0), |
105 top_controls_content_offset_(0), | 107 top_controls_shown_ratio_(top_controls_shown_ratio) { |
106 top_controls_delta_(0), | |
107 sent_top_controls_delta_(0) { | |
108 } | 108 } |
109 | 109 |
110 LayerTreeImpl::~LayerTreeImpl() { | 110 LayerTreeImpl::~LayerTreeImpl() { |
111 BreakSwapPromises(SwapPromise::SWAP_FAILS); | 111 BreakSwapPromises(SwapPromise::SWAP_FAILS); |
112 | 112 |
113 // Need to explicitly clear the tree prior to destroying this so that | 113 // Need to explicitly clear the tree prior to destroying this so that |
114 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. | 114 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. |
115 DCHECK(!root_layer_); | 115 DCHECK(!root_layer_); |
116 DCHECK(layers_with_copy_output_request_.empty()); | 116 DCHECK(layers_with_copy_output_request_.empty()); |
117 } | 117 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 // The request queue should have been processed and does not require a push. | 203 // The request queue should have been processed and does not require a push. |
204 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); | 204 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); |
205 | 205 |
206 if (next_activation_forces_redraw_) { | 206 if (next_activation_forces_redraw_) { |
207 target_tree->ForceRedrawNextActivation(); | 207 target_tree->ForceRedrawNextActivation(); |
208 next_activation_forces_redraw_ = false; | 208 next_activation_forces_redraw_ = false; |
209 } | 209 } |
210 | 210 |
211 target_tree->PassSwapPromises(&swap_promise_list_); | 211 target_tree->PassSwapPromises(&swap_promise_list_); |
212 | 212 |
213 // Track the change in top controls height to offset the top_controls_delta | 213 target_tree->set_top_controls_shrink_blink_size( |
214 // properly. This is so that the top controls offset will be maintained | 214 top_controls_shrink_blink_size_); |
215 // across height changes. | 215 target_tree->set_top_controls_height(top_controls_height_); |
216 float top_controls_height_delta = | 216 target_tree->PushTopControls(nullptr); |
217 target_tree->top_controls_height_ - top_controls_height_; | |
218 | |
219 target_tree->top_controls_shrink_blink_size_ = | |
220 top_controls_shrink_blink_size_; | |
221 target_tree->top_controls_height_ = top_controls_height_; | |
222 target_tree->top_controls_content_offset_ = top_controls_content_offset_; | |
223 target_tree->top_controls_delta_ = target_tree->top_controls_delta_ - | |
224 target_tree->sent_top_controls_delta_ - | |
225 top_controls_height_delta; | |
226 target_tree->sent_top_controls_delta_ = 0.f; | |
227 | 217 |
228 // Active tree already shares the page_scale_factor object with pending | 218 // Active tree already shares the page_scale_factor object with pending |
229 // tree so only the limits need to be provided. | 219 // tree so only the limits need to be provided. |
230 target_tree->PushPageScaleFactorAndLimits(nullptr, min_page_scale_factor(), | 220 target_tree->PushPageScaleFactorAndLimits(nullptr, min_page_scale_factor(), |
231 max_page_scale_factor()); | 221 max_page_scale_factor()); |
232 target_tree->elastic_overscroll()->PushPendingToActive(); | 222 target_tree->elastic_overscroll()->PushPendingToActive(); |
233 | 223 |
234 target_tree->pending_page_scale_animation_ = | 224 target_tree->pending_page_scale_animation_ = |
235 pending_page_scale_animation_.Pass(); | 225 pending_page_scale_animation_.Pass(); |
236 | 226 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 } | 347 } |
358 if (IsActiveTree()) | 348 if (IsActiveTree()) |
359 changed_page_scale |= page_scale_factor_->PushPendingToActive(); | 349 changed_page_scale |= page_scale_factor_->PushPendingToActive(); |
360 changed_page_scale |= | 350 changed_page_scale |= |
361 SetPageScaleFactorLimits(min_page_scale_factor, max_page_scale_factor); | 351 SetPageScaleFactorLimits(min_page_scale_factor, max_page_scale_factor); |
362 | 352 |
363 if (changed_page_scale) | 353 if (changed_page_scale) |
364 DidUpdatePageScale(); | 354 DidUpdatePageScale(); |
365 } | 355 } |
366 | 356 |
| 357 void LayerTreeImpl::set_top_controls_shrink_blink_size(bool shrink) { |
| 358 if (top_controls_shrink_blink_size_ == shrink) |
| 359 return; |
| 360 |
| 361 top_controls_shrink_blink_size_ = shrink; |
| 362 if (IsActiveTree()) |
| 363 layer_tree_host_impl_->UpdateViewportContainerSizes(); |
| 364 } |
| 365 |
| 366 void LayerTreeImpl::set_top_controls_height(float top_controls_height) { |
| 367 if (top_controls_height_ == top_controls_height) |
| 368 return; |
| 369 |
| 370 top_controls_height_ = top_controls_height; |
| 371 if (IsActiveTree()) |
| 372 layer_tree_host_impl_->UpdateViewportContainerSizes(); |
| 373 } |
| 374 |
| 375 bool LayerTreeImpl::SetCurrentTopControlsShownRatio(float ratio) { |
| 376 ratio = std::max(ratio, 0.f); |
| 377 ratio = std::min(ratio, 1.f); |
| 378 return top_controls_shown_ratio_->SetCurrent(ratio); |
| 379 } |
| 380 |
| 381 void LayerTreeImpl::PushTopControlsFromMainThread( |
| 382 float top_controls_shown_ratio) { |
| 383 PushTopControls(&top_controls_shown_ratio); |
| 384 } |
| 385 |
| 386 void LayerTreeImpl::PushTopControls(const float* top_controls_shown_ratio) { |
| 387 DCHECK(top_controls_shown_ratio || IsActiveTree()); |
| 388 |
| 389 if (top_controls_shown_ratio) { |
| 390 DCHECK(!IsActiveTree() || !layer_tree_host_impl_->pending_tree()); |
| 391 top_controls_shown_ratio_->PushFromMainThread(*top_controls_shown_ratio); |
| 392 } |
| 393 if (IsActiveTree()) { |
| 394 if (top_controls_shown_ratio_->PushPendingToActive()) |
| 395 layer_tree_host_impl_->DidChangeTopControlsPosition(); |
| 396 } |
| 397 } |
| 398 |
367 bool LayerTreeImpl::SetPageScaleFactorLimits(float min_page_scale_factor, | 399 bool LayerTreeImpl::SetPageScaleFactorLimits(float min_page_scale_factor, |
368 float max_page_scale_factor) { | 400 float max_page_scale_factor) { |
369 if (min_page_scale_factor == min_page_scale_factor_ && | 401 if (min_page_scale_factor == min_page_scale_factor_ && |
370 max_page_scale_factor == max_page_scale_factor_) | 402 max_page_scale_factor == max_page_scale_factor_) |
371 return false; | 403 return false; |
372 | 404 |
373 min_page_scale_factor_ = min_page_scale_factor; | 405 min_page_scale_factor_ = min_page_scale_factor; |
374 max_page_scale_factor_ = max_page_scale_factor; | 406 max_page_scale_factor_ = max_page_scale_factor; |
375 | 407 |
376 return true; | 408 return true; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 } | 476 } |
445 | 477 |
446 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) { | 478 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) { |
447 layer->ApplySentScrollDeltasFromAbortedCommit(); | 479 layer->ApplySentScrollDeltasFromAbortedCommit(); |
448 } | 480 } |
449 | 481 |
450 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { | 482 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { |
451 DCHECK(IsActiveTree()); | 483 DCHECK(IsActiveTree()); |
452 | 484 |
453 page_scale_factor()->AbortCommit(); | 485 page_scale_factor()->AbortCommit(); |
| 486 top_controls_shown_ratio()->AbortCommit(); |
454 elastic_overscroll()->AbortCommit(); | 487 elastic_overscroll()->AbortCommit(); |
455 | 488 |
456 top_controls_content_offset_ += sent_top_controls_delta_; | |
457 top_controls_delta_ -= sent_top_controls_delta_; | |
458 sent_top_controls_delta_ = 0.f; | |
459 | |
460 if (!root_layer()) | 489 if (!root_layer()) |
461 return; | 490 return; |
462 | 491 |
463 LayerTreeHostCommon::CallFunctionForSubtree( | 492 LayerTreeHostCommon::CallFunctionForSubtree( |
464 root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo)); | 493 root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo)); |
465 } | 494 } |
466 | 495 |
467 void LayerTreeImpl::SetViewportLayersFromIds( | 496 void LayerTreeImpl::SetViewportLayersFromIds( |
468 int overscroll_elasticity_layer_id, | 497 int overscroll_elasticity_layer_id, |
469 int page_scale_layer_id, | 498 int page_scale_layer_id, |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 scoped_ptr<PendingPageScaleAnimation> pending_animation) { | 1585 scoped_ptr<PendingPageScaleAnimation> pending_animation) { |
1557 pending_page_scale_animation_ = pending_animation.Pass(); | 1586 pending_page_scale_animation_ = pending_animation.Pass(); |
1558 } | 1587 } |
1559 | 1588 |
1560 scoped_ptr<PendingPageScaleAnimation> | 1589 scoped_ptr<PendingPageScaleAnimation> |
1561 LayerTreeImpl::TakePendingPageScaleAnimation() { | 1590 LayerTreeImpl::TakePendingPageScaleAnimation() { |
1562 return pending_page_scale_animation_.Pass(); | 1591 return pending_page_scale_animation_.Pass(); |
1563 } | 1592 } |
1564 | 1593 |
1565 } // namespace cc | 1594 } // namespace cc |
OLD | NEW |