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 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
342 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( | 342 LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree( |
343 sync_tree->root_layer(), hud_layer_->id()); | 343 sync_tree->root_layer(), hud_layer_->id()); |
344 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); | 344 sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); |
345 } else { | 345 } else { |
346 sync_tree->set_hud_layer(NULL); | 346 sync_tree->set_hud_layer(NULL); |
347 } | 347 } |
348 | 348 |
349 sync_tree->set_background_color(background_color_); | 349 sync_tree->set_background_color(background_color_); |
350 sync_tree->set_has_transparent_background(has_transparent_background_); | 350 sync_tree->set_has_transparent_background(has_transparent_background_); |
351 | 351 |
352 sync_tree->FindRootScrollLayer(); | 352 if (page_scale_layer_ && inner_viewport_scroll_layer_) { |
353 | |
354 // TODO(wjmaclean) For now, not all LTH clients will register viewports, so | |
355 // only set them when available.. | |
356 if (page_scale_layer_) { | |
357 DCHECK(inner_viewport_scroll_layer_); | |
358 sync_tree->SetViewportLayersFromIds( | 353 sync_tree->SetViewportLayersFromIds( |
359 page_scale_layer_->id(), | 354 page_scale_layer_->id(), |
360 inner_viewport_scroll_layer_->id(), | 355 inner_viewport_scroll_layer_->id(), |
361 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() | 356 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() |
362 : Layer::INVALID_ID); | 357 : Layer::INVALID_ID); |
363 } else { | 358 } else { |
364 sync_tree->ClearViewportLayers(); | 359 sync_tree->ClearViewportLayers(); |
365 } | 360 } |
366 | 361 |
367 float page_scale_delta, sent_page_scale_delta; | 362 float page_scale_delta, sent_page_scale_delta; |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1051 | 1046 |
1052 in_paint_layer_contents_ = false; | 1047 in_paint_layer_contents_ = false; |
1053 | 1048 |
1054 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 1049 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
1055 } | 1050 } |
1056 | 1051 |
1057 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 1052 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
1058 if (!root_layer_.get()) | 1053 if (!root_layer_.get()) |
1059 return; | 1054 return; |
1060 | 1055 |
1061 gfx::Vector2d root_scroll_delta; | 1056 gfx::Vector2d inner_viewport_scroll_delta; |
1062 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 1057 gfx::Vector2d outer_viewport_scroll_delta; |
1063 | 1058 |
1064 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 1059 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
1065 Layer* layer = | 1060 Layer* layer = |
1066 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 1061 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
1067 info.scrolls[i].layer_id); | 1062 info.scrolls[i].layer_id); |
1068 if (!layer) | 1063 if (!layer) |
1069 continue; | 1064 continue; |
1070 if (layer == root_scroll_layer) { | 1065 if (layer == outer_viewport_scroll_layer_.get()) { |
1071 root_scroll_delta += info.scrolls[i].scroll_delta; | 1066 outer_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
1067 } else if (layer == inner_viewport_scroll_layer_.get()) { | |
1068 inner_viewport_scroll_delta += info.scrolls[i].scroll_delta; | |
1072 } else { | 1069 } else { |
1073 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 1070 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
1074 info.scrolls[i].scroll_delta); | 1071 info.scrolls[i].scroll_delta); |
1075 } | 1072 } |
1076 } | 1073 } |
1077 | 1074 |
1078 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { | 1075 if (!inner_viewport_scroll_delta.IsZero() || |
1076 !outer_viewport_scroll_delta.IsZero() || | |
1077 info.page_scale_delta != 1.f) { | |
1079 // SetScrollOffsetFromImplSide above could have destroyed the tree, | 1078 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
1080 // so re-get this layer before doing anything to it. | 1079 // so re-get this layer before doing anything to it. |
1081 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | |
1082 | 1080 |
1083 // Preemptively apply the scroll offset and scale delta here before sending | 1081 // Preemptively apply the scroll offset and scale delta here before sending |
1084 // it to the client. If the client comes back and sets it to the same | 1082 // it to the client. If the client comes back and sets it to the same |
1085 // value, then the layer can early out without needing a full commit. | 1083 // value, then the layer can early out without needing a full commit. |
1086 if (root_scroll_layer) { | 1084 DCHECK(inner_viewport_scroll_layer_); // We should always have this. |
1087 root_scroll_layer->SetScrollOffsetFromImplSide( | 1085 |
1088 root_scroll_layer->scroll_offset() + root_scroll_delta); | 1086 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
1087 inner_viewport_scroll_layer_->scroll_offset() + | |
1088 inner_viewport_scroll_delta); | |
1089 if (outer_viewport_scroll_layer_) { | |
1090 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | |
1091 outer_viewport_scroll_layer_->scroll_offset() + | |
1092 outer_viewport_scroll_delta); | |
1089 } | 1093 } |
1090 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); | 1094 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
1091 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); | 1095 |
1096 client_->ApplyScrollAndScale( | |
1097 inner_viewport_scroll_delta + outer_viewport_scroll_delta, | |
1098 info.page_scale_delta); | |
1092 } | 1099 } |
1093 } | 1100 } |
1094 | 1101 |
1102 gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports( | |
1103 const gfx::Vector2d offset, | |
1104 Layer* layer) { | |
1105 DCHECK(layer); | |
1106 if (layer != outer_viewport_scroll_layer_.get()) | |
1107 return offset; | |
1108 | |
1109 // If we get to this point, we are assured we have an outer viewport. | |
enne (OOO)
2013/11/14 22:59:01
No comment, just DCHECK.
wjmaclean
2013/12/24 21:03:49
Done.
| |
1110 gfx::Vector2d inner_viewport_offset = | |
1111 inner_viewport_scroll_layer_->scroll_offset(); | |
1112 gfx::Vector2d outer_viewport_offset = | |
1113 outer_viewport_scroll_layer_->scroll_offset(); | |
1114 | |
1115 if (offset == inner_viewport_offset + outer_viewport_offset) { | |
1116 // In this case, nothing should change, so we just return to the outer | |
1117 // viewport the offset is already has. | |
1118 return outer_viewport_offset; | |
1119 } | |
1120 | |
1121 // In the spirit of document-scrolls-first, we always want any change to | |
1122 // go to the outer viewport first. | |
1123 gfx::Vector2d max_outer_viewport_scroll_offset = | |
1124 outer_viewport_scroll_layer_->MaxScrollOffset(); | |
1125 #ifndef NDEBUG | |
1126 // The DCHECK below is triggering during zoom-out. | |
enne (OOO)
2013/11/14 22:59:01
This seems like a good thing to track down. How f
wjmaclean
2013/12/24 21:03:49
This seems to be an off-by-one (or two) type of er
enne (OOO)
2014/01/02 19:28:17
Ok. This seems pretty serious, but endless rebase
| |
1127 /* | |
1128 gfx::Vector2d maxInnerViewportScrollOffset = | |
1129 inner_viewport_scroll_layer_->MaxScrollOffset(); | |
1130 | |
1131 gfx::Vector2d totalMaxScrollOffset = | |
1132 max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset; | |
1133 DCHECK(totalMaxScrollOffset.x() >= offset.x() && | |
1134 totalMaxScrollOffset.y() >= offset.y()); | |
1135 */ | |
1136 #endif | |
1137 | |
1138 outer_viewport_offset = offset - inner_viewport_offset; | |
1139 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); | |
1140 outer_viewport_offset.SetToMax(gfx::Vector2d()); | |
1141 | |
1142 inner_viewport_offset = offset - outer_viewport_offset; | |
1143 inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset); | |
1144 | |
1145 return outer_viewport_offset; | |
1146 } | |
1147 | |
1095 void LayerTreeHost::StartRateLimiter() { | 1148 void LayerTreeHost::StartRateLimiter() { |
1096 if (animating_) | 1149 if (animating_) |
1097 return; | 1150 return; |
1098 | 1151 |
1099 if (!rate_limit_timer_.IsRunning()) { | 1152 if (!rate_limit_timer_.IsRunning()) { |
1100 rate_limit_timer_.Start(FROM_HERE, | 1153 rate_limit_timer_.Start(FROM_HERE, |
1101 base::TimeDelta(), | 1154 base::TimeDelta(), |
1102 this, | 1155 this, |
1103 &LayerTreeHost::RateLimit); | 1156 &LayerTreeHost::RateLimit); |
1104 } | 1157 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1258 | 1311 |
1259 bool LayerTreeHost::ScheduleMicroBenchmark( | 1312 bool LayerTreeHost::ScheduleMicroBenchmark( |
1260 const std::string& benchmark_name, | 1313 const std::string& benchmark_name, |
1261 scoped_ptr<base::Value> value, | 1314 scoped_ptr<base::Value> value, |
1262 const MicroBenchmark::DoneCallback& callback) { | 1315 const MicroBenchmark::DoneCallback& callback) { |
1263 return micro_benchmark_controller_.ScheduleRun( | 1316 return micro_benchmark_controller_.ScheduleRun( |
1264 benchmark_name, value.Pass(), callback); | 1317 benchmark_name, value.Pass(), callback); |
1265 } | 1318 } |
1266 | 1319 |
1267 } // namespace cc | 1320 } // namespace cc |
OLD | NEW |