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_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <stack> | 8 #include <stack> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 | 459 |
460 const RendererCapabilities& LayerTreeHost::GetRendererCapabilities() const { | 460 const RendererCapabilities& LayerTreeHost::GetRendererCapabilities() const { |
461 return proxy_->GetRendererCapabilities(); | 461 return proxy_->GetRendererCapabilities(); |
462 } | 462 } |
463 | 463 |
464 void LayerTreeHost::SetNeedsAnimate() { | 464 void LayerTreeHost::SetNeedsAnimate() { |
465 DCHECK(proxy_->HasImplThread()); | 465 DCHECK(proxy_->HasImplThread()); |
466 proxy_->SetNeedsAnimate(); | 466 proxy_->SetNeedsAnimate(); |
467 } | 467 } |
468 | 468 |
| 469 void LayerTreeHost::SetNeedsUpdateLayers() { |
| 470 proxy_->SetNeedsUpdateLayers(); |
| 471 } |
| 472 |
469 void LayerTreeHost::SetNeedsCommit() { | 473 void LayerTreeHost::SetNeedsCommit() { |
470 if (!prepaint_callback_.IsCancelled()) { | 474 if (!prepaint_callback_.IsCancelled()) { |
471 TRACE_EVENT_INSTANT0("cc", | 475 TRACE_EVENT_INSTANT0("cc", |
472 "LayerTreeHost::SetNeedsCommit::cancel prepaint", | 476 "LayerTreeHost::SetNeedsCommit::cancel prepaint", |
473 TRACE_EVENT_SCOPE_THREAD); | 477 TRACE_EVENT_SCOPE_THREAD); |
474 prepaint_callback_.Cancel(); | 478 prepaint_callback_.Cancel(); |
475 } | 479 } |
476 proxy_->SetNeedsCommit(); | 480 proxy_->SetNeedsCommit(); |
477 } | 481 } |
478 | 482 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 } | 575 } |
572 | 576 |
573 void LayerTreeHost::SetOverdrawBottomHeight(float overdraw_bottom_height) { | 577 void LayerTreeHost::SetOverdrawBottomHeight(float overdraw_bottom_height) { |
574 if (overdraw_bottom_height_ == overdraw_bottom_height) | 578 if (overdraw_bottom_height_ == overdraw_bottom_height) |
575 return; | 579 return; |
576 | 580 |
577 overdraw_bottom_height_ = overdraw_bottom_height; | 581 overdraw_bottom_height_ = overdraw_bottom_height; |
578 SetNeedsCommit(); | 582 SetNeedsCommit(); |
579 } | 583 } |
580 | 584 |
| 585 void LayerTreeHost::ApplyPageScaleDeltaFromImplSide(float page_scale_delta) { |
| 586 DCHECK(CommitRequested()); |
| 587 page_scale_factor_ *= page_scale_delta; |
| 588 } |
| 589 |
581 void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, | 590 void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, |
582 float min_page_scale_factor, | 591 float min_page_scale_factor, |
583 float max_page_scale_factor) { | 592 float max_page_scale_factor) { |
584 if (page_scale_factor == page_scale_factor_ && | 593 if (page_scale_factor == page_scale_factor_ && |
585 min_page_scale_factor == min_page_scale_factor_ && | 594 min_page_scale_factor == min_page_scale_factor_ && |
586 max_page_scale_factor == max_page_scale_factor_) | 595 max_page_scale_factor == max_page_scale_factor_) |
587 return; | 596 return; |
588 | 597 |
589 page_scale_factor_ = page_scale_factor; | 598 page_scale_factor_ = page_scale_factor; |
590 min_page_scale_factor_ = min_page_scale_factor; | 599 min_page_scale_factor_ = min_page_scale_factor; |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 | 953 |
945 in_paint_layer_contents_ = false; | 954 in_paint_layer_contents_ = false; |
946 | 955 |
947 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 956 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
948 } | 957 } |
949 | 958 |
950 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 959 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
951 if (!root_layer_.get()) | 960 if (!root_layer_.get()) |
952 return; | 961 return; |
953 | 962 |
| 963 gfx::Vector2d root_scroll_delta; |
954 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 964 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
955 gfx::Vector2d root_scroll_delta; | |
956 | 965 |
957 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 966 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
958 Layer* layer = | 967 Layer* layer = |
959 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 968 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
960 info.scrolls[i].layer_id); | 969 info.scrolls[i].layer_id); |
961 if (!layer) | 970 if (!layer) |
962 continue; | 971 continue; |
963 if (layer == root_scroll_layer) { | 972 if (layer == root_scroll_layer) { |
964 root_scroll_delta += info.scrolls[i].scroll_delta; | 973 root_scroll_delta += info.scrolls[i].scroll_delta; |
965 } else { | 974 } else { |
966 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 975 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
967 info.scrolls[i].scroll_delta); | 976 info.scrolls[i].scroll_delta); |
968 } | 977 } |
969 } | 978 } |
970 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) | 979 |
| 980 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { |
| 981 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
| 982 // so re-get this layer before doing anything to it. |
| 983 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
| 984 |
| 985 // Preemptively apply the scroll offset and scale delta here before sending |
| 986 // it to the client. If the client comes back and sets it to the same |
| 987 // value, then the layer can early out without needing a full commit. |
| 988 if (root_scroll_layer) { |
| 989 root_scroll_layer->SetScrollOffsetFromImplSide( |
| 990 root_scroll_layer->scroll_offset() + root_scroll_delta); |
| 991 } |
| 992 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
971 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); | 993 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); |
| 994 } |
972 } | 995 } |
973 | 996 |
974 void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { | 997 void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { |
975 if (animating_) | 998 if (animating_) |
976 return; | 999 return; |
977 | 1000 |
978 DCHECK(context3d); | 1001 DCHECK(context3d); |
979 RateLimiterMap::iterator it = rate_limiters_.find(context3d); | 1002 RateLimiterMap::iterator it = rate_limiters_.find(context3d); |
980 if (it != rate_limiters_.end()) { | 1003 if (it != rate_limiters_.end()) { |
981 it->second->Start(); | 1004 it->second->Start(); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); | 1084 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); |
1062 iter != copy.end(); | 1085 iter != copy.end(); |
1063 ++iter) { | 1086 ++iter) { |
1064 (*iter).second->Animate(monotonic_time); | 1087 (*iter).second->Animate(monotonic_time); |
1065 bool start_ready_animations = true; | 1088 bool start_ready_animations = true; |
1066 (*iter).second->UpdateState(start_ready_animations, NULL); | 1089 (*iter).second->UpdateState(start_ready_animations, NULL); |
1067 } | 1090 } |
1068 } | 1091 } |
1069 | 1092 |
1070 } // namespace cc | 1093 } // namespace cc |
OLD | NEW |