Chromium Code Reviews| 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 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( | 325 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( |
| 326 sync_tree->root_layer(), hud_layer_->id()); | 326 sync_tree->root_layer(), hud_layer_->id()); |
| 327 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); | 327 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); |
| 328 } else { | 328 } else { |
| 329 sync_tree->set_hud_layer(NULL); | 329 sync_tree->set_hud_layer(NULL); |
| 330 } | 330 } |
| 331 | 331 |
| 332 sync_tree->set_background_color(background_color_); | 332 sync_tree->set_background_color(background_color_); |
| 333 sync_tree->set_has_transparent_background(has_transparent_background_); | 333 sync_tree->set_has_transparent_background(has_transparent_background_); |
| 334 | 334 |
| 335 sync_tree->FindRootScrollLayer(); | 335 if (page_scale_layer_ && inner_viewport_scroll_layer_) { |
|
aelias_OOO_until_Jul13
2014/01/16 03:44:04
I don't follow why this can be removed (particular
wjmaclean
2014/01/16 15:07:32
The functions that register the inner/outerviewpor
|
aelias_OOO_until_Jul13
2014/01/16 03:44:04
I suggest doing DCHECK(inner_viewport_scroll_layer
wjmaclean
2014/01/16 15:07:32
There are tests that do not explicitly specify the
|
| 336 | |
| 337 // TODO(wjmaclean) For now, not all LTH clients will register viewports, so | |
| 338 // only set them when available.. | |
| 339 if (page_scale_layer_) { | |
| 340 DCHECK(inner_viewport_scroll_layer_); | |
| 341 sync_tree->SetViewportLayersFromIds( | 336 sync_tree->SetViewportLayersFromIds( |
| 342 page_scale_layer_->id(), | 337 page_scale_layer_->id(), |
| 343 inner_viewport_scroll_layer_->id(), | 338 inner_viewport_scroll_layer_->id(), |
| 344 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() | 339 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() |
| 345 : Layer::INVALID_ID); | 340 : Layer::INVALID_ID); |
| 346 } else { | 341 } else { |
| 347 sync_tree->ClearViewportLayers(); | 342 sync_tree->ClearViewportLayers(); |
| 348 } | 343 } |
| 349 | 344 |
| 350 float page_scale_delta, sent_page_scale_delta; | 345 float page_scale_delta, sent_page_scale_delta; |
| (...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1032 | 1027 |
| 1033 in_paint_layer_contents_ = false; | 1028 in_paint_layer_contents_ = false; |
| 1034 | 1029 |
| 1035 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 1030 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
| 1036 } | 1031 } |
| 1037 | 1032 |
| 1038 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 1033 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
| 1039 if (!root_layer_.get()) | 1034 if (!root_layer_.get()) |
| 1040 return; | 1035 return; |
| 1041 | 1036 |
| 1042 gfx::Vector2d root_scroll_delta; | 1037 gfx::Vector2d inner_viewport_scroll_delta; |
| 1043 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 1038 gfx::Vector2d outer_viewport_scroll_delta; |
| 1044 | 1039 |
| 1045 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 1040 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
| 1046 Layer* layer = | 1041 Layer* layer = |
| 1047 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 1042 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
| 1048 info.scrolls[i].layer_id); | 1043 info.scrolls[i].layer_id); |
| 1049 if (!layer) | 1044 if (!layer) |
| 1050 continue; | 1045 continue; |
| 1051 if (layer == root_scroll_layer) { | 1046 if (layer == outer_viewport_scroll_layer_.get()) { |
| 1052 root_scroll_delta += info.scrolls[i].scroll_delta; | 1047 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
| 1048 } else if (layer == inner_viewport_scroll_layer_.get()) { | |
| 1049 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta; | |
| 1053 } else { | 1050 } else { |
| 1054 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 1051 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
| 1055 info.scrolls[i].scroll_delta); | 1052 info.scrolls[i].scroll_delta); |
| 1056 } | 1053 } |
| 1057 } | 1054 } |
| 1058 | 1055 |
| 1059 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { | 1056 if (!inner_viewport_scroll_delta.IsZero() || |
| 1057 !outer_viewport_scroll_delta.IsZero() || | |
| 1058 info.page_scale_delta != 1.f) { | |
| 1060 // SetScrollOffsetFromImplSide above could have destroyed the tree, | 1059 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
| 1061 // so re-get this layer before doing anything to it. | 1060 // so re-get this layer before doing anything to it. |
| 1062 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | |
| 1063 | 1061 |
| 1064 // Preemptively apply the scroll offset and scale delta here before sending | 1062 // Preemptively apply the scroll offset and scale delta here before sending |
| 1065 // it to the client. If the client comes back and sets it to the same | 1063 // it to the client. If the client comes back and sets it to the same |
| 1066 // value, then the layer can early out without needing a full commit. | 1064 // value, then the layer can early out without needing a full commit. |
| 1067 if (root_scroll_layer) { | 1065 DCHECK(inner_viewport_scroll_layer_); // We should always have this. |
| 1068 root_scroll_layer->SetScrollOffsetFromImplSide( | 1066 |
| 1069 root_scroll_layer->scroll_offset() + root_scroll_delta); | 1067 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
| 1068 inner_viewport_scroll_layer_->scroll_offset() + | |
| 1069 inner_viewport_scroll_delta); | |
| 1070 if (outer_viewport_scroll_layer_) { | |
| 1071 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | |
| 1072 outer_viewport_scroll_layer_->scroll_offset() + | |
| 1073 outer_viewport_scroll_delta); | |
| 1070 } | 1074 } |
| 1071 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); | 1075 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
| 1072 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); | 1076 |
| 1077 client_->ApplyScrollAndScale( | |
| 1078 inner_viewport_scroll_delta + outer_viewport_scroll_delta, | |
|
aelias_OOO_until_Jul13
2014/01/16 03:44:04
Blink will ultimately have to be aware of the dist
wjmaclean
2014/01/16 15:07:32
Again, it was always my understanding that people
| |
| 1079 info.page_scale_delta); | |
| 1073 } | 1080 } |
| 1074 } | 1081 } |
| 1075 | 1082 |
| 1083 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports( | |
|
aelias_OOO_until_Jul13
2014/01/16 03:44:04
As mentioned above, I don't think this function sh
wjmaclean
2014/01/16 15:07:32
Understood. Whether it remains or not will need to
| |
| 1084 const gfx::Vector2d offset, | |
| 1085 Layer* layer) { | |
| 1086 DCHECK(layer); | |
| 1087 if (layer != outer_viewport_scroll_layer_.get()) | |
| 1088 return offset; | |
| 1089 | |
| 1090 gfx::Vector2d inner_viewport_offset = | |
| 1091 inner_viewport_scroll_layer_->scroll_offset(); | |
| 1092 gfx::Vector2d outer_viewport_offset = | |
| 1093 outer_viewport_scroll_layer_->scroll_offset(); | |
| 1094 | |
| 1095 if (offset == inner_viewport_offset + outer_viewport_offset) { | |
| 1096 // In this case, nothing should change, so we just return to the outer | |
| 1097 // viewport the offset is already has. | |
| 1098 return outer_viewport_offset; | |
| 1099 } | |
| 1100 | |
| 1101 // In the spirit of document-scrolls-first, we always want any change to | |
| 1102 // go to the outer viewport first. | |
| 1103 gfx::Vector2d max_outer_viewport_scroll_offset = | |
| 1104 outer_viewport_scroll_layer_->MaxScrollOffset(); | |
| 1105 #if ENABLE_DCHECK | |
| 1106 // The DCHECK below is triggering during zoom-out. | |
| 1107 /* | |
| 1108 gfx::Vector2d maxInnerViewportScrollOffset = | |
| 1109 inner_viewport_scroll_layer_->MaxScrollOffset(); | |
| 1110 | |
| 1111 gfx::Vector2d totalMaxScrollOffset = | |
| 1112 max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset; | |
| 1113 DCHECK(totalMaxScrollOffset.x() >= offset.x() && | |
| 1114 totalMaxScrollOffset.y() >= offset.y()); | |
| 1115 */ | |
| 1116 #endif | |
| 1117 | |
| 1118 outer_viewport_offset = offset - inner_viewport_offset; | |
| 1119 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); | |
| 1120 outer_viewport_offset.SetToMax(gfx::Vector2d()); | |
| 1121 | |
| 1122 inner_viewport_offset = offset - outer_viewport_offset; | |
| 1123 inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset); | |
| 1124 | |
| 1125 return outer_viewport_offset; | |
| 1126 } | |
| 1127 | |
| 1076 void LayerTreeHost::StartRateLimiter() { | 1128 void LayerTreeHost::StartRateLimiter() { |
| 1077 if (animating_) | 1129 if (animating_) |
| 1078 return; | 1130 return; |
| 1079 | 1131 |
| 1080 if (!rate_limit_timer_.IsRunning()) { | 1132 if (!rate_limit_timer_.IsRunning()) { |
| 1081 rate_limit_timer_.Start(FROM_HERE, | 1133 rate_limit_timer_.Start(FROM_HERE, |
| 1082 base::TimeDelta(), | 1134 base::TimeDelta(), |
| 1083 this, | 1135 this, |
| 1084 &LayerTreeHost::RateLimit); | 1136 &LayerTreeHost::RateLimit); |
| 1085 } | 1137 } |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1266 swap_promise_list_.push_back(swap_promise.Pass()); | 1318 swap_promise_list_.push_back(swap_promise.Pass()); |
| 1267 } | 1319 } |
| 1268 | 1320 |
| 1269 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { | 1321 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { |
| 1270 for (size_t i = 0; i < swap_promise_list_.size(); i++) | 1322 for (size_t i = 0; i < swap_promise_list_.size(); i++) |
| 1271 swap_promise_list_[i]->DidNotSwap(reason); | 1323 swap_promise_list_[i]->DidNotSwap(reason); |
| 1272 swap_promise_list_.clear(); | 1324 swap_promise_list_.clear(); |
| 1273 } | 1325 } |
| 1274 | 1326 |
| 1275 } // namespace cc | 1327 } // namespace cc |
| OLD | NEW |