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 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 | 462 |
463 const RendererCapabilities& LayerTreeHost::GetRendererCapabilities() const { | 463 const RendererCapabilities& LayerTreeHost::GetRendererCapabilities() const { |
464 return proxy_->GetRendererCapabilities(); | 464 return proxy_->GetRendererCapabilities(); |
465 } | 465 } |
466 | 466 |
467 void LayerTreeHost::SetNeedsAnimate() { | 467 void LayerTreeHost::SetNeedsAnimate() { |
468 DCHECK(proxy_->HasImplThread()); | 468 DCHECK(proxy_->HasImplThread()); |
469 proxy_->SetNeedsAnimate(); | 469 proxy_->SetNeedsAnimate(); |
470 } | 470 } |
471 | 471 |
| 472 void LayerTreeHost::SetNeedsUpdateLayers() { proxy_->SetNeedsUpdateLayers(); } |
| 473 |
472 void LayerTreeHost::SetNeedsCommit() { | 474 void LayerTreeHost::SetNeedsCommit() { |
473 if (!prepaint_callback_.IsCancelled()) { | 475 if (!prepaint_callback_.IsCancelled()) { |
474 TRACE_EVENT_INSTANT0("cc", | 476 TRACE_EVENT_INSTANT0("cc", |
475 "LayerTreeHost::SetNeedsCommit::cancel prepaint", | 477 "LayerTreeHost::SetNeedsCommit::cancel prepaint", |
476 TRACE_EVENT_SCOPE_THREAD); | 478 TRACE_EVENT_SCOPE_THREAD); |
477 prepaint_callback_.Cancel(); | 479 prepaint_callback_.Cancel(); |
478 } | 480 } |
479 proxy_->SetNeedsCommit(); | 481 proxy_->SetNeedsCommit(); |
480 } | 482 } |
481 | 483 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 } | 576 } |
575 | 577 |
576 void LayerTreeHost::SetOverdrawBottomHeight(float overdraw_bottom_height) { | 578 void LayerTreeHost::SetOverdrawBottomHeight(float overdraw_bottom_height) { |
577 if (overdraw_bottom_height_ == overdraw_bottom_height) | 579 if (overdraw_bottom_height_ == overdraw_bottom_height) |
578 return; | 580 return; |
579 | 581 |
580 overdraw_bottom_height_ = overdraw_bottom_height; | 582 overdraw_bottom_height_ = overdraw_bottom_height; |
581 SetNeedsCommit(); | 583 SetNeedsCommit(); |
582 } | 584 } |
583 | 585 |
| 586 void LayerTreeHost::ApplyPageScaleDeltaFromImplSide(float page_scale_delta) { |
| 587 DCHECK(CommitRequested()); |
| 588 page_scale_factor_ *= page_scale_delta; |
| 589 } |
| 590 |
584 void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, | 591 void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, |
585 float min_page_scale_factor, | 592 float min_page_scale_factor, |
586 float max_page_scale_factor) { | 593 float max_page_scale_factor) { |
587 if (page_scale_factor == page_scale_factor_ && | 594 if (page_scale_factor == page_scale_factor_ && |
588 min_page_scale_factor == min_page_scale_factor_ && | 595 min_page_scale_factor == min_page_scale_factor_ && |
589 max_page_scale_factor == max_page_scale_factor_) | 596 max_page_scale_factor == max_page_scale_factor_) |
590 return; | 597 return; |
591 | 598 |
592 page_scale_factor_ = page_scale_factor; | 599 page_scale_factor_ = page_scale_factor; |
593 min_page_scale_factor_ = min_page_scale_factor; | 600 min_page_scale_factor_ = min_page_scale_factor; |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
958 | 965 |
959 in_paint_layer_contents_ = false; | 966 in_paint_layer_contents_ = false; |
960 | 967 |
961 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 968 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
962 } | 969 } |
963 | 970 |
964 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 971 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
965 if (!root_layer_.get()) | 972 if (!root_layer_.get()) |
966 return; | 973 return; |
967 | 974 |
| 975 gfx::Vector2d root_scroll_delta; |
968 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 976 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
969 gfx::Vector2d root_scroll_delta; | |
970 | 977 |
971 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 978 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
972 Layer* layer = | 979 Layer* layer = |
973 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 980 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
974 info.scrolls[i].layer_id); | 981 info.scrolls[i].layer_id); |
975 if (!layer) | 982 if (!layer) |
976 continue; | 983 continue; |
977 if (layer == root_scroll_layer) { | 984 if (layer == root_scroll_layer) { |
978 root_scroll_delta += info.scrolls[i].scroll_delta; | 985 root_scroll_delta += info.scrolls[i].scroll_delta; |
979 } else { | 986 } else { |
980 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 987 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
981 info.scrolls[i].scroll_delta); | 988 info.scrolls[i].scroll_delta); |
982 } | 989 } |
983 } | 990 } |
984 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) | 991 |
| 992 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { |
| 993 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
| 994 // so re-get this layer before doing anything to it. |
| 995 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
| 996 |
| 997 // Preemptively apply the scroll offset and scale delta here before sending |
| 998 // it to the client. If the client comes back and sets it to the same |
| 999 // value, then the layer can early out without needing a full commit. |
| 1000 if (root_scroll_layer) { |
| 1001 root_scroll_layer->SetScrollOffsetFromImplSide( |
| 1002 root_scroll_layer->scroll_offset() + root_scroll_delta); |
| 1003 } |
| 1004 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
985 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); | 1005 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); |
| 1006 } |
986 } | 1007 } |
987 | 1008 |
988 void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { | 1009 void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { |
989 if (animating_) | 1010 if (animating_) |
990 return; | 1011 return; |
991 | 1012 |
992 DCHECK(context3d); | 1013 DCHECK(context3d); |
993 RateLimiterMap::iterator it = rate_limiters_.find(context3d); | 1014 RateLimiterMap::iterator it = rate_limiters_.find(context3d); |
994 if (it != rate_limiters_.end()) { | 1015 if (it != rate_limiters_.end()) { |
995 it->second->Start(); | 1016 it->second->Start(); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); | 1096 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); |
1076 iter != copy.end(); | 1097 iter != copy.end(); |
1077 ++iter) { | 1098 ++iter) { |
1078 (*iter).second->Animate(monotonic_time); | 1099 (*iter).second->Animate(monotonic_time); |
1079 bool start_ready_animations = true; | 1100 bool start_ready_animations = true; |
1080 (*iter).second->UpdateState(start_ready_animations, NULL); | 1101 (*iter).second->UpdateState(start_ready_animations, NULL); |
1081 } | 1102 } |
1082 } | 1103 } |
1083 | 1104 |
1084 } // namespace cc | 1105 } // namespace cc |
OLD | NEW |