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 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( | 331 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( |
332 sync_tree->root_layer(), hud_layer_->id()); | 332 sync_tree->root_layer(), hud_layer_->id()); |
333 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); | 333 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); |
334 } else { | 334 } else { |
335 sync_tree->set_hud_layer(NULL); | 335 sync_tree->set_hud_layer(NULL); |
336 } | 336 } |
337 | 337 |
338 sync_tree->set_background_color(background_color_); | 338 sync_tree->set_background_color(background_color_); |
339 sync_tree->set_has_transparent_background(has_transparent_background_); | 339 sync_tree->set_has_transparent_background(has_transparent_background_); |
340 | 340 |
341 if (page_scale_layer_ && inner_viewport_scroll_layer_) { | 341 sync_tree->FindRootScrollLayer(); |
| 342 |
| 343 // TODO(wjmaclean) For now, not all LTH clients will register viewports, so |
| 344 // only set them when available.. |
| 345 if (page_scale_layer_) { |
| 346 DCHECK(inner_viewport_scroll_layer_); |
342 sync_tree->SetViewportLayersFromIds( | 347 sync_tree->SetViewportLayersFromIds( |
343 page_scale_layer_->id(), | 348 page_scale_layer_->id(), |
344 inner_viewport_scroll_layer_->id(), | 349 inner_viewport_scroll_layer_->id(), |
345 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() | 350 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() |
346 : Layer::INVALID_ID); | 351 : Layer::INVALID_ID); |
347 } else { | 352 } else { |
348 sync_tree->ClearViewportLayers(); | 353 sync_tree->ClearViewportLayers(); |
349 } | 354 } |
350 | 355 |
351 float page_scale_delta, sent_page_scale_delta; | 356 float page_scale_delta, sent_page_scale_delta; |
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1033 | 1038 |
1034 in_paint_layer_contents_ = false; | 1039 in_paint_layer_contents_ = false; |
1035 | 1040 |
1036 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 1041 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
1037 } | 1042 } |
1038 | 1043 |
1039 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 1044 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
1040 if (!root_layer_.get()) | 1045 if (!root_layer_.get()) |
1041 return; | 1046 return; |
1042 | 1047 |
1043 gfx::Vector2d inner_viewport_scroll_delta; | 1048 gfx::Vector2d root_scroll_delta; |
1044 gfx::Vector2d outer_viewport_scroll_delta; | 1049 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
1045 | 1050 |
1046 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 1051 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
1047 Layer* layer = | 1052 Layer* layer = |
1048 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 1053 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
1049 info.scrolls[i].layer_id); | 1054 info.scrolls[i].layer_id); |
1050 if (!layer) | 1055 if (!layer) |
1051 continue; | 1056 continue; |
1052 if (layer == outer_viewport_scroll_layer_.get()) { | 1057 if (layer == root_scroll_layer) { |
1053 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta; | 1058 root_scroll_delta += info.scrolls[i].scroll_delta; |
1054 } else if (layer == inner_viewport_scroll_layer_.get()) { | |
1055 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta; | |
1056 } else { | 1059 } else { |
1057 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 1060 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
1058 info.scrolls[i].scroll_delta); | 1061 info.scrolls[i].scroll_delta); |
1059 } | 1062 } |
1060 } | 1063 } |
1061 | 1064 |
1062 if (!inner_viewport_scroll_delta.IsZero() || | 1065 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { |
1063 !outer_viewport_scroll_delta.IsZero() || | |
1064 info.page_scale_delta != 1.f) { | |
1065 // SetScrollOffsetFromImplSide above could have destroyed the tree, | 1066 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
1066 // so re-get this layer before doing anything to it. | 1067 // so re-get this layer before doing anything to it. |
| 1068 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
1067 | 1069 |
1068 // Preemptively apply the scroll offset and scale delta here before sending | 1070 // Preemptively apply the scroll offset and scale delta here before sending |
1069 // it to the client. If the client comes back and sets it to the same | 1071 // it to the client. If the client comes back and sets it to the same |
1070 // value, then the layer can early out without needing a full commit. | 1072 // value, then the layer can early out without needing a full commit. |
1071 DCHECK(inner_viewport_scroll_layer_); // We should always have this. | 1073 if (root_scroll_layer) { |
1072 | 1074 root_scroll_layer->SetScrollOffsetFromImplSide( |
1073 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | 1075 root_scroll_layer->scroll_offset() + root_scroll_delta); |
1074 inner_viewport_scroll_layer_->scroll_offset() + | |
1075 inner_viewport_scroll_delta); | |
1076 if (outer_viewport_scroll_layer_) { | |
1077 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | |
1078 outer_viewport_scroll_layer_->scroll_offset() + | |
1079 outer_viewport_scroll_delta); | |
1080 } | 1076 } |
1081 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); | 1077 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
1082 | 1078 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); |
1083 client_->ApplyScrollAndScale( | |
1084 inner_viewport_scroll_delta + outer_viewport_scroll_delta, | |
1085 info.page_scale_delta); | |
1086 } | 1079 } |
1087 } | 1080 } |
1088 | 1081 |
1089 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports( | |
1090 const gfx::Vector2d offset, | |
1091 Layer* layer) { | |
1092 DCHECK(layer); | |
1093 if (layer != outer_viewport_scroll_layer_.get()) | |
1094 return offset; | |
1095 | |
1096 gfx::Vector2d inner_viewport_offset = | |
1097 inner_viewport_scroll_layer_->scroll_offset(); | |
1098 gfx::Vector2d outer_viewport_offset = | |
1099 outer_viewport_scroll_layer_->scroll_offset(); | |
1100 | |
1101 if (offset == inner_viewport_offset + outer_viewport_offset) { | |
1102 // In this case, nothing should change, so we just return to the outer | |
1103 // viewport the offset is already has. | |
1104 return outer_viewport_offset; | |
1105 } | |
1106 | |
1107 // In the spirit of document-scrolls-first, we always want any change to | |
1108 // go to the outer viewport first. | |
1109 gfx::Vector2d max_outer_viewport_scroll_offset = | |
1110 outer_viewport_scroll_layer_->MaxScrollOffset(); | |
1111 #if ENABLE_DCHECK | |
1112 // TODO(wjmaclean) The DCHECK below is triggering during zoom-out. | |
1113 // crbug.com/336574 | |
1114 /* | |
1115 gfx::Vector2d maxInnerViewportScrollOffset = | |
1116 inner_viewport_scroll_layer_->MaxScrollOffset(); | |
1117 | |
1118 gfx::Vector2d totalMaxScrollOffset = | |
1119 max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset; | |
1120 DCHECK(totalMaxScrollOffset.x() >= offset.x() && | |
1121 totalMaxScrollOffset.y() >= offset.y()); | |
1122 */ | |
1123 #endif | |
1124 | |
1125 outer_viewport_offset = offset - inner_viewport_offset; | |
1126 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); | |
1127 outer_viewport_offset.SetToMax(gfx::Vector2d()); | |
1128 | |
1129 inner_viewport_offset = offset - outer_viewport_offset; | |
1130 inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset); | |
1131 | |
1132 return outer_viewport_offset; | |
1133 } | |
1134 | |
1135 void LayerTreeHost::StartRateLimiter() { | 1082 void LayerTreeHost::StartRateLimiter() { |
1136 if (animating_) | 1083 if (animating_) |
1137 return; | 1084 return; |
1138 | 1085 |
1139 if (!rate_limit_timer_.IsRunning()) { | 1086 if (!rate_limit_timer_.IsRunning()) { |
1140 rate_limit_timer_.Start(FROM_HERE, | 1087 rate_limit_timer_.Start(FROM_HERE, |
1141 base::TimeDelta(), | 1088 base::TimeDelta(), |
1142 this, | 1089 this, |
1143 &LayerTreeHost::RateLimit); | 1090 &LayerTreeHost::RateLimit); |
1144 } | 1091 } |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 swap_promise_list_.push_back(swap_promise.Pass()); | 1272 swap_promise_list_.push_back(swap_promise.Pass()); |
1326 } | 1273 } |
1327 | 1274 |
1328 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { | 1275 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { |
1329 for (size_t i = 0; i < swap_promise_list_.size(); i++) | 1276 for (size_t i = 0; i < swap_promise_list_.size(); i++) |
1330 swap_promise_list_[i]->DidNotSwap(reason); | 1277 swap_promise_list_[i]->DidNotSwap(reason); |
1331 swap_promise_list_.clear(); | 1278 swap_promise_list_.clear(); |
1332 } | 1279 } |
1333 | 1280 |
1334 } // namespace cc | 1281 } // namespace cc |
OLD | NEW |