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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 overhang_ui_resource_.reset(); | 156 overhang_ui_resource_.reset(); |
157 | 157 |
158 if (root_layer_.get()) | 158 if (root_layer_.get()) |
159 root_layer_->SetLayerTreeHost(NULL); | 159 root_layer_->SetLayerTreeHost(NULL); |
160 | 160 |
161 if (proxy_) { | 161 if (proxy_) { |
162 DCHECK(proxy_->IsMainThread()); | 162 DCHECK(proxy_->IsMainThread()); |
163 proxy_->Stop(); | 163 proxy_->Stop(); |
164 } | 164 } |
165 | 165 |
| 166 // We must clear any pointers into the layer tree prior to destroying it. |
| 167 RegisterViewportLayers(NULL, NULL, NULL); |
| 168 |
166 if (root_layer_.get()) { | 169 if (root_layer_.get()) { |
167 // The layer tree must be destroyed before the layer tree host. We've | 170 // The layer tree must be destroyed before the layer tree host. We've |
168 // made a contract with our animation controllers that the registrar | 171 // made a contract with our animation controllers that the registrar |
169 // will outlive them, and we must make good. | 172 // will outlive them, and we must make good. |
170 root_layer_ = NULL; | 173 root_layer_ = NULL; |
171 } | 174 } |
172 } | 175 } |
173 | 176 |
174 void LayerTreeHost::SetLayerTreeHostClientReady() { | 177 void LayerTreeHost::SetLayerTreeHostClientReady() { |
175 proxy_->SetLayerTreeHostClientReady(); | 178 proxy_->SetLayerTreeHostClientReady(); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( | 334 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( |
332 sync_tree->root_layer(), hud_layer_->id()); | 335 sync_tree->root_layer(), hud_layer_->id()); |
333 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); | 336 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); |
334 } else { | 337 } else { |
335 sync_tree->set_hud_layer(NULL); | 338 sync_tree->set_hud_layer(NULL); |
336 } | 339 } |
337 | 340 |
338 sync_tree->set_background_color(background_color_); | 341 sync_tree->set_background_color(background_color_); |
339 sync_tree->set_has_transparent_background(has_transparent_background_); | 342 sync_tree->set_has_transparent_background(has_transparent_background_); |
340 | 343 |
341 sync_tree->FindRootScrollLayer(); | 344 if (page_scale_layer_ && inner_viewport_scroll_layer_) { |
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_); | |
347 sync_tree->SetViewportLayersFromIds( | 345 sync_tree->SetViewportLayersFromIds( |
348 page_scale_layer_->id(), | 346 page_scale_layer_->id(), |
349 inner_viewport_scroll_layer_->id(), | 347 inner_viewport_scroll_layer_->id(), |
350 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() | 348 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() |
351 : Layer::INVALID_ID); | 349 : Layer::INVALID_ID); |
352 } else { | 350 } else { |
353 sync_tree->ClearViewportLayers(); | 351 sync_tree->ClearViewportLayers(); |
354 } | 352 } |
355 | 353 |
356 float page_scale_delta, sent_page_scale_delta; | 354 float page_scale_delta, sent_page_scale_delta; |
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 | 1036 |
1039 in_paint_layer_contents_ = false; | 1037 in_paint_layer_contents_ = false; |
1040 | 1038 |
1041 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 1039 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
1042 } | 1040 } |
1043 | 1041 |
1044 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 1042 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
1045 if (!root_layer_.get()) | 1043 if (!root_layer_.get()) |
1046 return; | 1044 return; |
1047 | 1045 |
1048 gfx::Vector2d root_scroll_delta; | 1046 gfx::Vector2d inner_viewport_scroll_delta; |
1049 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 1047 gfx::Vector2d outer_viewport_scroll_delta; |
1050 | 1048 |
1051 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 1049 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
1052 Layer* layer = | 1050 Layer* layer = |
1053 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 1051 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
1054 info.scrolls[i].layer_id); | 1052 info.scrolls[i].layer_id); |
1055 if (!layer) | 1053 if (!layer) |
1056 continue; | 1054 continue; |
1057 if (layer == root_scroll_layer) { | 1055 if (layer == outer_viewport_scroll_layer_.get()) { |
1058 root_scroll_delta += info.scrolls[i].scroll_delta; | 1056 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
| 1057 } else if (layer == inner_viewport_scroll_layer_.get()) { |
| 1058 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
1059 } else { | 1059 } else { |
1060 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 1060 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
1061 info.scrolls[i].scroll_delta); | 1061 info.scrolls[i].scroll_delta); |
1062 } | 1062 } |
1063 } | 1063 } |
1064 | 1064 |
1065 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { | 1065 if (!inner_viewport_scroll_delta.IsZero() || |
| 1066 !outer_viewport_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { |
1066 // SetScrollOffsetFromImplSide above could have destroyed the tree, | 1067 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
1067 // so re-get this layer before doing anything to it. | 1068 // so re-get this layer before doing anything to it. |
1068 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | |
1069 | 1069 |
1070 // Preemptively apply the scroll offset and scale delta here before sending | 1070 // Preemptively apply the scroll offset and scale delta here before sending |
1071 // 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 |
1072 // 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. |
1073 if (root_scroll_layer) { | 1073 DCHECK(inner_viewport_scroll_layer_); // We should always have this. |
1074 root_scroll_layer->SetScrollOffsetFromImplSide( | 1074 |
1075 root_scroll_layer->scroll_offset() + root_scroll_delta); | 1075 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
| 1076 inner_viewport_scroll_layer_->scroll_offset() + |
| 1077 inner_viewport_scroll_delta); |
| 1078 if (outer_viewport_scroll_layer_) { |
| 1079 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
| 1080 outer_viewport_scroll_layer_->scroll_offset() + |
| 1081 outer_viewport_scroll_delta); |
1076 } | 1082 } |
1077 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); | 1083 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
1078 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); | 1084 |
| 1085 client_->ApplyScrollAndScale( |
| 1086 inner_viewport_scroll_delta + outer_viewport_scroll_delta, |
| 1087 info.page_scale_delta); |
1079 } | 1088 } |
1080 } | 1089 } |
1081 | 1090 |
| 1091 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports( |
| 1092 const gfx::Vector2d offset, |
| 1093 Layer* layer) { |
| 1094 DCHECK(layer); |
| 1095 if (layer != outer_viewport_scroll_layer_.get()) |
| 1096 return offset; |
| 1097 |
| 1098 gfx::Vector2d inner_viewport_offset = |
| 1099 inner_viewport_scroll_layer_->scroll_offset(); |
| 1100 gfx::Vector2d outer_viewport_offset = |
| 1101 outer_viewport_scroll_layer_->scroll_offset(); |
| 1102 |
| 1103 if (offset == inner_viewport_offset + outer_viewport_offset) { |
| 1104 // In this case, nothing should change, so we just return to the outer |
| 1105 // viewport the offset is already has. |
| 1106 return outer_viewport_offset; |
| 1107 } |
| 1108 |
| 1109 // In the spirit of document-scrolls-first, we always want any change to |
| 1110 // go to the outer viewport first. |
| 1111 gfx::Vector2d max_outer_viewport_scroll_offset = |
| 1112 outer_viewport_scroll_layer_->MaxScrollOffset(); |
| 1113 #if ENABLE_DCHECK |
| 1114 // TODO(wjmaclean) The DCHECK below is triggering during zoom-out. |
| 1115 // crbug.com/336574 |
| 1116 /* |
| 1117 gfx::Vector2d maxInnerViewportScrollOffset = |
| 1118 inner_viewport_scroll_layer_->MaxScrollOffset(); |
| 1119 |
| 1120 gfx::Vector2d totalMaxScrollOffset = |
| 1121 max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset; |
| 1122 DCHECK(totalMaxScrollOffset.x() >= offset.x() && |
| 1123 totalMaxScrollOffset.y() >= offset.y()); |
| 1124 */ |
| 1125 #endif |
| 1126 |
| 1127 outer_viewport_offset = offset - inner_viewport_offset; |
| 1128 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); |
| 1129 outer_viewport_offset.SetToMax(gfx::Vector2d()); |
| 1130 |
| 1131 inner_viewport_offset = offset - outer_viewport_offset; |
| 1132 inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset); |
| 1133 |
| 1134 return outer_viewport_offset; |
| 1135 } |
| 1136 |
1082 void LayerTreeHost::StartRateLimiter() { | 1137 void LayerTreeHost::StartRateLimiter() { |
1083 if (animating_) | 1138 if (animating_) |
1084 return; | 1139 return; |
1085 | 1140 |
1086 if (!rate_limit_timer_.IsRunning()) { | 1141 if (!rate_limit_timer_.IsRunning()) { |
1087 rate_limit_timer_.Start(FROM_HERE, | 1142 rate_limit_timer_.Start(FROM_HERE, |
1088 base::TimeDelta(), | 1143 base::TimeDelta(), |
1089 this, | 1144 this, |
1090 &LayerTreeHost::RateLimit); | 1145 &LayerTreeHost::RateLimit); |
1091 } | 1146 } |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 swap_promise_list_.push_back(swap_promise.Pass()); | 1327 swap_promise_list_.push_back(swap_promise.Pass()); |
1273 } | 1328 } |
1274 | 1329 |
1275 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { | 1330 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { |
1276 for (size_t i = 0; i < swap_promise_list_.size(); i++) | 1331 for (size_t i = 0; i < swap_promise_list_.size(); i++) |
1277 swap_promise_list_[i]->DidNotSwap(reason); | 1332 swap_promise_list_[i]->DidNotSwap(reason); |
1278 swap_promise_list_.clear(); | 1333 swap_promise_list_.clear(); |
1279 } | 1334 } |
1280 | 1335 |
1281 } // namespace cc | 1336 } // namespace cc |
OLD | NEW |